CakePHP3で同じ単語を異なる英語へ翻訳する方法

のえる のえる
2016.11.09

どうも、のえるです。
 
最近、恐ろしく寒くなってきましたね。
かくいう自分は風邪でダウンしてました。
 
さて、今回はCakePHP3で翻訳する際のお話です。
 
CakePHP3は翻訳機能が搭載されており、多言語化への導入を比較的楽に行えます。
例えば、「りんご」という単語を「Apple」、「複数の窓」を「Windows」と翻訳したい場合は下記のような感じになります。
 

[CakePHP3プロジェクトRoot]/src/Locale/en/default.po

 
置き換えの命令はControllerやTemplate、Elementなどで下記のように記載します。
 

 
上記のように「msgid」に書いたキーワードを「msgstr」に書いた文字に置き換えてくれます。
(CakePHP3 – 翻訳の機能を利用する)
 
ただし、これには少し注意が必要です。
 
何故、注意が必要なのでしょうか?
それは、「時計」という単語が画面に2か所配置されていたとして、1つは「Clock」、もう1つは「Watch」と翻訳したい場合など、
同一画面で同一の単語を、それぞれ別の単語に翻訳する場合です。
 
まずは上記のように翻訳ファイルを作ってみましょう。
 

[CakePHP3プロジェクトRoot]/src/Locale/en/default.po

 

 
さて、このPHPを実行した場合、何が表示されるでしょうか?
実はこのような感じになります。
 

 
そう、この翻訳ファイルは同一単語があった場合、一番最後の翻訳を適用するんです。
 
これは困りましたね
日本語では両方とも「時計」ですが、英語では壁掛け時計を「Clock」、腕時計を「Watch」と明確に使い分けています。
 
これに対応させるのが「ドメイン翻訳機能」です。
(CakePHP3 – 翻訳の機能を利用する)
 
これは翻訳ファイルを指定して翻訳する機能で、下記のように使用することが出来ます。
 

[CakePHP3プロジェクトRoot]/src/Locale/en/default.po

 

[CakePHP3プロジェクトRoot]/src/Locale/en/hon_yaku_2.po

 

 
このように、ファイルを分割することで、翻訳前の単語が同じでも、別の単語への翻訳が可能です。
※「__d()」関数で指定したファイルが存在しない、対象の単語がファイルに無い場合、default.poの翻訳が適用されます
 
その他、文脈によって判断する「__x()」なども存在していますので、詳しくは下記の公式HPを見てください。
CakePHP3 – 国際化と地域化
 
いかがだったでしょうか?
翻訳はなかなか難しい問題がたくさんあると思いますが、上手に付き合えば様々なことに使用できると思います。
皆さんも、これを機に多言語化をしてみてはいかがでしょうか?
 
ではでは~♪♪

スポンサーリンク

POPULAR

のえる

のえる

Full-stack Developer