1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: 22760 -->
<sect1 id="zend.translate.plurals">
<title>Schreibweisen von Pluralformen für Übersetzungen</title>
<para>
Ab Zend Framework 1.9 ist <classname>Zend_Translate</classname> in der Lage, Unterstützung
für Pluralformen anzubieten. Professionelle Übersetzung wird immer die Notwendigkeit haben,
den Plural zu verwenden, da dieser in allen Sprachen gängig ist.
</para>
<para>
Was sind Pluralformen? Im Allgemeinen sind Wörter im Plural Wörter, die eine numerische
Bedeutung haben. Wie man sich sicher vorstellen kann, hat jede Sprache ihre eigene
Definition von Pluralformen. Im Englischen gibt es einen einzigen Plural. Es gibt einen
Singular, zum Beispiel "Car", was implizit ein Auto bedeutet. Und es gibt
den Plural "Cars", welcher mehr als ein Auto aber auch null Autos bedeuten kann.
Andere Sprachen wie russisch oder polnisch haben mehrere Pluralformen und auch die Regeln für
die Pluralformen sind unterschiedlich.
</para>
<para>
Wenn man Pluralformen mit <classname>Zend_Translate</classname> verwenden will, muß man nicht
wissen, wie Pluralformen definiert werden. Nur der Übersetzer muß das wissen, da er die
Übersetzung durchführt. Die einzige Information, die man haben muß, ist die Sprache.
</para>
<para>
Es gibt zwei Wege für die Verwendung von Pluralformen: den traditionellen, der bedeutet, dass
man eine eigene Methode verwendet, und einen modernen, der es erlaubt, Übersetzungen im Plural
mit der gleichen Methode durchzuführen wie normale Übersetzungen.
</para>
<sect2 id="zend.translate.plurals.traditional">
<title>Traditionelle Übersetzung des Plurals</title>
<para>
Personen, die in der Vergangenheit mit Gettext gearbeitet haben, werden mit
traditionellen Pluralübersetzungen besser zurechtkommen. Es gibt eine eigene
Methode <methodname>plural()</methodname>, die für Übersetzungen des Plurals verwendet
werden kann.
</para>
<example id="zend.translate.plurals.traditional.example1">
<title>Beispiel einer traditionellen Übersetzung des Plurals</title>
<para>
Die Methode <methodname>plural()</methodname> akzeptiert 4 Parameter. Der erste
Parameter ist die messageId des Singular, der zweite ist die messageId des Plural und
der dritte ist die Zahl oder Menge.
</para>
<para>
Die Zahl wird verwendet, um den Plural zu erkennen, der zurückzugeben ist. Als
optionaler vierter Parameter kann ein Gebietsschema angegeben werden, das verwendet
wird, um die Übersetzung zurückzugeben.
</para>
<programlisting language="php"><![CDATA[
$translate = new Zend_Translate(
array(
'adapter' => 'gettext',
'content' => '/path/to/german.mo',
'locale' => 'de'
)
);
$translate->plural('Car', 'Cars', $number);
]]></programlisting>
</example>
</sect2>
<sect2 id="zend.translate.plurals.modern">
<title>Moderne Übersetzungen des Plurals</title>
<para>
Da traditionelle Übersetzungen des Plurals begrenzt ist auf Quellcode, der die englische
Pluralform verwendet, wurde ein neuer Weg für Übersetzungen des Plurals hinzugefügt.
Er erlaubt es, die gleiche <methodname>translate()</methodname> Methode für normale und
Pluralübersetzungen zu verwenden.
</para>
<para>
Um Plural-Übersetzungen mit <methodname>translate()</methodname> zu verwenden, muß man
statt einem String ein Array als messageId angeben. Dieses Array muß die originalen
messageId's der Plurale enthalten, dann die Anzahl und als letztes ein optionales
Gebietsschema, wenn die angegebenen messageId's nicht in englischer Schreibweise
vorliegen.
</para>
<example id="zend.translate.plurals.modern.example1">
<title>Beispiel für moderne Übersetzungen des Plurals</title>
<para>
Wenn wir dieselben Pluraldefinitionen übersetzen wollen wie vorher, dann müsste
unser Beispiel wie folgt aussehen.
</para>
<programlisting language="php"><![CDATA[
$translate = new Zend_Translate(
array(
'adapter' => 'gettext',
'content' => '/path/to/german.mo',
'locale' => 'de'
)
);
$translate->translate(array('Car', 'Cars', $number));
]]></programlisting>
</example>
<para>
Bei der Verwendung von Pluralübersetzungen ist es auch möglich, jede Sprache als
Quelle für messageId's zu verwenden.
</para>
<example id="zend.translate.plurals.modern.example2">
<title>
Beispiel einer modernen Übersetzung des Plurals durch Verwendung einer anderen
Quellsprache
</title>
<para>
Nehmen wir an, wir wollen russisch verwenden und nehmen wir außerdem an, dass die
gegebenen messageId's russisch und nicht englisch sind.
</para>
<programlisting language="php"><![CDATA[
$translate = new Zend_Translate(
array(
'adapter' => 'gettext',
'content' => '/path/to/german.mo',
'locale' => 'de'
)
);
$translate->translate(array('Car',
'Cars first plural',
'Cars second plural',
$number,
'ru'));
]]></programlisting>
</example>
<para>
Wie man sieht, kann man mehr als ein englisches Plural angeben. Aber dann muß man die
Quellsprache angeben, damit <classname>Zend_Translate</classname> in diesem Fall weiß,
welche Pluralregeln anzuwenden sind.
</para>
<para>
Wenn man die Pluralsprache nicht angibt, dann wird standardmäßig englisch verwendet
und jede zusätzliche Pluraldefinition wird ignoriert.
</para>
</sect2>
<sect2 id="zend.translate.plurals.source">
<title>Pluralquelldateien</title>
<para>
Nicht alle Quellformate unterstützen Pluralformen. Sehen Sie sich für Details diese
Liste an:
</para>
<table id="zend.translate.plurals.source.supportedadapters">
<title>Unterstützung für Plural</title>
<tgroup cols="4">
<thead>
<row>
<entry>Adapter</entry>
<entry>Plural unterstützt</entry>
</row>
</thead>
<tbody>
<row>
<entry>Array</entry>
<entry><emphasis>Ja</emphasis></entry>
</row>
<row>
<entry>Csv</entry>
<entry><emphasis>Ja</emphasis></entry>
</row>
<row>
<entry>Gettext</entry>
<entry><emphasis>Ja</emphasis></entry>
</row>
<row>
<entry>Ini</entry>
<entry><emphasis>Nein</emphasis></entry>
</row>
<row>
<entry>Qt</entry>
<entry><emphasis>Nein</emphasis></entry>
</row>
<row>
<entry>Tbx</entry>
<entry><emphasis>Nein</emphasis></entry>
</row>
<row>
<entry>Tmx</entry>
<entry><emphasis>Nein</emphasis></entry>
</row>
<row>
<entry>Xliff</entry>
<entry><emphasis>Nein</emphasis></entry>
</row>
<row>
<entry>XmlTm</entry>
<entry><emphasis>Nein</emphasis></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Im folgenden sind Beispiele für die Definition von Pluralquelldateien zu finden.
</para>
<sect3 id="zend.translate.plurals.source.array">
<title>Array-Quellen mit Pluraldefinitionen</title>
<para>
Ein Array mit Pluraldefinitionen hat wie im folgenden Beispiel auszusehen.
</para>
<programlisting language="php"><![CDATA[
array(
'plural_0' => array(
'plural_0 (ru)',
'plural_1 (ru)',
'plural_2 (ru)',
'plural_3 (ru)'
),
'plural_1' => ''
);
]]></programlisting>
<para>
Im obigen Beispiel sind 'plural_0' und 'plural_1' die
Pluraldefinitionen des Quellcodes. Und im Array 'plural_0'
sind alle übersetzten Pluralformen verfügbar. Sehen Sie sich das folgende
Beispiel an, das tatsächlichen Inhalt und die Übersetzung von einer englischen Quelle
ins Deutsche beinhaltet.
</para>
<programlisting language="php"><![CDATA[
array(
'Car' => array(
'Auto',
'Autos'
),
'Cars' => ''
);
]]></programlisting>
<para>
Wenn die eigene übersetzte Sprache mehr Pluralformen unterstützt, müssen diese
einfach an das Array der ersten Pluralform angehängt werden. Wenn die eigene
Quellsprache mehr Pluralformen unterstützt, dann muß einfach eine neue leere
Übersetzung hinzugefügt werden.
</para>
</sect3>
<sect3 id="zend.translate.plurals.source.csv">
<title>CSV-Quellen mit Pluraldefinitionen</title>
<para>
Eine CSV-Datei mit Pluraldefinitionen muß wie im folgenden Beispiel
aussehen.
</para>
<programlisting language="php"><![CDATA[
"plural_0";"plural_0 (ru)";"plural_1 (ru)";"plural_2 (ru)";"plural_3 (ru)"
"plural_1";
]]></programlisting>
<para>
Alle übersetzten Pluralformen müssen nach dem ersten Plural der Quellsprache
hinzugefügt werden. Und alle weiteren Pluralformen der Quellsprache müssen
darunter ohne Übersetzung hinzugefügt werden. Es ist zu beachten, dass ein
Trennzeichen bei den leeren Quellpluralformen hinzugefügt werden muß.
</para>
</sect3>
<sect3 id="zend.translate.plurals.source.gettext">
<title>Gettext-Quellen mit Pluraldefinitionen</title>
<para>
Gettext-Quellen unterstützen Pluralformen von Haus aus. Es gibt keine
Notwendigkeit Anpassungen durchzuführen, da die <filename>*.mo</filename> Datei
alle notwendigen Daten enthält.
</para>
<note>
<para>
Es ist zu beachten, dass Gettext die Verwendung von Quellsprachen, welche keine
englischen Pluralformen verwenden, nicht unterstützt. Wenn man plant
Quellsprachen zu verwenden, welche andere Pluralformen unterstützt, wie zum
Beispiel russisch, dann kann man Gettext nicht als Quelle verwenden.
</para>
</note>
</sect3>
</sect2>
<sect2 id="zend.translate.plurals.customrules">
<title>Eigene Pluralregeln</title>
<para>
In seltenen Fällen kann es nützlich sein, wenn man in der Lage ist eigene Pluralregeln
zu definieren. Chinesisch zum Beispiel. Diese Sprache definiert zwei Pluralregeln.
Standardmäßig verwendet Sie kein Plural. Aber in seltenen Fällen wird eine Regel wie
diese verwendet: <emphasis>(number == 1) ? 0 : 1</emphasis>.
</para>
<para>
Auch wenn man eine Sprache verwenden will, die keine bekannten Plural Regeln hat und
man eigene Regeln definieren will.
</para>
<para>
Das kann durch Verwendung von <methodname>Zend_Translate_Plural::setRule()</methodname>
getan werden. Diese Methode erwartet zwei Parameter, welche angegeben werden müssen. Eine
Regel, welche einfach ein Callback zu einer selbst definierten Methode ist. Und ein
Gebietsschema für das diese Regel verwendet wird.
</para>
<para>
Die eigene Regel könnte wie folgt aussehen:
</para>
<programlisting language="php"><![CDATA[
public function MyRule($number) {
return ($number == 10) ? 0 : 1;
}
]]></programlisting>
<para>
Wie man sieht muss die eigene Regel einen Parameter akzeptieren. Er ist eine Zahl die
man verwendet um zurückzugeben, welches Plural der Übersetzung verwendet werden muss.
In unserem Beispiel haben wir definiert, dass wenn wir eine '10' erhalten, die Plural
Definition 0 verwendet werden soll, und in allen anderen Fälle verwenden wir eine 1.
</para>
<para>
Eigene Regeln können so einfach oder so kompliziert sein wie man will. Man muss einfach
nur einen Integer-Wert zurückgeben. Die Pluraldefinition 0 steht hierbei für die
Singular-Übersetzung und 1 steht für die erste Pluralregel.
</para>
<para>
Um die eigene Regel zu aktivieren und diese mit dem gewünschten Gebietsschema zu
verknüpfen, muss man den folgenden Aufruf tätigen:
</para>
<programlisting language="php"><![CDATA[
Zend_Translate_Plural::setPlural('MyPlural', 'zh');
]]></programlisting>
<para>
Jetzt haben wir unsere Pluraldefinition mit der chinesischen Sprache verknüpft.
</para>
<para>
Man kann für jede Sprache eigene Pluralregeln definieren. Aber man sollte aufpassen
dass man Pluralregeln setzt, bevor Übersetzungen durchgeführt werden.
</para>
<note>
<title>Eigene Pluralregeln nur definieren, wenn dies benötigt wird</title>
<para>
<classname>Zend_Translate</classname> definiert Plurale für die meisten bekannten
Sprachen. Man sollte keine eigenen Plurale definieren, wenn man das nicht
benötigt. Die Standardregeln funktionieren meistens.
</para>
</note>
</sect2>
</sect1>
|