はじめに
CakePHP5で日本語版と英語版を切り替える必要があったので、覚書として手順を記録しておこうと思いました。
やるべきこと
基本的には
CakePHP 5.x Chiffon Book 国際化と地域化
の通りです。
翻訳対象は__()形式で記述
templateファイルで
<h2>お問合せ</h2>
を
<h2><?= __('お問合せ') ?></h2>
と記述することで__() の中の文字列の翻訳が表示されるので、出力したい文字列は全て__()にすることが必要です。
デフォルトの言語を設定
今回は日本語のアプリを多言語化する前提なので、
config/app.php ファイルの App.defaultLocaleを
'App' => [
...
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
...
]
に設定します。
言語ファイルの書き出し
bin/cake i18n extract
これで
resources/locales/
に
default.pot
という言語ファイルが生成されます
今回は英語(米語)版を作成するので
/resources
/locales
/en_US
default.po
となるようにresources/locales/default.potを
resources/locales/en_US/にコピーして拡張子を.poにリネームします。
言語ファイルの翻訳
編集はpoeditを使うと便利です
resources/locales/en_US/default.po
をpoeditで開き、左側の日本語に対応する英語を右側に記述して保存します。
アプリでの切り替え
今回はメニューにJP/USの切り替えボタンを国旗で表示して切り替えることにしました。
$this->session->write('Config.language', $lang);
$arr = ['ja' => 'ja_JP', 'en' => 'en_US'];
I18n::setLocale($arr[$lang]);
詳細は省きますが、切り替えボタンが押されたらConfig.languageを書き換えて言語を切り替えています。
変更があった場合
できれば日本語で全て完成した後に言語だけ翻訳できればいいんですが、仕様変更やら機能追加やらバージョンアップやら大人の事情やらで日本語部分が変更になったりします。
例えば
「支払い」→「支払」など
元となる記述が変わると対応する翻訳も変更しないといけません。
この場合は
-
言語ファイルを再度書き出し
-
poeditでresources/locales/en_US/default.poを開く
翻訳>POTファイルから更新 で再度書き出したresources/locales/default.potを指定する

-
追加/変更になった箇所を翻訳して保存
-
tmp/cache/persistent/myapp_cake_core_translations.default.en_USを削除
で対応します。
4.の削除を忘れると「翻訳を変更したのに反映されない」が起こるので要注意。