Developer

【PHP応用】 多言語対応
2021.06.30
Lv2

【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'))),
...
]

PHPWEBプログラミング講座 連載目次リンク

PHPWEBプログラミング講座 連載目次