【PHP応用】 多言語対応
ウェブアプリケーションでは、場合によって、
日本語だけでなく、英語など多言語に対応する必要があります。
CakePHPでは多言語対応の仕組みとして、i18nがあります。
イメージ的には、特定の箇所の文字列を、言語ごとに作成された翻訳ファイルから読み込む形です。
POTファイルの作成(翻訳ファイルのテンプレート)
以下のコマンドで作成されます。(cake4/appディレクトリで実行)
./bin/cake i18n extract
何回か選択肢が出ますが、すべてEnterとyで回答していけば大丈夫です。
実際の出力結果を抜粋します。
PS C:\xampp\htdocs\cake4\app> ./bin/cake i18n extract Current paths: None What is the path you would like to extract? [Q]uit [D]one [C:\xampp\htdocs\cake4\app\src\] > Current paths: C:\xampp\htdocs\cake4\app\src\ What is the path you would like to extract? [Q]uit [D]one [C:\xampp\htdocs\cake4\app\templates\] > Current paths: C:\xampp\htdocs\cake4\app\src\, C:\xampp\htdocs\cake4\app\templates\ What is the path you would like to extract? [Q]uit [D]one [D] > Would you like to extract the messages from the CakePHP core? (y/n) [n] > y What is the path you would like to output? [Q]uit [C:\xampp\htdocs\cake4\app\resources\locales\] > Extracting... ------------------------------------------------------------------------------- Paths: C:\xampp\htdocs\cake4\app\src\ C:\xampp\htdocs\cake4\app\templates\ C:\xampp\htdocs\cake4\app\vendor\cakephp\cakephp\src\ Output Directory: C:\xampp\htdocs\cake4\app\resources\locales\ ------------------------------------------------------------------------------- > > > > > > > > > (後略)
言語ごとのディレクトリを作成
例えば以下の様に、英語と日本語用のディレクトリを作成しましょう。
cakephp/src/Locale/en
cakephp/src/Locale/ja
作成したディレクトリにdefault.poを配置
作成した「default.pot」 を 「default.po」にリネームして、Locale内の各フォルダに配置しましょう。
default.poを編集
cakephp/src/Locale/ja/default.po の中身を見てみましょう。
以下のようなセットがたくさん記述されています。
#: Controller/MembersController.php:54 #: Controller/MembersController.php:78 msgid "The member has been saved." msgstr "“
この中で、以下の2カ所をセットで設定していくことになります。
・msgid ⇒ 対象箇所(MembersControllerで、 __(The member has been saved.) の箇所 )
・msgstr ⇒ 適用する文字列(空文字の場合には、msgidが使用される。)
では、ここを以下の様に変えてみましょう。
#: Controller/MembersController.php:54 #: Controller/MembersController.php:78 msgid "The member has been saved." msgstr “メンバーが保存されました“
これで、日本語(ja)の場合には、msgstrが使用されるように設定ができました。
言語の切り替え方法
いくつか方法があるので、以下で紹介します。
いずれかを設定して、/cake3/Members/add ページで登録したときに、
前ページで設定した「メンバーが保存されました」が表示されればOKです。
1. デフォルトロケールの設定
「config/app.php」の以下を設定
'App' => [ ... 'defaultLocale' => env('APP_DEFAULT_LOCALE', ‘ja_JP'), ... ]
2.コントローラーで切り替え
任意のコントローラーのメソッドに、以下を追加。
I18n::setLocale(‘ja_JP’);
例)AppControllerに追加する場合
use Cake\I18n\I18n; // ← 追加 public function initialize() { I18n::setLocale('ja_JP'); // ← 追加 }
3.ブラウザの設定によってロケール切り替え
「config/app.php」の以下を設定
'App' => [ ... 'defaultLocale' => locale_accept_from_http(env('HTTP_ACCEPT_LANGUAGE', env('APP_DEFAULT_LOCALE', 'en_US'))), ... ]