Zend_Translate-SourceCreation.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 22767 -->
  4. <sect1 id="zend.translate.sourcecreation">
  5. <title>Erstellen von Quelldateien</title>
  6. <para>
  7. Anbei ist eine Beschreibung der unterschiedlichen Quellformate, welche mit
  8. <classname>Zend_Translate</classname> verwendet werden können.
  9. </para>
  10. <note>
  11. <para>
  12. Es ist zu beachten, dass die meisten der beschriebenen Formate durch Verwendung eines
  13. Tools oder eines Erzeugungsprozesses erstellt werden sollten. Diese Tools und
  14. Prozesse sind nicht Teil von Zend Framework und für die meisten der beschriebenen
  15. Formate sind kostenlose Tools verfügbar.
  16. </para>
  17. </note>
  18. <sect2 id="zend.translate.sourcecreation.array">
  19. <title>Erstellung von Array-Quelldateien</title>
  20. <para>
  21. Array-Quelldateien sind reine Arrays. Sie müssen aber manuell definiert werden, da
  22. es hierfür keine Tools gibt, die helfen könnten. Weil sie so einfach zu handhaben sind,
  23. ist ihre Verwendung auch der schnellste Weg um zu testen, ob Nachrichten innerhalb des
  24. Codes wie erwartet arbeiten. Er ist generell der beste Adapter, um mit Mehrsprachigkeit
  25. zu beginnen, wenn man keine diesbezüglichen Kenntnisse hat.
  26. </para>
  27. <programlisting language="php"><![CDATA[
  28. $english = array(
  29. 'message1' => 'message1',
  30. 'message2' => 'message2',
  31. 'message3' => 'message3');
  32. $german = array(
  33. 'message1' => 'Nachricht1',
  34. 'message2' => 'Nachricht2',
  35. 'message3' => 'Nachricht3');
  36. $translate = new Zend_Translate(
  37. array(
  38. 'adapter' => 'array',
  39. 'content' => $english,
  40. 'locale' => 'en'
  41. )
  42. );
  43. $translate->addTranslation(array('content' => $german, 'locale' => 'de'));
  44. ]]></programlisting>
  45. <para>
  46. Seit Release 1.5 wird auch das Einbinden von externen Dateien unterstützt,
  47. welche Arrays beinhalten. Es ist der Dateiname anzugeben und
  48. <classname>Zend_Translate</classname> wird diesen automatisch inkludieren und den
  49. Array suchen. Siehe das folgende Beispiel für Details:
  50. </para>
  51. <programlisting language="php"><![CDATA[
  52. // myarray.php
  53. return array(
  54. 'message1' => 'Nachricht1',
  55. 'message2' => 'Nachricht2',
  56. 'message3' => 'Nachricht3');
  57. // controller
  58. $translate = new Zend_Translate(
  59. array(
  60. 'adapter' => 'array',
  61. 'content' => '/path/to/myarray.php',
  62. 'locale' => 'de'
  63. )
  64. );
  65. ]]></programlisting>
  66. <note>
  67. <para>
  68. Bei Dateien, die kein Array zurückgeben, wird das inkludieren fehlschlagen. Auch
  69. jegliche Ausgabe innerhalb dieser Dateien wird ignoriert und unterdrückt.
  70. </para>
  71. </note>
  72. </sect2>
  73. <sect2 id="zend.translate.sourcecreation.gettext">
  74. <title>Erstellung von Gettext Quellen</title>
  75. <para>
  76. Gettext-Quellen werden von der GNU Gettext-Bibliothek erstellt. Es gibt einige
  77. kostenlose Tools, welche den Code parsen können und hierbei die gewünschten Gettext
  78. Quellen erstellen. Diese haben die Endung <emphasis>*.mo</emphasis> und
  79. sind binäre Dateien. Ein Open Source Tool für die Erstellung der Quellen ist
  80. <ulink url="http://sourceforge.net/projects/poedit/">poEdit</ulink>. Dieses Tool
  81. unterstützt auch beim Übersetzungsprozess selbst.
  82. </para>
  83. <programlisting language="php"><![CDATA[
  84. // Wir nehmen an das die mo Datien erstellt und übersetzt wurden
  85. $translate = new Zend_Translate(
  86. array(
  87. 'adapter' => 'gettext',
  88. 'content' => '/path/to/english.mo',
  89. 'locale' => 'en'
  90. )
  91. );
  92. $translate->addTranslation(
  93. array(
  94. 'content' => '/path/to/german.mo',
  95. 'locale' => 'de'
  96. )
  97. );
  98. ]]></programlisting>
  99. <para>
  100. Offensichtlich wird dieser Adapter bis auf einen kleinen Unterschied auf exakt die gleiche
  101. Art und Weise verwendet: <emphasis>array</emphasis> wird geändert zu
  102. <emphasis>gettext</emphasis>. Alle anderen Punkte werden in jedem anderen
  103. Adapter auf exakt die gleiche Weise verwendet. Mit diesem Gettext-Adapter muss nicht
  104. mehr auf die Standardverzeichnisstruktur von Gettext oder die Verwendung von
  105. bindtextdomain und textdomain geachtet werden. Nur der Pfad und der Dateiname muss dem Adapter
  106. übergeben werden.
  107. </para>
  108. <note>
  109. <para>
  110. Man sollte immer UTF-8 als Quell-Encoding verwenden. Man könnte sonst Probleme
  111. bekommen, wenn man zwei verschiedene Encodings verwendet. Wenn z.B. eine Quelldatei
  112. mit ISO-8815-11 und eine andere mit CP815 encoded ist. Man kann
  113. immer nur ein Encoding für alle Quelldateien verwenden und hierbei würde eine der
  114. gewünschten Sprachen nicht korrekt angezeigt werden.
  115. </para>
  116. <para>
  117. UTF-8 ist ein portables Format, welches alle Sprachen unterstützt. Wenn UTF-8 für
  118. alle Sprachen verwendet wird, eliminiert man die Probleme mit inkompatiblen
  119. Encodings.
  120. </para>
  121. </note>
  122. <para>
  123. Viele Gettext-Editoren fügen Informationen über den Adapter als Übersetzung eines
  124. leeren Strings hinzu. Das ist der Grund, warum leere Strings nicht übersetzt werden, wenn
  125. der Gettext-Adapter verwendet wird. Stattdessen wird er von der Übersetzungstabelle
  126. gelöscht und von der <methodname>getAdapterInfo()</methodname> Methode angeboten. Sie
  127. gibt die Adapterinformationen für alle hinzugefügten Gettextdateien als Array zurück,
  128. wobei der Dateiname als Schlüssel verwendet wird.
  129. </para>
  130. <programlisting language="php"><![CDATA[
  131. // Informationen des Adapters bekommen
  132. $translate = new Zend_Translate(
  133. array(
  134. 'adapter' => 'gettext',
  135. 'content' => '/path/to/english.mo',
  136. 'locale' => 'en'
  137. )
  138. );
  139. print_r($translate->getAdapterInfo());
  140. ]]></programlisting>
  141. </sect2>
  142. <sect2 id="zend.translate.sourcecreation.tmx">
  143. <title>Erstellung von TMX Quellen</title>
  144. <para>
  145. TMX-Quellen sind der neue Industriestandard. Sie haben den Vorteil, dass sie
  146. <acronym>XML</acronym> Dateien sind und deswegen mit jedem Texteditor lesbar und
  147. natürlich auch von Menschen. Man kann TMX-Dateien entweder per Hand erstellen oder man
  148. verwendet spezielle Tools dafür. Allerdings sind die meisten Tools für die
  149. Erstellung von TMX Quellen nicht frei erhältlich.
  150. </para>
  151. <example id="zend.translate.sourcecreation.tmx.example">
  152. <title>Beispiel einer TMX Datei</title>
  153. <programlisting language="xml"><![CDATA[
  154. <?xml version="1.0" ?>
  155. <!DOCTYPE tmx SYSTEM "tmx14.dtd">
  156. <tmx version="1.4">
  157. <header creationtoolversion="1.0.0" datatype="winres" segtype="sentence"
  158. adminlang="en-us" srclang="de-at" o-tmf="abc"
  159. creationtool="XYZTool" >
  160. </header>
  161. <body>
  162. <tu tuid='message1'>
  163. <tuv xml:lang="de"><seg>Nachricht1</seg></tuv>
  164. <tuv xml:lang="en"><seg>message1</seg></tuv>
  165. </tu>
  166. <tu tuid='message2'>
  167. <tuv xml:lang="de"><seg>Nachricht2</seg></tuv>
  168. <tuv xml:lang="en"><seg>message2</seg></tuv>
  169. </tu>
  170. </body>
  171. </tmx>
  172. ]]></programlisting>
  173. <programlisting language="php"><![CDATA[
  174. $translate = new Zend_Translate(
  175. array(
  176. 'adapter' => 'tmx',
  177. 'content' => 'path/to/mytranslation.tmx',
  178. 'locale' => 'en'
  179. )
  180. );
  181. ]]></programlisting>
  182. </example>
  183. <para>
  184. TMX-Dateien können mehrere Sprachen in derselben Datei enthalten. Alle anderen in der
  185. Quelle enthaltenen Sprachen werden automatisch hinzugefügt und müssen nicht durch einen
  186. extra Aufruf von <methodname>addLanguage()</methodname> ergänzt werden.
  187. </para>
  188. <para>
  189. Wenn man nur spezielle Sprachen aus der Quelle übersetzen will, kann die Option
  190. <property>defined_language</property> auf <constant>TRUE</constant> gesetzt werden. Mit
  191. dieser Option können gewünschte Sprachen explizit mit
  192. <methodname>addLanguage()</methodname> hinzugefügt werden. Der Standardwert für diese
  193. Option fügt alle Sprachen hinzu.
  194. </para>
  195. <note>
  196. <title>Option useId</title>
  197. <para>
  198. Wenn man die Option <emphasis>useId</emphasis> auf <constant>FALSE</constant> setzt,
  199. dann wird der <emphasis>srclang</emphasis>-Header verwendet, um die Sprache zu
  200. definieren, welche die Meldung setzt.
  201. </para>
  202. <para>
  203. In unserem Beispiel würde der Schlüssel der Meldung standardmäßig
  204. <emphasis>message1</emphasis> sein. Wenn diese Option auf <constant>FALSE</constant>
  205. gesetzt wird, dann würde der Schlüssel <emphasis>Nachricht1</emphasis> verwendet
  206. werden.
  207. </para>
  208. <para>
  209. Es ist zu beachten, dass der Eintrag <emphasis>tuv</emphasis>, welcher dem
  210. Eintrag <emphasis>srclang</emphasis> entspricht, der erste <emphasis>tuv</emphasis>
  211. Eintrag sein muss, welcher gesetzt wird, wie im obigen Beispiel zu sehen ist.
  212. </para>
  213. </note>
  214. </sect2>
  215. <sect2 id="zend.translate.sourcecreation.csv">
  216. <title>Erstellung von CSV-Quellen</title>
  217. <para>
  218. CSV-Quellen sind sehr klein und von Menschen lesbar. Wenn ein Kunde selbst übersetzen
  219. will, ist die Verwendung des CSV-Adapters wahrscheinlich die beste Wahl.
  220. </para>
  221. <example id="zend.translate.sourcecreation.csv.example">
  222. <title>Beispiel CSV Datei</title>
  223. <programlisting language="txt"><![CDATA[
  224. #Example csv file
  225. message1;Nachricht1
  226. message2;Nachricht2
  227. ]]></programlisting>
  228. <programlisting language="php"><![CDATA[
  229. $translate = new Zend_Translate(
  230. array(
  231. 'adapter' => 'csv',
  232. 'content' => '/path/to/mytranslation.csv',
  233. 'locale' => 'de'
  234. )
  235. );
  236. $translate->addTranslation(
  237. array(
  238. 'content' => 'path/to/other.csv',
  239. 'locale' => 'fr'
  240. )
  241. );
  242. ]]></programlisting>
  243. </example>
  244. <para>
  245. Es gibt drei verschiedene Optionen für den CSV-Adapter. Es können
  246. <property>delimiter</property>, <property>limit</property> und
  247. <property>enclosure</property> gesetzt werden.
  248. </para>
  249. <para>
  250. Das Standardtrennzeichen für CSV-Strings ist '<emphasis>;</emphasis>', aber es muss
  251. nicht dieses Zeichen sein. Mit der Option <property>delimiter</property> kann ein
  252. anderes verwendet werden.
  253. </para>
  254. <para>
  255. Das Standardlimit für eine Zeile in einer CSV-Datei ist '<emphasis>0</emphasis>'. Das
  256. bedeutet, dass das Ende der CSV-Zeile automatisch gesucht wird. Wenn
  257. <property>limit</property> auf irgendeinen Wert gesetzt wird, dann wird die CSV-Datei
  258. schneller gelesen, aber jede Zeile, die dieses Limit überschreitet, wird abgeschnitten.
  259. </para>
  260. <para>
  261. Das standardmäßige Anführungszeichen für die Verwendung mit CSV-Dateien ist
  262. '<emphasis>"</emphasis>'. Man kann ein anderes setzen, indem die Option
  263. <property>enclosure</property> verwendet wird.
  264. </para>
  265. <example id="zend.translate.sourcecreation.csv.example2">
  266. <title>Zweites Beispiel für CSV-Dateien</title>
  267. <programlisting language="txt"><![CDATA[
  268. # Example CSV file
  269. "message,1",Nachricht1
  270. message2,"Nachricht,2"
  271. "message3,",Nachricht3
  272. ]]></programlisting>
  273. <programlisting language="php"><![CDATA[
  274. $translate = new Zend_Translate(
  275. array(
  276. 'adapter' => 'csv',
  277. 'content' => '/path/to/mytranslation.csv',
  278. 'locale' => 'de',
  279. 'delimiter' => ','
  280. )
  281. );
  282. $translate->addTranslation(
  283. array(
  284. 'content' => '/path/to/other.csv',
  285. 'locale' => 'fr'
  286. )
  287. );
  288. ]]></programlisting>
  289. </example>
  290. <note>
  291. <para>
  292. Wenn nicht-ASCII-Zeichen in der CSV-Datei verwendet werden, wie z.B. Umlaute oder
  293. UTF-8 Zeichen, dann sollte man immer Hochkommas verwenden. Das Weglassen der
  294. Hochkommas kann zu fehlenden Zeichen in der Übersetzung führen.
  295. </para>
  296. </note>
  297. </sect2>
  298. <sect2 id="zend.translate.sourcecreation.ini">
  299. <title>Erstellung von INI-Quelldateien</title>
  300. <para>
  301. <acronym>INI</acronym>-Quelldateien sind menschenlesbar, aber normalerweise nicht sehr
  302. klein, da sie neben der Übersetzung auch andere Daten enthalten. Wenn Sie Daten haben, die
  303. von Ihrem Kunden zu bearbeitet sind, verwenden Sie den <acronym>INI</acronym>-Adapter.
  304. </para>
  305. <example id="zend.translate.sourcecreation.ini.example">
  306. <title>Beispiel einer INI-Datei</title>
  307. <programlisting language="txt"><![CDATA[
  308. [Test]
  309. ;TestPage Comment
  310. Message_1="Nachricht 1 (de)"
  311. Message_2="Nachricht 2 (de)"
  312. Message_3="Nachricht :3 (de)"
  313. ]]></programlisting>
  314. <programlisting language="php"><![CDATA[
  315. $translate = new Zend_Translate(
  316. array(
  317. 'adapter' => 'ini',
  318. 'content' => '/path/to/mytranslation.ini',
  319. 'locale' => 'de'
  320. )
  321. );
  322. $translate->addTranslation(
  323. array(
  324. 'content' => '/path/to/other.ini',
  325. 'locale' => 'it'
  326. )
  327. );
  328. ]]></programlisting>
  329. </example>
  330. <para>
  331. <acronym>INI</acronym>-Dateien haben verschiedene Einschränkungen. Wenn ein Wert in
  332. einer <acronym>INI</acronym>-Datei irgendein nicht alphanumerisches Zeichen enthält,
  333. muss er in doppelte Anführungszeichen (<emphasis>"</emphasis>) eingeschlossen werden. Es
  334. gibt auch reservierte Wörter, welche nicht als Schlüssel für
  335. <acronym>INI</acronym>-Dateien verwendet werden dürfen. Diese enthalten:
  336. <constant>NULL</constant>, <emphasis>yes</emphasis>, <emphasis>no</emphasis>,
  337. <constant>TRUE</constant> und <constant>FALSE</constant>. Die Werte
  338. <constant>NULL</constant>, <emphasis>no</emphasis> und <constant>FALSE</constant> führen
  339. zu <emphasis>""</emphasis>, <emphasis>yes</emphasis> und <constant>TRUE</constant>
  340. resultieren in '1'. Die Zeichen <emphasis>{}|&amp;~![()"</emphasis> dürfen nirgendwo im
  341. Schlüssel verwendet werden und haben im Wert eine spezielle Bedeutung. Diese sollten
  342. nicht verwendet werden, da sie zu unerwartetem Verhalten führen.
  343. </para>
  344. </sect2>
  345. </sect1>