1.2系の多言語対応メモ(3)

引き続き多言語対応で分かったことのメモ。

コア部分の翻訳ファイルは存在した

1.2系の多言語対応メモ(1) - Writing Some Codeでコア部分を含めた翻訳ファイルの作り方を紹介しましたが、日本のフォーラムのhttp://cakephp.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=289&forum=11を見たところ、既にコア部分の翻訳というのは行われていました。

ただ、最新の1.2Beta(1.2.0.6311)をダウンロードしても翻訳ファイルは含まれていないので、https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/locale?rev=4387の一番下にある「Zip Archive」のリンクからダウンロードして、解凍したものをapp/localeにコピーする必要があります。

I18nクラスを見たところcore.mo(.po)ファイルをマージして読み込むようになっていたので、コア部分の翻訳はこちらに書くのがCakePHP的には正しそうです。

ちなみに、この翻訳ファイルは1年以上前のものなので、この翻訳ファイルに含まれていないメッセージも沢山追加されていて、それらは自分で翻訳する必要があります。


言語によってメッセージの引数の順番が異なる場合の対応

例えば英語で

msgid "Missing Method '%s' in '%s'"
msgstr "Missing Method '%s' in '%s'"

というメッセージを日本語では

msgid "Missing Method '%s' in '%s'"
msgstr "'%s' に '%s' というメソッドが見つかりません "

と訳したとき、実際に

<?php 
 echo sprintf(__("Missing Method '%s' in '%s'", true), "hogeMethod", "HogeController"); 
?>

と出力するとそれぞれの言語では以下の様になります。

英語での出力
Missing Method 'hogeMethod' in 'HogeController'
日本語での出力
'hogeMethod' に 'HogeController' というメソッドが見つかりません 

上記の通り、日本語では「'メソッド名'に'コントローラー名'というメソッドが〜」と語順があべこべになってしまいます。

これを解消する為、日本語のmsgstrでは引数の交換を行うように

msgstr "'%2$s' に '%1$s' というメソッドが見つかりません "

という引数の順番を意識したメッセージにします。すると

【出力】
'HogeController' に 'hogeMethod' というメソッドが見つかりません 

と期待通りの順番でメッセージを作ることが出来ます。

参照:PHP: sprintf - Manual