
CakePHP3でComponentを使う方法+α

どうも、のえるです。
最近、恐ろしく寒くなってきましたね。
かくいう自分は風邪でダウンしてました。
さて、今回はCakePHP3で翻訳する際のお話です。
CakePHP3は翻訳機能が搭載されており、多言語化への導入を比較的楽に行えます。
例えば、「りんご」という単語を「Apple」、「複数の窓」を「Windows」と翻訳したい場合は下記のような感じになります。
目次
1 2 3 4 5 |
# 翻訳ファイル内では「#」から始まる行はコメントになります。 msgid "りんご" msgstr "Apple" msgid "複数の窓" msgstr "Windows" |
置き換えの命令はControllerやTemplate、Elementなどで下記のように記載します。
1 2 3 4 5 |
<?php echo '私の好きなものは'.__('りんご').'です'; // 私の好きなものはAppleです echo '私の部屋には'.__('複数の窓').'があります'; // 私の部屋にはWindowsがあります |
上記のように「msgid」に書いたキーワードを「msgstr」に書いた文字に置き換えてくれます。
(CakePHP3 – 翻訳の機能を利用する)
ただし、これには少し注意が必要です。
何故、注意が必要なのでしょうか?
それは、「時計」という単語が画面に2か所配置されていたとして、1つは「Clock」、もう1つは「Watch」と翻訳したい場合など、
同一画面で同一の単語を、それぞれ別の単語に翻訳する場合です。
まずは上記のように翻訳ファイルを作ってみましょう。
1 2 3 4 5 |
# 翻訳ファイル内では「#」から始まる行はコメントになります。 msgid "時計" msgstr "Clock" msgid "時計" msgstr "Watch" |
1 2 3 |
<?php echo '私の部屋の壁には白い'.__('時計').'があります'; echo '私の'.__('時計').'では、現在12時30分です'; |
さて、このPHPを実行した場合、何が表示されるでしょうか?
実はこのような感じになります。
1 2 3 4 5 |
<?php echo '私の部屋の壁には白い'.__('時計').'があります'; // 私の部屋の壁には白いWatchがあります echo '私の'.__('時計').'では、現在12時30分です'; // 私のWatchでは、現在12時30分です |
そう、この翻訳ファイルは同一単語があった場合、一番最後の翻訳を適用するんです。
これは困りましたね
日本語では両方とも「時計」ですが、英語では壁掛け時計を「Clock」、腕時計を「Watch」と明確に使い分けています。
これに対応させるのが「ドメイン翻訳機能」です。
(CakePHP3 – 翻訳の機能を利用する)
これは翻訳ファイルを指定して翻訳する機能で、下記のように使用することが出来ます。
1 2 3 |
# 翻訳ファイル内では「#」から始まる行はコメントになります。 msgid "時計" msgstr "Clock" |
1 2 3 |
# 翻訳ファイル内では「#」から始まる行はコメントになります。 msgid "時計" msgstr "Watch" |
1 2 3 4 5 |
<?php echo '私の部屋の壁には白い'.__('時計').'があります'; // 私の部屋の壁には白いClockがあります echo '私の'.__d('hon_yaku_2', '時計').'では、現在12時30分です'; // 私のWatchでは、現在12時30分です |
このように、ファイルを分割することで、翻訳前の単語が同じでも、別の単語への翻訳が可能です。
※「__d()」関数で指定したファイルが存在しない、対象の単語がファイルに無い場合、default.poの翻訳が適用されます
その他、文脈によって判断する「__x()」なども存在していますので、詳しくは下記の公式HPを見てください。
CakePHP3 – 国際化と地域化
いかがだったでしょうか?
翻訳はなかなか難しい問題がたくさんあると思いますが、上手に付き合えば様々なことに使用できると思います。
皆さんも、これを機に多言語化をしてみてはいかがでしょうか?
ではでは~♪♪
POPULAR
のえる
Full-stack Developer
人気記事