Zend_Translate-Plurals.xml 15 KB

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