1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 21661 -->
4 <sect1 id="zend.translate.adapter">
5 <title>Zend_Translate のアダプタ</title>
8 <classname>Zend_Translate</classname> は、さまざまなアダプタを使用して翻訳を行えます。
9 それぞれのアダプタによって利点や欠点があります。
10 以下に、翻訳の入力ファイルとしてサポートしているすべてのアダプタについてまとめます。
13 <table id="zend.translate.adapter.table">
14 <title><classname>Zend_Translate</classname> のアダプタ</title>
28 <entry><acronym>PHP</acronym> の配列</entry>
29 <entry>小さめのページ。簡単に使用できる。プログラマしかさわれない。</entry>
34 <entry>カンマ区切りファイル (*.csv/*.txt)</entry>
35 <entry>シンプルなテキスト形式。高速。Unicode 文字で問題が発生する可能性がある。</entry>
39 <entry>Gettext</entry>
40 <entry>gettext のバイナリファイル (*.mo)</entry>
41 <entry>linux における GNU の標準形式。スレッドセーフ。翻訳用ツールが必要。</entry>
46 <entry>シンプルな ini ファイル (*.ini)</entry>
47 <entry>シンプルなテキスト形式。高速。Unicode 文字で問題が発生する可能性がある。</entry>
52 <entry>termbase 変換ファイル (*.tbx/*.xml)</entry>
53 <entry>アプリケーション間で専門用語を変換するための業界標準。<acronym>XML</acronym> フォーマット。</entry>
58 <entry>tmx ファイル (*.tmx/*.xml)</entry>
59 <entry>アプリケーション間での翻訳の業界標準。<acronym>XML</acronym> フォーマット。可読形式。</entry>
64 <entry>qt 言語ファイル (*.ts)</entry>
65 <entry>クロスプラットフォームなアプリケーションフレームワーク。<acronym>XML</acronym> フォーマット。可読形式。</entry>
70 <entry>xliff ファイル (*.xliff/*.xml)</entry>
71 <entry><acronym>TMX</acronym> に似ているが、よりシンプル。<acronym>XML</acronym> フォーマット。可読形式。</entry>
76 <entry>xmltm ファイル (*.xml)</entry>
77 <entry><acronym>XML</acronym> ドキュメントの翻訳メモリの業界標準。<acronym>XML</acronym> フォーマット。可読形式。</entry>
83 <entry>今後、その他さまざまなアダプタを実装する予定です。</entry>
89 <sect2 id="zend.translate.adapter.decision">
90 <title>使用するアダプタを決める方法</title>
93 <classname>Zend_Translate</classname> でどのアダプタを使用するのかを決める必要があります。
94 プロジェクトの制約や顧客からの要望などの外的要因でアダプタが決まることもよくありますが、
95 もしあなたに決定権があるのなら、以下のヒントを参考にしてください。
101 使用するエンコーディングを考慮しなければなりません。
102 Zend Framework では UTF-8 をデフォルトのエンコーディングとしていますが、
103 時には他のエンコーディングを使わなければならないこともあるでしょう。
104 <classname>Zend_Translate</classname> は、
105 ソースファイル内で定義されているエンコーディングを変更しません。
106 つまり、もし Gettext のソースが ISO-8859-1 で作られている場合は、
107 それをそのままのエンコーディングで返します。
112 TMX や XLIFF といった <acronym>XML</acronym> ベースのソース形式を使用する場合は、
113 そのエンコーディングを <acronym>XML</acronym> ファイルのヘッダで定義しなければなりません。
114 エンコーディングの定義がない <acronym>XML</acronym> ファイルは、
115 デフォルトでは UTF-8 として扱われるからです。
116 また、もうひとつ注意すべき点は、<acronym>XML</acronym>
117 ファイルのエンコーディングとして使用できるのは <acronym>PHP</acronym>
118 がサポートしているエンコーディングのみであること、
119 つまり UTF-8、ISO-8859-1 および US-ASCII だけであるということです。
123 <sect3 id="zend.translate.adapter.array">
124 <title>Zend_Translate_Adapter_Array</title>
127 Array アダプタは、プログラマにとっては
130 多くの言語に翻訳する必要がある場合は、別のアダプタを使うようにしましょう。
131 たとえば、翻訳文字列が 5000 ほどある場合は
132 Array アダプタは選択しないほうがいいでしょう。
136 このアダプタを使うのは、小さめのサイトで少なめの言語を扱い、
137 かつプログラマ自身で翻訳も行う場合だけにしましょう。
141 <sect3 id="zend.translate.adapter.csv">
142 <title>Zend_Translate_Adapter_Csv</title>
145 Csv アダプタは、顧客にとっては最もシンプルに使えるアダプタです。
146 CSV ファイルは標準的なテキストエディタで読むことができますが、
147 エディタによっては utf8 文字セットをサポートしていないものもあります。
152 顧客が自分で翻訳を行いたいという場合だけにしましょう。
157 Csv ファイルのエンコードがあなたの環境のロケール設定と異なる場合、
158 Csv アダプタで問題が発生することに注意しましょう。
159 これは <acronym>PHP</acronym> 自体のバグによるもので、このバグは <acronym>PHP</acronym> 6.0
160 で修正される予定です (http://bugs.php.net/bug.php?id=38471)。
161 したがって、Csv アダプタを使用する場合は
162 (<acronym>PHP</acronym> の制約のせいで) それがロケール対応でないということに注意しなければなりません。
167 <sect3 id="zend.translate.adapter.gettext">
168 <title>Zend_Translate_Adapter_Gettext</title>
171 Gettext アダプタは、最もよく用いられるアダプタです。
172 Gettext は GNU が提供している翻訳フォーマットで、世界中で使用されています。
173 可読形式ではありませんが、便利なフリーウェア
174 (<ulink url="http://sourceforge.net/projects/poedit/">POEdit</ulink> など)
176 <classname>Zend_Translate</classname> の Gettext アダプタは、<acronym>PHP</acronym> の gettext
178 <acronym>PHP</acronym> の gettext 拡張モジュールをインストールしていなくても
179 Gettext アダプタを使用することが可能です。
180 また、このアダプタはスレッドセーフですが、<acronym>PHP</acronym> の gettext
181 拡張モジュールは現状ではスレッドセーフでありません。
185 ほとんどの人たちは、このアダプタを使うことになるでしょう。
186 便利なツールを使用することで、高品質な翻訳が簡単に作成できます。
187 しかし、gettext のデータは機械が読める形式で保存されるので、
188 何らかのツールがないと人間が読むことはできません。
192 <sect3 id="zend.translate.adapter.ini">
193 <title>Zend_Translate_Adapter_Ini</title>
196 Ini アダプタは非常にシンプルなアダプタであり、
198 <acronym>INI</acronym> ファイルは標準的なテキストエディタで読むことができますが、
199 エディタによっては utf8 文字セットをサポートしていないものもあります。
204 顧客が自分で翻訳を行いたいという場合だけにしましょう。
205 汎用的な翻訳ソースとしては使用しないようにしましょう。
209 <title>PHP 5.3 でのリグレッション</title>
212 <acronym>PHP</acronym> 5.3 より前のバージョンでは、<methodname>parse_ini_file()</methodname>
213 および <methodname>parse_ini_string()</methodname> で
214 <acronym>INI</acronym> オプションのキーに非 ASCII 文字を問題なく使用できました。
215 しかし <acronym>PHP</acronym> 5.3 以降では、
216 非 ASCII 文字のキーはどちらの関数の返す配列からも黙って抜け落ちてしまいます。
217 UTF-8 や Latin-1 の文字をキーに使用している場合は、
218 <acronym>INI</acronym> アダプタを使うと翻訳が正しく機能しなくなってしまいました。
219 そのような場合は別のアダプタを使用することを推奨します。
224 <sect3 id="zend.translate.adapter.tbx">
225 <title>Zend_Translate_Adapter_Tbx</title>
228 Tbx アダプタは、内部ですでに TBX フォーマットの翻訳システムを使用している顧客などが使用します。
229 Tbx は標準の翻訳フォーマットではありませんが、
230 すでに多くの翻訳や翻訳済み文字列が存在します。
232 必要な文字列をすべて翻訳しなければならないことに気をつけましょう。
233 TBX は、まったく新しく作られた <acronym>XML</acronym> ベースのフォーマットです。
234 <acronym>XML</acronym> ファイルは人間が読むことも可能ですが、
235 パース速度は gettext ファイルより遅くなります。
239 このアダプタは、すでにこの形式の翻訳ファイルを持っている企業に最適です。
240 ファイルは可読形式で、システムに依存しない形式になります。
244 <sect3 id="zend.translate.adapter.tmx">
245 <title>Zend_Translate_Adapter_Tmx</title>
248 Tmx アダプタは、複数のシステムで同一の翻訳ソースを使用している顧客などが使用します。
249 また、翻訳ソースをシステムに依存しない形式にしたい場合にも使用します。
250 TMX は <acronym>XML</acronym> 形式のフォーマットで、業界標準になるといわれています。
251 <acronym>XML</acronym> ファイルは人間が読むことも可能ですが、
252 パース速度は gettext ファイルより遅くなります。
256 中規模から大規模の会社はこのアダプタを使用します。
257 ファイルは可読形式で、システムに依存しない形式になります。
261 <sect3 id="zend.translate.adapter.qt">
262 <title>Zend_Translate_Adapter_Qt</title>
265 Qt アダプタは、QtLinguist で作成した TS
266 ファイル形式の翻訳を使用している顧客が使用します。
267 QT は <acronym>XML</acronym> 形式のフォーマットです。
268 <acronym>XML</acronym> ファイルは人間が読むことも可能ですが、
269 パース速度は gettext ファイルより遅くなります。
273 大手企業の中には QT フレームワークを使用したソフトウェアを作成しているところがあります。
274 ファイルは可読形式で、システムに依存しない形式になります。
278 <sect3 id="zend.translate.adapter.xliff">
279 <title>Zend_Translate_Adapter_Xliff</title>
282 Xliff アダプタは、<acronym>XML</acronym> ファイルを使用したいけれど
283 TMX 用のツールを持っていないという顧客などが使用します。
284 XLIFF は <acronym>XML</acronym> 形式のフォーマットで、
285 TMX と関連していますがもうすこしシンプルです。機能も一部限定されています。
286 <acronym>XML</acronym> ファイルは人間が読むことも可能ですが、
287 パース速度は gettext ファイルより遅くなります。
292 ファイルは可読形式で、システムに依存しない形式になります。
296 <sect3 id="zend.translate.adapter.xmltm">
297 <title>Zend_Translate_Adapter_XmlTm</title>
300 XmlTm アダプタは、すでにこのレイアウトを採用している顧客が使用するアダプタです。
301 XmlTm は、html ソース全体を翻訳ソースに含めることのできるフォーマットで、
303 XLIFF は <acronym>XML</acronym> ベースのフォーマットです。XLIFF
304 と関連していますが、それほど読みやすくはありません。
308 このアダプタは、すでにソースファイルが存在する場合にのみ使用するようにしましょう。
309 ファイルは可読形式で、システムに依存しない形式になります。
315 <sect2 id="zend.translate.adapter.selfwritten">
316 <title>自作のアダプタの組み込み</title>
319 <classname>Zend_Translate</classname> に、自作のアダプタクラスを組み込むこともできます。
320 これは、<classname>Zend_Translate</classname> に組み込まれている標準のアダプタクラスと同様に使用できます。
324 <classname>Zend_Translate</classname> で使用するアダプタクラスは、
325 <classname>Zend_Translate_Adapter</classname> のサブクラスでなければなりません。
326 <classname>Zend_Translate_Adapter</classname> は抽象クラスであり、翻訳に必要なものをすべて定義しています。
327 あなたがすべきことは、翻訳データの読み込み方法を定義することだけです。
331 名前の先頭に "Zend" をつけることができるのは Zend_Framework
332 内のパッケージだけです。<classname>Zend_Translate</classname> で使うためのアダプタを自作する場合は、
333 その名前はたとえば "Company_Translate_Adapter_MyFormat" のようにする必要があります。
334 次のコードは、独自のアダプタクラスを実装する例を示すものです。
337 <programlisting language="php"><![CDATA[
339 $translate = new Zend_Translate(
341 'adapter' => 'Company_Translate_Adapter_MyFormat',
342 'content' => '/path/to/translate.xx',
344 'myoption' => 'myvalue'
347 } catch (Exception $e) {
348 // ファイルが見つからない、アダプタクラスが存在しない、……
355 <sect2 id="zend.translate.adapter.caching">
356 <title>全アダプタの高速化</title>
359 <classname>Zend_Translate</classname> では、内部的に <classname>Zend_Cache</classname>
360 を使用して翻訳ソースの読み込みを高速化できます。
362 <acronym>XML</acronym> ベースの複雑なソース形式を使用していたりする場合に非常に便利です。
366 キャッシュ機能を使用するには、キャッシュオブジェクトを
367 <methodname>Zend_Translate::setCache()</methodname> メソッドで渡します。
369 <classname>Zend_Cache</classname> のインスタンスを指定します。
371 <methodname>setCache()</methodname> メソッドを使用します。
373 <methodname>getCache()</methodname>、<methodname>hasCache()</methodname>、<methodname>clearCache()</methodname> および
374 <methodname>removeCache()</methodname> も用意されています。
377 <programlisting language="php"><![CDATA[
378 $cache = Zend_Cache::factory('Core',
382 Zend_Translate::setCache($cache);
383 $translate = new Zend_Translate(
385 'adapter' => 'gettext',
386 'content' => '/path/to/translate.mo',
395 <classname>Zend_Translate</classname> のインスタンスを使用したり初期化したりする
396 <emphasis>前</emphasis> に行わなければなりません。
398 <methodname>addTranslation()</methodname> メソッドで追加するまで