読者です 読者をやめる 読者になる 読者になる

CakePHPで言語ファイルを作成する

何回やっても忘れるので、覚書程度に
4.8.1 アプリケーションを地域化する

前準備

前準備として、言語ごとに切り替えたい文言を「("文言")」のように括っておく。
単純にそのまま呼び出すと値を出力しようとするので、変数などに入れる場合は「
("文言", true)」とする

`__("Hello");` // これは出力される  
`$val = __("Hello", true);` // これは$valに値が入る

初期の言語ファイルを作成する

はじめにアプリケーション内で使用されている文言を集めて一つの言語ファイルを作成する
これは、コンソールを使って出力できる

以下のようにして出力のシェルを叩くと対話形式のシェルが始まるので適宜回答していく
$ ./cake/console/cake i18n

[E]xtract POT file from sources  
[I]nitialize i18n database table  
[H]elp  
[Q]uit  
What would you like to do? (E/I/H/Q)  
>  # Eを入力する。POTファイルを生成する

What is the full path you would like to extract?  
Example: /path/to/app  
[Q]uit [D]one  
[/] > # アプリのパスを入力する

What is the full path you would like to output?  
Example: /path/to/app/locale  
[Q]uit  
[/path/to/app/locale] > # 翻訳ファイルの出力先を入力する

Would you like to merge all domains strings into the default.pot file? (y/n)  
[n] > # yを入力する。翻訳ファイルをまとめる

Extracting...  
(中略)

Error: default.pot already exists in this location. Overwrite? [Y]es, [N]o, [A]ll (y/n/a)  
[y] > # yを入力する。既に翻訳ファイルが存在しているなら上書き

Donh.  
 ---------------------------------------------------------------    I18n Shell  
 ---------------------------------------------------------------    [E]xtract POT file from sources  
[I]nitialize i18n database table  
[H]elp  
[Q]uit  
What would you like to do? (E/I/H/Q)  
>  # Qを入力する。シェルを終了

そうすると翻訳ファイル(default.pot)が出力先に出力される。

各言語用の言語ファイルを作成する

前項で作成されたdefault.potをPoeditで開くと、
__("")で囲まれた単語の一覧が表示されるので対訳を入力していく

入力できたら、別名で保存しておく

保存時にエラーが出た場合

「field `Language-Team' still has initial default value」のようなエラーが出たら、以下を修正しておく
メニューから「カタログ」→「設定」→「情報」の欄を登録する。また、複数形の問題は、以下を参照
 CakePHP 日本語化翻訳データの編集にPoeditを使う

元になるdefault.potが更新された場合

翻訳ファイルを作成開始後に元になるdefault.potが更新された場合は、以下の手順で対応する
1.入力中の言語ファイルを開く
2.メニューより「カタログ」→「POTファイルを元に更新します」を選択し、default.potを読み込む

翻訳されていない文言の取り扱い

翻訳後に置き換えされないだけなので、実害は無し

言語ファイルをアップロードする

作成した言語ファイルは、以下のディレクトリにアップロードする
/path/to/app/locale/『eng』/LC_MESSAGES/

『eng』は3文字のロケールコードになるので、以下を参考にして作成しておく
http://www.loc.gov/standards/iso639-2/php/code_list.php