1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21661 -->
3 <!-- Reviewed: 21661 -->
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 Zend_Translate in den eigenen Code.
32 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
74 <programlisting language="php"><![CDATA[
75 $translate = new Zend_Translate(
77 'adapter' => 'gettext',
78 'content' => '/path/to/translation/source-de.mo',
84 In diesem Beispiel haben wir den <emphasis>Gettext-Adapter</emphasis>
85 ausgewählt. Die Übersetzungsdatei <emphasis>source-de.mo</emphasis> wird im
86 Verzeichnis <emphasis>/path/to/translation</emphasis> platziert. Diese
87 Gettext-Datei beinhaltet eine deutsche Übersetzung und es steht auch eine zweite
88 Sprachquelle für Französisch zur Verfügung.
92 Der nächste Schritt besteht darin, alle Strings zu ummanteln, die übersetzt werden sollen.
93 Die einfachste Möglichkeit besteht, wenn nur einfache Strings oder Sätze vorhanden sind
96 <programlisting language="php"><![CDATA[
97 print $translate->_("Beispiel") . "\n";
99 print $translate->_("Hier ist die Zeile Eins") . "\n";
102 Einige Strings müssen nicht übersetzt werden. Die Trennlinie wird immer eine Trennlinie
103 sein, auch in den anderen Sprachen.
107 Die Verwendung von variablen Werten in einer Übersetzung wird durch die Verwendung
108 von eingebetteten Parametern auch unterstützt.
110 <programlisting language="php"><![CDATA[
111 printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
114 Statt <methodname>print()</methodname> wird die <methodname>printf()</methodname> Funktion
115 benutzt und alle variablen Parameter mit <code>%1\$s</code> Blöcken ersetzt.
116 Der erste ist <code>%1\$s</code>, der zweite ist <code>%2\$s</code>, und so weiter.
117 Auf diesen Weg kann übersetzt werden, ohne den exakten Wert zu wissen. In unserem
118 Beispiel ist das Datum immer der aktuelle Tag, aber der String kann übersetzt
119 werden, ohne über den aktuellen Tag Bescheid zu wissen.
123 Jeder String wird im Übersetzungsspeicher durch seine Message ID identifiziert.
124 Man könnte diese Message IDs statt des Strings im Code wie folgt verwenden:
126 <programlisting language="php"><![CDATA[
127 print $translate->_(1) . "\n";
129 print $translate->_(2) . "\n";
132 Allerdings hat dies mehrere Nachteile:
136 Es ist nicht erkennbar, was der Code ausgeben sollte, wenn man ihn betrachtet.
140 Es werden auch Probleme auftreten, wenn einige Strings nicht übersetzt worden sind. Man muß
141 sich immer vor Augen halten, wie Übersetzungen funktionieren. Zuerst prüft
142 <classname>Zend_Translate</classname> ob in der gesetzten Sprache für die angegebene
143 Message ID oder den String eine Übersetzung vorhanden ist. Wenn keine Übersetzung gefunden
144 wurde, wird in der nächsten tiefer gelegenen Sprache gesucht wie in
145 <classname>Zend_Locale</classname> definiert. "<emphasis>de_AT</emphasis>" wird also zu
146 "<emphasis>de</emphasis>". Wenn auch hier keine Übersetzung in der Sprache
147 "<emphasis>de</emphasis>" gefunden wurde, wird der Original-String zurück
148 gegeben. Das bedeutet also, dass immer eine Ausgabe existiert, selbst wenn für eine Message
149 ID keine Übersetzung in der Quelle vorhanden ist. <classname>Zend_Translate</classname> wird
150 niemals eine Exception oder einen Fehler ausgeben, wenn ein String übersetzt werden soll.
153 <sect2 id="zend.translate.using.structure">
154 <title>Strukturen für Übersetzungdateien</title>
157 Der nächste Schritt besteht in der Erstellung der Übersetzungsdateien für die
158 verschiedenen Sprachen, welche übersetzt werden sollen. Jeder Adapter wird,
159 wie hier beschrieben, auf seine eigene Weise erstellt, aber es gibt ein
160 paar allgemeine Features, die für alle Adapter relevant sind.
164 Zuerst muß entschieden werden, wo die Übersetzungsdateien zu speichern sind. Bei der
165 Verwendung von <classname>Zend_Translate</classname> gibt es keinerlei Einschränkungen.
166 Die folgenden Strukturen sind vorzuziehen:
171 <para>Einzeln strukturierte Quellen</para>
173 <programlisting language="txt"><![CDATA[
182 Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
183 Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
188 <para>Sprachlich stukturierte Quellen</para>
190 <programlisting language="txt"><![CDATA[
194 /languages/en/first.en
195 /languages/en/second.en
197 /languages/de/first.de
198 /languages/de/second.de
203 Positiv: Jede Sprache wird in ihrem eigenen Verzeichnis gespeichert. Einfache
204 Übersetzung, da jedes Übersetzungsteam nur ein einzelnes Verzeichnis zu
205 übersetzen hat. Auch die Verwendung von mehreren Dateien ist
211 <para>Anwendungsstrukturierte Quellen</para>
213 <programlisting language="txt"><![CDATA[
215 /application/languages/
216 /application/languages/first.en
217 /application/languages/first.de
218 /application/languages/second.en
219 /application/languages/second.de
224 Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
225 Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
229 Negativ: Die Benutzung von mehreren Dateien für dieselbe Sprache kann
235 <para>Gettext strukturierte Quellen</para>
237 <programlisting language="txt"><![CDATA[
241 /languages/de/LC_MESSAGES/
242 /languages/de/LC_MESSAGES/first.mo
243 /languages/de/LC_MESSAGES/second.mo
245 /languages/en/LC_MESSAGES/
246 /languages/en/LC_MESSAGES/first.mo
247 /languages/en/LC_MESSAGES/second.mo
252 Positiv: Bestehende Gettext-Quellen können ohne Veränderung der Struktur
257 Negativ: Die Benutzung von Unterunterverzeichnissen ist für Personen verwirrend,
258 die Gettext noch nie benutzt haben.
263 <para>Datei strukturierte Quellen</para>
265 <programlisting language="txt"><![CDATA[
268 /application/models/MyModel.php
269 /application/models/MyModel.de
270 /application/models/MyModel.en
271 /application/controllers/
272 /application/controllers/MyController.php
273 /application/controllers/MyController.de
274 /application/controllers/MyController.en
279 Positiv: Übersetzungsdateien sind in der Nähe ihrer Quelle zu finden.
283 Negativ: Zu viele und auch kleine Übersetzungsdateien führen zu einer
284 schwierigen und langwierigen Übersetzung. Es muß auch jede Datei als
285 Übersetzungsquelle hinzugefügt werden.
291 Einzeln strukturierte und sprachlich strukturierte Quelldateien sind
292 für <classname>Zend_Translate</classname> am besten benutzbar.
296 Da jetzt bekannt ist, welche Struktur verwendet wird,
297 sollten nun die einzelnen Übersetzungsdateien erstellt werden.