1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21829 -->
3 <!-- Reviewed: 21829 -->
4 <sect1 id="zend.translate.using">
5 <title>Verwendung der Übersetzungsadapter</title>
8 Der nächste Schritt ist die Benutzung des Adapters im eigenen Code.
11 <example id="zend.translate.using.example1">
12 <title>Beispiel eines einsprachigen PHP Codes</title>
14 <programlisting language="php"><![CDATA[
17 print "Hier steht Zeile eins\n";
18 print "Heute ist der " . date("d.m.Y") . "\n";
20 print "Hier ist Zeile zwei\n";
25 Das obige Beispiel zeigt eine Ausgabe ohne Unterstützung für Übersetzungen. Der Code wird
26 üblicherweise in der eigenen Muttersprache geschrieben. Üblicherweise muß nicht nur die
27 Ausgabe übersetzt werden, sondern auch Fehler- und Logmeldungen.
31 Der nächste Schritt ist also die Integration von <classname>Zend_Translate</classname> in
32 den eigenen Code. Natürlich ist es viel einfacher, wenn bei der Erstellung des Codes bereits
33 an die Übersetzung gedacht wurde, anstatt ihn im Nachhinein dafür zu ändern.
36 <example id="zend.translate.using.example2">
37 <title>Beispiel für mehrsprachigen PHP Code</title>
39 <programlisting language="php"><![CDATA[
40 $translate = new Zend_Translate(
42 'adapter' => 'gettext',
43 'content' => '/path/to/translation/source-de.mo',
47 $translate->addTranslation(
49 'content' => '//my/path/fr-source.mo',
54 print $translate->_("Beispiel") . "\n";
56 print $translate->_("Hier steht Zeile eins") . "\n";
57 printf($translate->_("Heute ist der %1\$s") . "\n", date('d.m.Y'));
60 $translate->setLocale('fr');
61 print $translate->_("Hier ist Zeile zwei") . "\n";
66 Jetzt schauen wir uns genauer an, was getan wurde und wie
67 <classname>Zend_Translate</classname> in den eigenen Code integriert wird.
71 Erstelle ein neues <classname>Zend_Translate</classname> Objekt und definiere den
75 <programlisting language="php"><![CDATA[
76 $translate = new Zend_Translate(
78 'adapter' => 'gettext',
79 'content' => '/path/to/translation/source-de.mo',
86 In diesem Beispiel haben wir den <emphasis>Gettext-Adapter</emphasis>
87 ausgewählt. Die Übersetzungsdatei <emphasis>source-de.mo</emphasis> wird im
88 Verzeichnis <emphasis>/path/to/translation</emphasis> platziert. Diese
89 Gettext-Datei beinhaltet eine deutsche Übersetzung und es steht auch eine zweite
90 Sprachquelle für Französisch zur Verfügung.
94 Der nächste Schritt besteht darin, alle Strings zu ummanteln, die übersetzt werden sollen.
95 Die einfachste Möglichkeit besteht, wenn nur einfache Strings oder Sätze vorhanden sind
99 <programlisting language="php"><![CDATA[
100 print $translate->_("Beispiel") . "\n";
102 print $translate->_("Hier ist die Zeile Eins") . "\n";
106 Einige Strings müssen nicht übersetzt werden. Die Trennlinie wird immer eine Trennlinie
107 sein, auch in den anderen Sprachen.
111 Die Verwendung von variablen Werten in einer Übersetzung wird durch die Verwendung
112 von eingebetteten Parametern auch unterstützt.
115 <programlisting language="php"><![CDATA[
116 printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
120 Statt <methodname>print()</methodname> wird die <methodname>printf()</methodname> Funktion
121 benutzt und alle variablen Parameter mit <code>%1\$s</code> Blöcken ersetzt.
122 Der erste ist <code>%1\$s</code>, der zweite ist <code>%2\$s</code>, und so weiter.
123 Auf diesen Weg kann übersetzt werden, ohne den exakten Wert zu wissen. In unserem
124 Beispiel ist das Datum immer der aktuelle Tag, aber der String kann übersetzt
125 werden, ohne über den aktuellen Tag Bescheid zu wissen.
129 Jeder String wird im Übersetzungsspeicher durch seine Message ID identifiziert.
130 Man könnte diese Message IDs statt des Strings im Code wie folgt verwenden:
133 <programlisting language="php"><![CDATA[
134 print $translate->_(1) . "\n";
136 print $translate->_(2) . "\n";
140 Allerdings hat dies mehrere Nachteile:
144 Es ist nicht erkennbar, was der Code ausgeben sollte, wenn man ihn betrachtet.
148 Es werden auch Probleme auftreten, wenn einige Strings nicht übersetzt worden sind. Man muß
149 sich immer vor Augen halten, wie Übersetzungen funktionieren. Zuerst prüft
150 <classname>Zend_Translate</classname> ob in der gesetzten Sprache für die angegebene
151 Message ID oder den String eine Übersetzung vorhanden ist. Wenn keine Übersetzung gefunden
152 wurde, wird in der nächsten tiefer gelegenen Sprache gesucht wie in
153 <classname>Zend_Locale</classname> definiert. "<emphasis>de_AT</emphasis>" wird also zu
154 "<emphasis>de</emphasis>". Wenn auch hier keine Übersetzung in der Sprache
155 "<emphasis>de</emphasis>" gefunden wurde, wird der Original-String zurück
156 gegeben. Das bedeutet also, dass immer eine Ausgabe existiert, selbst wenn für eine Message
157 ID keine Übersetzung in der Quelle vorhanden ist. <classname>Zend_Translate</classname> wird
158 niemals eine Exception oder einen Fehler ausgeben, wenn ein String übersetzt werden soll.
161 <sect2 id="zend.translate.using.structure">
162 <title>Strukturen für Übersetzungdateien</title>
165 Der nächste Schritt besteht in der Erstellung der Übersetzungsdateien für die
166 verschiedenen Sprachen, welche übersetzt werden sollen. Jeder Adapter wird,
167 wie hier beschrieben, auf seine eigene Weise erstellt, aber es gibt ein
168 paar allgemeine Features, die für alle Adapter relevant sind.
172 Zuerst muß entschieden werden, wo die Übersetzungsdateien zu speichern sind. Bei der
173 Verwendung von <classname>Zend_Translate</classname> gibt es keinerlei Einschränkungen.
174 Die folgenden Strukturen sind vorzuziehen:
179 <para>Einzeln strukturierte Quellen</para>
181 <programlisting language="txt"><![CDATA[
190 Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
191 Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
196 <para>Sprachlich stukturierte Quellen</para>
198 <programlisting language="txt"><![CDATA[
202 /languages/en/first.en
203 /languages/en/second.en
205 /languages/de/first.de
206 /languages/de/second.de
211 Positiv: Jede Sprache wird in ihrem eigenen Verzeichnis gespeichert. Einfache
212 Übersetzung, da jedes Übersetzungsteam nur ein einzelnes Verzeichnis zu
213 übersetzen hat. Auch die Verwendung von mehreren Dateien ist
219 <para>Anwendungsstrukturierte Quellen</para>
221 <programlisting language="txt"><![CDATA[
223 /application/languages/
224 /application/languages/first.en
225 /application/languages/first.de
226 /application/languages/second.en
227 /application/languages/second.de
232 Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
233 Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
237 Negativ: Die Benutzung von mehreren Dateien für dieselbe Sprache kann
243 <para>Gettext strukturierte Quellen</para>
245 <programlisting language="txt"><![CDATA[
249 /languages/de/LC_MESSAGES/
250 /languages/de/LC_MESSAGES/first.mo
251 /languages/de/LC_MESSAGES/second.mo
253 /languages/en/LC_MESSAGES/
254 /languages/en/LC_MESSAGES/first.mo
255 /languages/en/LC_MESSAGES/second.mo
260 Positiv: Bestehende Gettext-Quellen können ohne Veränderung der Struktur
265 Negativ: Die Benutzung von Unterunterverzeichnissen ist für Personen verwirrend,
266 die Gettext noch nie benutzt haben.
271 <para>Datei strukturierte Quellen</para>
273 <programlisting language="txt"><![CDATA[
276 /application/models/MyModel.php
277 /application/models/MyModel.de
278 /application/models/MyModel.en
279 /application/controllers/
280 /application/controllers/MyController.php
281 /application/controllers/MyController.de
282 /application/controllers/MyController.en
287 Positiv: Übersetzungsdateien sind in der Nähe ihrer Quelle zu finden.
291 Negativ: Zu viele und auch kleine Übersetzungsdateien führen zu einer
292 schwierigen und langwierigen Übersetzung. Es muß auch jede Datei als
293 Übersetzungsquelle hinzugefügt werden.
299 Einzeln strukturierte und sprachlich strukturierte Quelldateien sind
300 für <classname>Zend_Translate</classname> am besten benutzbar.
304 Da jetzt bekannt ist, welche Struktur verwendet wird,
305 sollten nun die einzelnen Übersetzungsdateien erstellt werden.