CakePHP1.2で気軽に違うデザインの多言語対応(ちょっとbypath)

翻訳ファイルの処理について言っておくこと

  • bakeコマンドは使用しません。
  • moファイル使わない、potファイル生成しない。
  • すべて、poファイルを手動で管理。

正式なやり方でやりたい場合下記をご参照ください。

CakePHP のおいしい食べ方 CakePHP1.2の簡単国際化

想定した要件

  • 英語と日本語をサポート想定する
  • 英語と日本語のデザインが多少違う、よって使用するいくつ特定のテンプレートは違う、でもテンプレートの名前同じにしたい
  • 英語と日本語は同じコントローラ、同じモデルを使用する

[Step1]翻訳ファイルを用意

下記のようなディレクトリとファイルを作成

  • /locale/eng/LC_MESSAGES/default.po の中身
#コメントは「#」を先頭に置いて書く
msgid "Language"
msgstr "English"

  • /locale/jpn/LC_MESSAGES/default.po の中身
#コメントは「#」を先頭に置いて書く
msgid "Language"
msgstr "日本語"

msgid "My name is %s."
msgstr "私の名前は%sです。"

...

[Step2]英語サイトをプラグインとして用意

要件の同じコントローラ、モデルで違うテンプレートに満たすために英語サイトをプラグインにしちゃいました。
このように↓

ちなみにこのプラグインのcontrollersとmodelsを基本的になにも書かなくてよい。

代わりに、親のcontrollersとmodelsを呼び出すためにen_app_controller.phpをこのように必要なcontrollerをimportする必要がある!
en_app_controller.phpの中身

/**
 * 検索画面
 *
 **/
App::import('Controller', 'Search');

/**
 * 詳細画面
 **/
App::import('Controller', 'View');

class EnAppController extends AppController {
}

[Step3]魔法の__()を使って、好きなところに翻訳文を書く

__("Language");  //翻訳文は自動echoされます。テンプレート用
__("Language",true);//翻訳文はreturn値として返します。プログラムの引数として利用

ちなみに、このような使い方もできます。

echo sprintf(__("My name is %s.", "bennylee"));
//日本語: 私の名前はbennyleeです。
//英語:  My name is bennylee.

※注意:翻訳文がない場合そのまま引数が出力されます。

echo __("unknow",true);
//日本語: unknow
//英語:  unknow

これを利用して、英語のpoファイルはほとんどなにも書かなくてよいw

[Step4]翻訳文が更新される場合

翻訳文を更新するには該当言語のpoファイルを弄るだけでOK
でも、poファイルが初めて実行される際、キャッシュファイルが自動生成されます!
poファイルを修正するたびに必ず手動で下記のキャッシュファイルを削除しなければなりません。

/app/tmp/persistent/cake_core_***_eng
/app/tmp/persistent/cake_core_***_jpn

※注意:新しい言語を追加した場合例えば中国語のpoファイルを新しく作りました。
この際に/app/tmp/persistent/cake_core_core_pathsも削除しなければなりません。

最後

あまりにも強引なやり方しか見えませんが、ご参考になれればうれしいです。

もっといい方法があれば、ぜひ教えてくださいm(_ _)m