引き続き多言語対応で分かったことのメモ。
1.2系の多言語対応メモ(1) - Writing Some Codeでコア部分を含めた翻訳ファイルの作り方を紹介しましたが、日本のフォーラムの”日本語翻訳” フォーラム - CakePHP Users in Japanを見たところ、既にコア部分の翻訳というのは行われていました。
ただ、最新の1.2Beta(1.2.0.6311)をダウンロードしても翻訳ファイルは含まれていないので、/trunk/cake/1.2.x.x/cake/locale - CakePHP : The Rapid Development Framework for PHP - Tracの一番下にある「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' というメソッドが見つかりません
と期待通りの順番でメッセージを作ることが出来ます。
