2008年02月26日

CakePHP1.2の簡単国際化

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

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

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

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

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

(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(0) | TrackBack(1) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/87269708
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック

[CakePHP]1.2系の多言語対応メモ(1)
Excerpt: CakePHPの1.2系から多言語機能が充実しています。 多言語対応の方法としては、翻訳テキストを使う方法(gettextを利用する場合と同等の方法)とDBを使う方法の2種類がありますが、今回の話は...
Weblog: Writing Some Code
Tracked: 2008-02-28 00:57
???i?p?[?jTo make a comment: Please type your name and comment. at the validation field box, type 'cakephp'. And there two glay buttons. "Preview"/"Submit". Thank you!