2008年02月26日

CakePHP1.2の簡単国際化

CakePHP1.2のbakeで自動生成した画面は、画面に表示される文字列が__('文字列') で囲まれています。これは、簡単に多言語翻訳ができるように配慮されているからです。

ここを無理やり日本語に書き換えても日本語化はできますが、せっかくなので、最初から国際化をにらんで、poファイルを生成、編集して日本語化を進めてもよいのではないか、と思います。

CakePHP1.2はgettextを使用した翻訳と流れは同じです。
http://ja.wikipedia.org/wiki/Gettext

(1)アプリで使用する文字リソース(メッセージ類)は、__('')で囲む

 こうしておくと、自動的に翻訳ファイルを作ってくれるのでこのルールは守りましょう。ちなみに、中のメッセージは英語で作り続けるのがよいと思います。

 *追記* 値を代入するような場合には、
$message = __('Message test!', true);
echo __('testtest', true);
などとできます。 

(2)consoleから、翻訳リソースファイルを作成

consoleフォルダに降りて、
> cake i18n
を実行します。

Welcome to CakePHP v1.2.0.6311 beta Console
---------------------------------------------------------------
What is the full path you would like to extract?
Example: C:\Program Files\xampp\htdocs\cake12\myapp
[Q]uit
[Q] >

と表示されるので、自分のアプリケーションのパスを指定しましょう。

[Q] > C:\Program Files\xampp\htdocs\アプリフォルダ
What is the full path you would like to output?
Example: C:\Program Files\xampp\htdocs\アプリフォルダ\locale
[Q]uit
[C:\Program Files\xampp\htdocs\アプリフォルダ\locale] >
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)
>

ここで、Eを選択すると、Cakeが自分でプロジェクトファイルを調べまわって、翻訳リスト一覧を作成します。localeフォルダの中にある、default.pot ファイルはテキストファイルなので、適当に中身を見てみましょう。文章で書くと面倒そうですが、案外、短い時間でできあがってしまいます。

(3)日本語リソースフォルダの作成

\locale\jpn\LC_MESSAGES というフォルダを作成し、(2)で生成されたファイルを、"default.po"という名前にしてコピーします。

(4)翻訳

Windows上であれば、poeditが良いのではないか、と思います。

Poedit is cross-platform gettext catalogs (.po files) editor.
http://www.poedit.net/

翻訳メモリもついた、かしこい?翻訳リソース専用エディタです。[カタログ]⇒[設定]から、この翻訳ファイルに関する情報を追加できますが、その際、[複数形:]というところを、
nplurals=1; plural=0;
としておきましょう。
あとは、リソースを適当に訳してみます。

(5)ブラウザで確認。

適当に訳したところで、poファイルを上書き保存します。できたところで、自分のCakePHPアプリケーションを動かしてみましょう。勝手に日本語化されています。これは、HTTP_ACCEPT_LANGUAGEの値を見て、自動で切り替えているからです。

じゃあ、この設定を自分で決めたい場合にはどうするか、というと、どこかの beforeFilter() などに、

Configure::write('Config.language',"en");

と書いておくと、強制的に言語を指定できます。

ちなみに、新しい文字列をページに追加した場合には、(2)をもう一度実行すると、最新のpotファイルが作られます。それから、poeditの[カタログ]⇒[POTファイルを元に更新します]を選択し、新しくできた“potファイル”を指定すると、新しく加わった文字列を自動的に、今あるpoファイルに取り込んでくれます。

※国際化文字列をDBに保存したい、という場合には、
pm11op のブログ
cake_1.2 pre-beta での多言語対応のメモ
とか、
GoogleGroup
i18n translation in db tables - how to do this like Symfony?
などが良いのではないか、と思います。

このあたり、1.2からは本格的な国際化アプリケーションが作りやすくなっていると思います。現状Akelosは、「まぁPHPだから配列ベースの翻訳ファイルでいいか」と妥協している(?)んですが、Cakeは、poファイルでの翻訳リソースになっているので、各種の外部ツールを使ったり、逆にPHP以外のプロジェクトからの言語データファイルの流用がしやすくなっているのではないでしょうか。
ラベル:cakephp i18n
posted by SDozono at 21:01| 東京 ☁| Comment(1) | TrackBack(6) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。