国際化i18n(多言語化)

「internationalization (国際化)」 = i+18文字+n = 「i18n」
(「localization (地域化)」= l+10文字+n = 「l10n」)

CakePHP3、CakePHP4、CakePHP5共通です。

ソース側の記述方法
翻訳ファイルの種類
cakeコマンドでソースから翻訳ファイルを出力する
cakeコマンドでPOTファイルから各言語のpoファイルを初期化する
各言語のpoファイルの翻訳を編集する
翻訳ファイルをバイナリ変換する
翻訳ファイルの読み込み優先順位
翻訳ファイルのデフォルト言語設定

ソース側の記述方法

テンプレートなどのコードには、__('【文字列】')で書きます。

<?= $this->Form->submit(__('Submit')) ?>

可変な値を渡すには、第二引数以降を使用します。

__('input a number between {0} and {1}', 10, 20)

翻訳ファイルの種類

拡張子 用途
pot poファイルの元になるテンプレート
po 各言語の翻訳ファイル
mo 高速化のためpoファイルをバイナリ変換したファイル

cakeコマンドでソースから翻訳ファイルを出力する

i18nは下記のコマンドで起動できます。

./bin/cake i18n

POTファイルの抽出は下記でも起動できます。

./bin/cake i18n extract

コマンドはq Enterで終了します。

# ./bin/cake i18n
I18n Shell
-------------------------------------------------------------------------------
[E]xtract POT file from sources ソースからPOTファイルを抽出する
[I]nitialize a language from POT file POTファイルから言語を初期化する
[H]elp ヘルプ
[Q]uit 終了
What would you like to do? (E/I/H/Q) 何をしたいですか?
> E
Current paths: None
What is the path you would like to extract? 抽出したいパスは何ですか?
[Q]uit [D]one
[/var/www/html/cakephp/src/] >
Current paths: /var/www/html/cakephp/src/
What is the path you would like to extract? 抽出したいパスは何ですか?
[Q]uit [D]one
[/var/www/html/cakephp/templates/] >
Current paths: /var/www/html/cakephp/src/, /var/www/html/cakephp/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) CakePHPコアからメッセージを抽出しますか?
[n] >
What is the path you would like to output? 出力したいパスは何ですか?
[Q]uit
[/var/www/html/cakephp/resources/locales/] >

Extracting... 抽出中
-------------------------------------------------------------------------------
Paths:
   /var/www/html/cakephp/src/
   /var/www/html/cakephp/templates/
Output Directory: /var/www/html/cakephp/resources/locales/
-------------------------------------------------------------------------------
==========================================================================> 100%

Done.

cakeコマンドでPOTファイルから各言語のpoファイルを初期化する

# ./bin/cake i18n
I18n Shell
-------------------------------------------------------------------------------
[E]xtract POT file from sources ソースからPOTファイルを抽出する
[I]nitialize a language from POT file POTファイルから言語を初期化する
[H]elp ヘルプ
[Q]uit 終了
What would you like to do? (E/I/H/Q) 何をしたいですか?
> I
Please specify language code, e.g. `en`, `eng`, `en_US` etc. 言語コードを指定してください。 「en」、「eng」、「en_US」など。
> ja_JP
What folder? どのフォルダ?
[/var/www/html/cakephp/resources/locales/] >

Generated 2 PO files in /var/www/html/cakephp/resources/locales/ja_JP/

各言語のpoファイルの翻訳を編集する

各言語のpoファイルをテキストエディタなどで編集します。

poファイル編集ツール
poedit
https://poedit.net/download

msgid "【ソースファイルの文字列】"
msgstr "【各言語の翻訳】"

msgid "Submit"
msgstr "送信"

翻訳ファイルをバイナリ変換する

テキストファイル(.po)からバイナリファイル(.mo)へ変換して処理を高速化します。

poファイル編集ツールで変換することができます。
poedit
https://poedit.net/download

Linuxコマンドではmsgfmtで変換できます。
msgfmtはgettextパッケージに含まれるため、まずはgettextをインストールします。

Debian/Ubuntu/RaspberryPiOSでは

sudo apt-get -y install gettext

RedHat/CentOS8以降では

sudo dnf -y install gettext

RedHat/CentOS7以前では

sudo yum -y install gettext

変換コマンドは下記のようになります。

msgfmt ja.po -o ja.mo
msgfmt resources/locales/ja_JP/default.po -o resources/locales/ja_JP/default.mo

翻訳ファイルの読み込み優先順位

翻訳ファイルの優先順位は下記です。
キャッシュ=>moファイル=>poファイル

変更が反映されない場合は下記のコマンドでキャッシュを削除します。

bin/cake cache clear_all

翻訳ファイルのデフォルト言語設定

CakePHP3、CakePHP4、CakePHP5共通です。

/config/app.php

return [
……
    'App' => [
……
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
……
    ],
……
];

関連記事

スポンサーリンク

+ 演算子

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る