CakePHPでgettext
ハマりにハマったので、どうすればいいかだけさくっと書いてみる。
一応断っておくと、PHPは5.2.5、Cakeのバージョンは1.2.0.7692-rc3。
また僕は、そもそもgettextを使ったことすらなかったので、poファイルの仕組みすら分からなかった。
まあ、PHPはgettextを扱えるように、コンパイルし直すなり、パッケージいれるなりすべし。これの説明は各所にあるので略。
このpoファイルの生成に関しては、
% cake i18n
だけでよろし。足りなければ同じような文法で書いていけばおk。で、これを生成するためには、テンプレ側で、言語毎に切り替えたいところを
<?php __('hogehoge') ?>
で置き換えてあげる。__()関数についても各所に説明があるので略。引数のhogehogeは単なるキーで、poファイル内でキーに一致するものがあれば、そちらに切り替わる。一致するものがなければキーがそのまま出力されるので、できればディフォルト言語の文字列を入れてあげるのがいい。
実際に言語の指定をするところはコントローラで。パラメータをどっかで受け取って、言語指定の部分を書きかえる。で、今気づいたんだけど、あちこちのブログで、
// in method... uses('L10n'); $lang = 'en'; $this->L10n = new L10n; $this->L10n->get($lang); Configure::write('Config.language', $lang);
とゆー感じで書いておいて、更に
$this->Session->write('Config.language', $lang);
まで書くような記述があるけど、僕の手元の開発環境だと、最後のセッションに入れる行だけ書いてあれば、普通に切り替わってくれる。むしろ他がいらない。どーゆーこっちゃ。
また、僕の環境のemacsだと、po-modeにした時に文字が化けまくって、それが原因で動いてないと気づくまでこれまたかなり時間がかかった。文字化けするようなら、vimとかでさくっとやるのがいいかも。