国際化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'), …… ], …… ];
関連記事
- 複数カラムのユニーク制約バリデーション
- 標準のValidatorを拡張してカスタマイズする方法
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法 CakePHP2
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP5系の入手方法・インストール方法
- CakePHP4系の入手方法・インストール方法
- CakePHP3系の入手方法・インストール方法
- CakePHP2系の入手方法・インストール方法
- CakePHP1系(CakePHP1.3)をPHP7・PHP8以降に対応させる方法
- CakePHP1系(CakePHP1.3)の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- CakePHPのバージョンごとのシステム要件
- 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
- PHP Strict Standards: Non-static method と出る場合の対処法
- CakePHPでカラムを比較してSELECTする方法
- [CakePHPのバグ]キャッシュ処理でunlinkエラーが発生する
- 『id』以外のプライマリキーのカラム名を使用する方法
- [CakePHPのバグ]キャッシュ処理でunserializeエラーが発生する
- プライマリキーIDを連番数字ではなく推測しにくい文字列にする方法
- 複数のデータベースを切り替える方法(別データベースを使用する)
- MySQLで文字化けを防ぐ方法
- action名にlistは使えない listを使う方法
- ログイン認証処理をする方法
- CakePHP、Symfony、Zend Frameworkの比較
- CakePHPのDB接続情報設定
- ファイル読み込みPATHを設定
- デバッグレベルを設定
- セキュリティレベルの設定
- キャッシュを有効にする
- CakePHPのエラーテンプレートの一覧
- データベーステーブルを参照しないページを作る
- TOPページはIndexControllerではない Cannot redeclare config()
- ディレクトリ構成
- CakePHP
スポンサーリンク