[MANUAL] German:
[zend.git] / documentation / manual / de / module_specs / Zend_Translate-Using.xml
blob923de83efae25c4b381a6cfda88c4c3d35716235
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>
7     <para>
8         Der nächste Schritt ist die Benutzung des Adapters im eigenen Code.
9     </para>
11     <example id="zend.translate.using.example1">
12         <title>Beispiel eines einsprachigen PHP Codes</title>
14         <programlisting language="php"><![CDATA[
15 print "Beispiel\n";
16 print "========\n";
17 print "Hier steht Zeile eins\n";
18 print "Heute ist der " . date("d.m.Y") . "\n";
19 print "\n";
20 print "Hier ist Zeile zwei\n";
21 ]]></programlisting>
22     </example>
24     <para>
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.
28     </para>
30     <para>
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.
34     </para>
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(
41     array(
42         'adapter' => 'gettext',
43         'content' => '/path/to/translation/source-de.mo',
44         'locale'  => 'de'
45     )
47 $translate->addTranslation(
48     array(
49         'content' => '//my/path/fr-source.mo',
50         'locale   => 'fr'
51     )
54 print $translate->_("Beispiel") . "\n";
55 print "========\n";
56 print $translate->_("Hier steht Zeile eins") . "\n";
57 printf($translate->_("Heute ist der %1\$s") . "\n", date('d.m.Y'));
58 print "\n";
60 $translate->setLocale('fr');
61 print $translate->_("Hier ist Zeile zwei") . "\n";
62 ]]></programlisting>
63     </example>
65     <para>
66         Jetzt schauen wir uns genauer an, was getan wurde und wie
67         <classname>Zend_Translate</classname> in den eigenen Code integriert wird.
68     </para>
70     <para>
71         Erstelle ein neues <classname>Zend_Translate</classname> Objekt und definiere den
72         Basisadapter:
74         <programlisting language="php"><![CDATA[
75 $translate = new Zend_Translate(
76     array(
77         'adapter' => 'gettext',
78         'content' => '/path/to/translation/source-de.mo',
79         'locale'  => 'de'
80     )
82 ]]></programlisting>
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.
89     </para>
91     <para>
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
94         wie zum Beispiel:
96         <programlisting language="php"><![CDATA[
97 print $translate->_("Beispiel") . "\n";
98 print "========\n";
99 print $translate->_("Hier ist die Zeile Eins") . "\n";
100 ]]></programlisting>
102         Einige Strings müssen nicht übersetzt werden. Die Trennlinie wird immer eine Trennlinie
103         sein, auch in den anderen Sprachen.
104     </para>
106     <para>
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"));
112 ]]></programlisting>
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.
120     </para>
122     <para>
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";
128 print "=======\n";
129 print $translate->_(2) . "\n";
130 ]]></programlisting>
132         Allerdings hat dies mehrere Nachteile:
133     </para>
135     <para>
136         Es ist nicht erkennbar, was der Code ausgeben sollte, wenn man ihn betrachtet.
137     </para>
139     <para>
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.
151     </para>
153     <sect2 id="zend.translate.using.structure">
154         <title>Strukturen für Übersetzungdateien</title>
156         <para>
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.
161         </para>
163         <para>
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:
167         </para>
169         <itemizedlist>
170             <listitem>
171                 <para>Einzeln strukturierte Quellen</para>
173                 <programlisting language="txt"><![CDATA[
174 /application/
175 /languages/
176 /languages/lang.en
177 /languages/lang.de
178 /library/
179 ]]></programlisting>
181                 <para>
182                     Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
183                     Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
184                 </para>
185             </listitem>
187             <listitem>
188                 <para>Sprachlich stukturierte Quellen</para>
190                 <programlisting language="txt"><![CDATA[
191 /application/
192 /languages/
193 /languages/en/
194 /languages/en/first.en
195 /languages/en/second.en
196 /languages/de/
197 /languages/de/first.de
198 /languages/de/second.de
199 /library/
200 ]]></programlisting>
202                 <para>
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
206                     transparent.
207                 </para>
208             </listitem>
210             <listitem>
211                 <para>Anwendungsstrukturierte Quellen</para>
213                 <programlisting language="txt"><![CDATA[
214 /application/
215 /application/languages/
216 /application/languages/first.en
217 /application/languages/first.de
218 /application/languages/second.en
219 /application/languages/second.de
220 /library/
221 ]]></programlisting>
223                 <para>
224                     Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
225                     Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
226                 </para>
228                 <para>
229                     Negativ: Die Benutzung von mehreren Dateien für dieselbe Sprache kann
230                     problematisch sein.
231                 </para>
232             </listitem>
234             <listitem>
235                 <para>Gettext strukturierte Quellen</para>
237                 <programlisting language="txt"><![CDATA[
238 /application/
239 /languages/
240 /languages/de/
241 /languages/de/LC_MESSAGES/
242 /languages/de/LC_MESSAGES/first.mo
243 /languages/de/LC_MESSAGES/second.mo
244 /languages/en/
245 /languages/en/LC_MESSAGES/
246 /languages/en/LC_MESSAGES/first.mo
247 /languages/en/LC_MESSAGES/second.mo
248 /library/
249 ]]></programlisting>
251                 <para>
252                     Positiv: Bestehende Gettext-Quellen können ohne Veränderung der Struktur
253                     benutzt werden.
254                 </para>
256                 <para>
257                     Negativ: Die Benutzung von Unterunterverzeichnissen ist für Personen verwirrend,
258                     die Gettext noch nie benutzt haben.
259                 </para>
260             </listitem>
262             <listitem>
263                 <para>Datei strukturierte Quellen</para>
265                 <programlisting language="txt"><![CDATA[
266 /application/
267 /application/models/
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
275 /library/
276 ]]></programlisting>
278                 <para>
279                     Positiv: Übersetzungsdateien sind in der Nähe ihrer Quelle zu finden.
280                 </para>
282                 <para>
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.
286                 </para>
287             </listitem>
288         </itemizedlist>
290         <para>
291             Einzeln strukturierte und sprachlich strukturierte Quelldateien sind
292             für <classname>Zend_Translate</classname> am besten benutzbar.
293         </para>
295         <para>
296             Da jetzt bekannt ist, welche Struktur verwendet wird,
297             sollten nun die einzelnen Übersetzungsdateien erstellt werden.
298         </para>
299     </sect2>
300 </sect1>