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' というメソッドが見つかりません
と期待通りの順番でメッセージを作ることが出来ます。