[MANUAL] German:
[zend.git] / documentation / manual / de / module_specs / Zend_Translate-Using.xml
blob99084264394c00c9637f068732dff3ab308795a1
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>
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 <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.
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:
73     </para>
75     <programlisting language="php"><![CDATA[
76 $translate = new Zend_Translate(
77     array(
78         'adapter' => 'gettext',
79         'content' => '/path/to/translation/source-de.mo',
80         'locale'  => 'de'
81     )
83 ]]></programlisting>
85     <para>
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.
91     </para>
93     <para>
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
96         wie zum Beispiel:
97     </para>
99     <programlisting language="php"><![CDATA[
100 print $translate->_("Beispiel") . "\n";
101 print "========\n";
102 print $translate->_("Hier ist die Zeile Eins") . "\n";
103 ]]></programlisting>
105     <para>
106         Einige Strings müssen nicht übersetzt werden. Die Trennlinie wird immer eine Trennlinie
107         sein, auch in den anderen Sprachen.
108     </para>
110     <para>
111         Die Verwendung von variablen Werten in einer Übersetzung wird durch die Verwendung
112         von eingebetteten Parametern auch unterstützt.
113     </para>
115     <programlisting language="php"><![CDATA[
116 printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
117 ]]></programlisting>
119     <para>
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.
126     </para>
128     <para>
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:
131     </para>
133     <programlisting language="php"><![CDATA[
134 print $translate->_(1) . "\n";
135 print "=======\n";
136 print $translate->_(2) . "\n";
137 ]]></programlisting>
139     <para>
140         Allerdings hat dies mehrere Nachteile:
141     </para>
143     <para>
144         Es ist nicht erkennbar, was der Code ausgeben sollte, wenn man ihn betrachtet.
145     </para>
147     <para>
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.
159     </para>
161     <sect2 id="zend.translate.using.structure">
162         <title>Strukturen für Übersetzungdateien</title>
164         <para>
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.
169         </para>
171         <para>
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:
175         </para>
177         <itemizedlist>
178             <listitem>
179                 <para>Einzeln strukturierte Quellen</para>
181                 <programlisting language="txt"><![CDATA[
182 /application/
183 /languages/
184 /languages/lang.en
185 /languages/lang.de
186 /library/
187 ]]></programlisting>
189                 <para>
190                     Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
191                     Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
192                 </para>
193             </listitem>
195             <listitem>
196                 <para>Sprachlich stukturierte Quellen</para>
198                 <programlisting language="txt"><![CDATA[
199 /application/
200 /languages/
201 /languages/en/
202 /languages/en/first.en
203 /languages/en/second.en
204 /languages/de/
205 /languages/de/first.de
206 /languages/de/second.de
207 /library/
208 ]]></programlisting>
210                 <para>
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
214                     transparent.
215                 </para>
216             </listitem>
218             <listitem>
219                 <para>Anwendungsstrukturierte Quellen</para>
221                 <programlisting language="txt"><![CDATA[
222 /application/
223 /application/languages/
224 /application/languages/first.en
225 /application/languages/first.de
226 /application/languages/second.en
227 /application/languages/second.de
228 /library/
229 ]]></programlisting>
231                 <para>
232                     Positiv: Alle Quelldateien, für jede Sprache, werden in einem einzelnen
233                     Verzeichnis gespeichert. Keine Aufteilung der betreffenden Dateien.
234                 </para>
236                 <para>
237                     Negativ: Die Benutzung von mehreren Dateien für dieselbe Sprache kann
238                     problematisch sein.
239                 </para>
240             </listitem>
242             <listitem>
243                 <para>Gettext strukturierte Quellen</para>
245                 <programlisting language="txt"><![CDATA[
246 /application/
247 /languages/
248 /languages/de/
249 /languages/de/LC_MESSAGES/
250 /languages/de/LC_MESSAGES/first.mo
251 /languages/de/LC_MESSAGES/second.mo
252 /languages/en/
253 /languages/en/LC_MESSAGES/
254 /languages/en/LC_MESSAGES/first.mo
255 /languages/en/LC_MESSAGES/second.mo
256 /library/
257 ]]></programlisting>
259                 <para>
260                     Positiv: Bestehende Gettext-Quellen können ohne Veränderung der Struktur
261                     benutzt werden.
262                 </para>
264                 <para>
265                     Negativ: Die Benutzung von Unterunterverzeichnissen ist für Personen verwirrend,
266                     die Gettext noch nie benutzt haben.
267                 </para>
268             </listitem>
270             <listitem>
271                 <para>Datei strukturierte Quellen</para>
273                 <programlisting language="txt"><![CDATA[
274 /application/
275 /application/models/
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
283 /library/
284 ]]></programlisting>
286                 <para>
287                     Positiv: Übersetzungsdateien sind in der Nähe ihrer Quelle zu finden.
288                 </para>
290                 <para>
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.
294                 </para>
295             </listitem>
296         </itemizedlist>
298         <para>
299             Einzeln strukturierte und sprachlich strukturierte Quelldateien sind
300             für <classname>Zend_Translate</classname> am besten benutzbar.
301         </para>
303         <para>
304             Da jetzt bekannt ist, welche Struktur verwendet wird,
305             sollten nun die einzelnen Übersetzungsdateien erstellt werden.
306         </para>
307     </sect2>
308 </sect1>