1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 21741 -->
4 <sect1 id="zend.translate.using">
6 <title>翻訳アダプタの使用法</title>
12 <example id="zend.translate.using.example1">
13 <title>単一言語の PHP コードの例</title>
15 <programlisting language="php"><![CDATA[
18 print "Here is line one\n";
19 print "Today is the " . date("d.m.Y") . "\n";
21 print "Here is line two\n";
27 おそらく実際はあなたの母国語でコードを書くでしょう。
28 翻訳しなければならないのは、普通は出力内容だけではありません。
29 たとえばエラーメッセージやログメッセージなども対象となります。
33 次のステップは、既存のコードに <classname>Zend Translate</classname> を組み込むことです。
35 最初から翻訳を意識したコードを書くほうがずっと簡単です。
38 <example id="zend.translate.using.example2">
39 <title>多言語対応の PHP コードの例</title>
40 <programlisting language="php"><![CDATA[
41 $translate = new Zend_Translate(
43 'adapter' => 'gettext',
44 'content' => '/my/path/source-de.mo',
48 $translate->addTranslation(
50 'content' => '/path/to/translation/fr-source.mo',
55 print $translate->_("Example") . "\n";
57 print $translate->_("Here is line one") . "\n";
58 printf($translate->_("Today is the %1\$s") . "\n", date('d.m.Y'));
61 $translate->setLocale('fr');
62 print $translate->_("Here is line two") . "\n";
67 では、何が起こっているのか、そしてどうやって
68 <classname>Zend_Translate</classname> をコードに組み込むのかについて
73 新しい <classname>Zend_Translate</classname> オブジェクトを作成し、もととなるアダプタを定義します。
75 <programlisting language="php"><![CDATA[
76 $translate = new Zend_Translate(
78 'adapter' => 'gettext',
79 'content' => '/path/to/translation/source-de.mo',
86 <emphasis>Gettext アダプタ</emphasis>
88 <emphasis>source-de.mo</emphasis> というファイルを
89 <emphasis>/path/to/translation</emphasis> に置いています。
90 この gettext ファイルにはドイツ語の翻訳が含まれています。
91 また、その後で別途フランス語のファイルも追加しています。
95 次に行うのは、翻訳対象の文字列をすべてラップすることです。
96 一番シンプルな手法は、このように文字列や文章を囲むことです。
98 <programlisting language="php"><![CDATA[
99 print $translate->_("Example") . "\n";
101 print $translate->_("Here is line one") . "\n";
104 中には翻訳する必要のない文字列もあるでしょう。
105 区切り線などは、たとえ言語が何であっても同じです。
109 データの値を翻訳文字列に組み込むこともできます。
110 この場合は埋め込みパラメータを使用します。
112 <programlisting language="php"><![CDATA[
113 printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
116 <methodname>print()</methodname> の代わりに <methodname>printf()</methodname> 関数を使用し、
117 すべてのパラメータを <code>%1\$s</code> のように置き換えます。
118 最初のパラメータが <code>%1\$s</code>、その次が <code>%2\$s</code>、
120 これにより、実際の値を知らなくても翻訳を進めることができます。
121 今回の例では、日付は常に今日の日付になります。
122 しかし、文字列を翻訳する際には、実際の日付が何であるかを知る必要はありません。
126 各文字列は、メッセージ ID によって識別します。
127 文字列の代わりに、コード内でメッセージ ID を指定することもできます。
130 <programlisting language="php"><![CDATA[
131 print $translate->_(1) . "\n";
133 print $translate->_(2) . "\n";
136 しかし、この方法にはいくつか欠点があります。
140 コードを見ただけでは、そこでどんな内容が出力されるのかがわかりません。
144 また、文字列の一部が翻訳されていない場合にも問題が起こるでしょう。
146 まず <classname>Zend_Translate</classname> は、指定した ID あるいは文字列に対応する翻訳が
148 翻訳文字列が見つからない場合は、<classname>Zend_Locale</classname>
149 で定義されているその次の言語の翻訳を探します。
150 つまり "<emphasis>de_AT</emphasis>" の場合は
151 "<emphasis>de</emphasis>" のみで探します。
152 "<emphasis>de</emphasis>" の翻訳も見つからない場合は、
154 このようにして、たとえ翻訳文字列がなくても何らかの出力を得ることになっています。
155 <classname>Zend_Translate</classname> は、文字列の翻訳の際に
156 エラーや例外を発生させることはありません。
159 <sect2 id="zend.translate.using.structure">
161 <title>翻訳ソースの構造</title>
164 次に行うのは、翻訳したい言語用の翻訳ソースを作成することです。
165 それぞれのアダプタには個別の方法があるので、それをここで説明します。
166 その前に、すべてのアダプタに共通する一般的な事項について説明しておきます。
170 どこに翻訳ソースファイルを保存すべきなのかを知っておきましょう。
171 <classname>Zend_Translate</classname> では特に制限はありませんが、
181 <programlisting language="txt"><![CDATA[
190 利点: すべての言語のソースファイルを同じディレクトリに配置できます。
191 関連するファイルを分割する必要がありません。
200 <programlisting language="txt"><![CDATA[
204 /languages/en/first.en
205 /languages/en/second.en
207 /languages/de/first.de
208 /languages/de/second.de
213 利点: すべての言語がひとつのディレクトリにまとめられます。
214 各言語のチームは、ひとつのディレクトリを翻訳するだけですみます。
215 また、複数のファイルを透過的に使用できます。
224 <programlisting language="txt"><![CDATA[
226 /application/languages/
227 /application/languages/first.en
228 /application/languages/first.de
229 /application/languages/second.en
230 /application/languages/second.de
235 利点: すべての言語のソースファイルを同じディレクトリに配置できます。
236 関連するファイルを分割する必要がありません。
240 欠点: 同じ言語で複数のファイルを使用する場合に問題が発生します。
249 <programlisting language="txt"><![CDATA[
253 /languages/de/LC_MESSAGES/
254 /languages/de/LC_MESSAGES/first.mo
255 /languages/de/LC_MESSAGES/second.mo
257 /languages/en/LC_MESSAGES/
258 /languages/en/LC_MESSAGES/first.mo
259 /languages/en/LC_MESSAGES/second.mo
264 利点: 以前から使っている gettext 形式のソースを、
269 欠点: これまでに gettext を使ったことがない人たちにとって、
270 サブディレクトリの中にまたサブディレクトリという構造は不可解でしょう。
279 <programlisting language="txt"><![CDATA[
282 /application/models/MyModel.php
283 /application/models/MyModel.de
284 /application/models/MyModel.en
285 /application/controllers/
286 /application/controllers/MyController.php
287 /application/controllers/MyController.de
288 /application/controllers/MyController.en
292 利点: すべてのファイルについて、翻訳ソースを関連付けられます。
296 欠点: 小さな翻訳ファイルがあちこちに散らばってしまうので、翻訳が面倒です。
297 また、すべてのファイルに対して翻訳ソースを追加する必要があります。
303 <classname>Zend_Translate</classname> で最も便利なのは、単一構造か
308 さあ、これでどんな構造でいくかが決まりました。
309 次に翻訳ソースファイルを作っていきましょう。