[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Translate-Using.xml
blob6c2c84512f5c5ac461a0b0f481f9f0fd335285f6
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 21741 -->
4 <sect1 id="zend.translate.using">
6     <title>翻訳アダプタの使用法</title>
8     <para>
9         次は、アダプタをコード内で使用する方法です。
10     </para>
12     <example id="zend.translate.using.example1">
13         <title>単一言語の PHP コードの例</title>
15         <programlisting language="php"><![CDATA[
16 print "Example\n";
17 print "=======\n";
18 print "Here is line one\n";
19 print "Today is the " . date("d.m.Y") . "\n";
20 print "\n";
21 print "Here is line two\n";
22 ]]></programlisting>
23     </example>
25     <para>
26         上の例の出力は、翻訳に対応していません。
27         おそらく実際はあなたの母国語でコードを書くでしょう。
28         翻訳しなければならないのは、普通は出力内容だけではありません。
29         たとえばエラーメッセージやログメッセージなども対象となります。
30     </para>
32     <para>
33         次のステップは、既存のコードに <classname>Zend Translate</classname> を組み込むことです。
34         もちろん、あとからコードを変更するよりも
35         最初から翻訳を意識したコードを書くほうがずっと簡単です。
36     </para>
38     <example id="zend.translate.using.example2">
39         <title>多言語対応の PHP コードの例</title>
40         <programlisting language="php"><![CDATA[
41 $translate = new Zend_Translate(
42     array(
43         'adapter' => 'gettext',
44         'content' => '/my/path/source-de.mo',
45         'locale'  => 'de'
46     )
48 $translate->addTranslation(
49     array(
50         'content' => '/path/to/translation/fr-source.mo',
51         'locale'  => 'fr'
52     )
55 print $translate->_("Example") . "\n";
56 print "=======\n";
57 print $translate->_("Here is line one") . "\n";
58 printf($translate->_("Today is the %1\$s") . "\n", date('d.m.Y'));
59 print "\n";
61 $translate->setLocale('fr');
62 print $translate->_("Here is line two") . "\n";
63 ]]></programlisting>
64     </example>
66     <para>
67         では、何が起こっているのか、そしてどうやって
68         <classname>Zend_Translate</classname> をコードに組み込むのかについて
69         もうすこし詳しく見ていきましょう。
70     </para>
72     <para>
73         新しい <classname>Zend_Translate</classname> オブジェクトを作成し、もととなるアダプタを定義します。
75         <programlisting language="php"><![CDATA[
76 $translate = new Zend_Translate(
77     array(
78         'adapter' => 'gettext',
79         'content' => '/path/to/translation/source-de.mo',
80         'locale'  => 'de'
81     )
83 ]]></programlisting>
85         この例では、
86         <emphasis>Gettext アダプタ</emphasis>
87         を使うことにしました。
88         <emphasis>source-de.mo</emphasis> というファイルを
89         <emphasis>/path/to/translation</emphasis> に置いています。
90         この gettext ファイルにはドイツ語の翻訳が含まれています。
91         また、その後で別途フランス語のファイルも追加しています。
92     </para>
94     <para>
95         次に行うのは、翻訳対象の文字列をすべてラップすることです。
96         一番シンプルな手法は、このように文字列や文章を囲むことです。
98         <programlisting language="php"><![CDATA[
99 print $translate->_("Example") . "\n";
100 print "=======\n";
101 print $translate->_("Here is line one") . "\n";
102 ]]></programlisting>
104         中には翻訳する必要のない文字列もあるでしょう。
105         区切り線などは、たとえ言語が何であっても同じです。
106     </para>
108     <para>
109         データの値を翻訳文字列に組み込むこともできます。
110         この場合は埋め込みパラメータを使用します。
112         <programlisting language="php"><![CDATA[
113 printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
114 ]]></programlisting>
116         <methodname>print()</methodname> の代わりに <methodname>printf()</methodname> 関数を使用し、
117         すべてのパラメータを <code>%1\$s</code> のように置き換えます。
118         最初のパラメータが <code>%1\$s</code>、その次が <code>%2\$s</code>、
119         といったようになります。
120         これにより、実際の値を知らなくても翻訳を進めることができます。
121         今回の例では、日付は常に今日の日付になります。
122         しかし、文字列を翻訳する際には、実際の日付が何であるかを知る必要はありません。
123     </para>
125     <para>
126         各文字列は、メッセージ ID によって識別します。
127         文字列の代わりに、コード内でメッセージ ID を指定することもできます。
128         その場合は、このようになります。
130         <programlisting language="php"><![CDATA[
131 print $translate->_(1) . "\n";
132 print "=======\n";
133 print $translate->_(2) . "\n";
134 ]]></programlisting>
136         しかし、この方法にはいくつか欠点があります。
137     </para>
139     <para>
140         コードを見ただけでは、そこでどんな内容が出力されるのかがわかりません。
141     </para>
143     <para>
144         また、文字列の一部が翻訳されていない場合にも問題が起こるでしょう。
145         翻訳の動作原理について考えてみましょう。
146         まず <classname>Zend_Translate</classname> は、指定した ID あるいは文字列に対応する翻訳が
147         その言語に存在するかどうかを探します。
148         翻訳文字列が見つからない場合は、<classname>Zend_Locale</classname>
149         で定義されているその次の言語の翻訳を探します。
150         つまり "<emphasis>de_AT</emphasis>" の場合は
151         "<emphasis>de</emphasis>" のみで探します。
152         "<emphasis>de</emphasis>" の翻訳も見つからない場合は、
153         もとのメッセージをそのまま返します。
154         このようにして、たとえ翻訳文字列がなくても何らかの出力を得ることになっています。
155         <classname>Zend_Translate</classname> は、文字列の翻訳の際に
156         エラーや例外を発生させることはありません。
157     </para>
159     <sect2 id="zend.translate.using.structure">
161         <title>翻訳ソースの構造</title>
163         <para>
164             次に行うのは、翻訳したい言語用の翻訳ソースを作成することです。
165             それぞれのアダプタには個別の方法があるので、それをここで説明します。
166             その前に、すべてのアダプタに共通する一般的な事項について説明しておきます。
167         </para>
169         <para>
170             どこに翻訳ソースファイルを保存すべきなのかを知っておきましょう。
171             <classname>Zend_Translate</classname> では特に制限はありませんが、
172             以下のような構造を推奨します。
173         </para>
175         <itemizedlist>
176             <listitem>
177                 <para>
178                     単一構造のソース
179                 </para>
181                 <programlisting language="txt"><![CDATA[
182 /application/
183 /languages/
184 /languages/lang.en
185 /languages/lang.de
186 /library/
187 ]]></programlisting>
189                 <para>
190                     利点: すべての言語のソースファイルを同じディレクトリに配置できます。
191                     関連するファイルを分割する必要がありません。
192                 </para>
193             </listitem>
195             <listitem>
196                 <para>
197                     言語ごとに分けた構造
198                 </para>
200                 <programlisting language="txt"><![CDATA[
201 /application/
202 /languages/
203 /languages/en/
204 /languages/en/first.en
205 /languages/en/second.en
206 /languages/de/
207 /languages/de/first.de
208 /languages/de/second.de
209 /library
210 ]]></programlisting>
212                 <para>
213                     利点: すべての言語がひとつのディレクトリにまとめられます。
214                     各言語のチームは、ひとつのディレクトリを翻訳するだけですみます。
215                     また、複数のファイルを透過的に使用できます。
216                 </para>
217             </listitem>
219             <listitem>
220                 <para>
221                     アプリケーションごとに分けた構造
222                 </para>
224                 <programlisting language="txt"><![CDATA[
225 /application/
226 /application/languages/
227 /application/languages/first.en
228 /application/languages/first.de
229 /application/languages/second.en
230 /application/languages/second.de
231 /library/
232 ]]></programlisting>
234                 <para>
235                     利点: すべての言語のソースファイルを同じディレクトリに配置できます。
236                     関連するファイルを分割する必要がありません。
237                 </para>
239                 <para>
240                     欠点: 同じ言語で複数のファイルを使用する場合に問題が発生します。
241                 </para>
242             </listitem>
244             <listitem>
245                 <para>
246                     Gettext 形式の構造
247                 </para>
249                 <programlisting language="txt"><![CDATA[
250 /application/
251 /languages/
252 /languages/de/
253 /languages/de/LC_MESSAGES/
254 /languages/de/LC_MESSAGES/first.mo
255 /languages/de/LC_MESSAGES/second.mo
256 /languages/en/
257 /languages/en/LC_MESSAGES/
258 /languages/en/LC_MESSAGES/first.mo
259 /languages/en/LC_MESSAGES/second.mo
260 /library/
261 ]]></programlisting>
263                 <para>
264                     利点: 以前から使っている gettext 形式のソースを、
265                     そのままの形式で使用できます。
266                 </para>
268                 <para>
269                     欠点: これまでに gettext を使ったことがない人たちにとって、
270                     サブディレクトリの中にまたサブディレクトリという構造は不可解でしょう。
271                 </para>
272             </listitem>
274             <listitem>
275                 <para>
276                    ファイル構造のソース
277                 </para>
279                 <programlisting language="txt"><![CDATA[
280 /application/
281 /application/models/
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
289 /library/
290 ]]></programlisting>
291                 <para>
292                     利点: すべてのファイルについて、翻訳ソースを関連付けられます。
293                 </para>
295                 <para>
296                     欠点: 小さな翻訳ファイルがあちこちに散らばってしまうので、翻訳が面倒です。
297                     また、すべてのファイルに対して翻訳ソースを追加する必要があります。
298                 </para>
299             </listitem>
300         </itemizedlist>
302         <para>
303             <classname>Zend_Translate</classname> で最も便利なのは、単一構造か
304             言語ごとに分けた構造でしょう。
305         </para>
307         <para>
308             さあ、これでどんな構造でいくかが決まりました。
309             次に翻訳ソースファイルを作っていきましょう。
310         </para>
312     </sect2>
314 </sect1>
315 <!--
316 vim:se ts=4 sw=4 et: