CakePHPで国際化の方法を試してみました
cakePHPでは、翻訳ファイルを使う方法と、データベースを使う方法の2種類が用意されているようです。
今回は、翻訳ファイルを使う方法を試してみたいと思います。
尚、使用したcakeのバージョンは「1.2.0.6311-beta」です。
----------------------------------------------
以下、長々と書いていますが、[CakePHP のおいしい食べ方: CakePHP1.2の簡単国際化]の方法でほぼ、そのまま動きました。
違いは、cake_1.2.0.6311-beta でmoファイルの読み込みが不具合ある部分を変更しているくらいです。
----------------------------------------------
まずは、翻訳対象にするテキストをテンプレート内で、以下のように「__(アンダースコア*2)関数」を使用して記述します。
<?php __('Hello World'); ?>
__関数ですが、第1引数に文字列を渡し、第2引数はデフォルトはfalseでecho出力し、trueを渡すと戻り値として返却になります。
(※basics.phpに関数定義されています。)
そして、cakeのコンソールを使って翻訳ファイルを作成します。
$ /path/to/myproject/cake/console/cake i18n
Hello yoshiki,
Welcome to CakePHP v1.2.0.6311 beta Console
---------------------------------------------------------------
What is the full path you would like to extract?
Example: /data/myapp
[Q]uit
[Q] > /path/to/myproject/app #対象ディレクトをフルパスで指定
What is the full path you would like to output?
Example: /path/to/myproject/app/locale
[Q]uit
[/path/to/myproject/app/locale] > ## デフォルトのまま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 ##Eを選択
Extracting...
---------------------------------------------------------------
Path: /path/to/myproject/app
Output Directory: /path/to/myproject/app/locale/
---------------------------------------------------------------
Would you like to merge all translations into one file? (y/n)
[y] > ## yes
What should we name this file?
[default] > ## defaultを使用
Processing /path/to/myproject/app/index.php...
Processing /path/to/myproject/app/config/acl.ini.php...
Processing /path/to/myproject/app/config/bootstrap.php...
Processing /path/to/myproject/app/config/core.php...
Processing /path/to/myproject/app/config/inflections.php...
Processing /path/to/myproject/app/config/routes.php...
Processing /path/to/myproject/app/config/sql/db_acl.php...
Processing /path/to/myproject/app/config/sql/i18n.php...
Processing /path/to/myproject/app/config/sql/sessions.php...
Processing /path/to/myproject/app/views/layouts/default.ctp...
Processing /path/to/myproject/app/views/layouts/flash.ctp...
Processing /path/to/myproject/app/views/pages/home.ctp...
Processing /path/to/myproject/app/webroot/css.php...
Processing /path/to/myproject/app/webroot/index.php...
Processing /path/to/myproject/app/webroot/test.php...
Processing /path/to/myproject/app/webroot/js/vendors.php...
Done.
---------------------------------------------------------------
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 ## 終了
これで、
/path/to/myproject/app/locale/default.pot
が、作成されます。
次に、日本語用のディレクトリ 「/jpn/LC_MESSAGES」 を作成します。
$ mkdir -p /path/to/myproject/app/locale/jpn/LC_MESSAGES
default.pot を 作成したディレクトリにdefault.poのファイル名でコピーします。
$ cp /path/to/myproject/app/locale/default.pot /path/to/myproject/app/locale/jpn/LC_MESSAGES/default.po
後は、default.poを翻訳ファイル編集ソフトのPoeditで簡単に編集することができます。
Poeditで編集して保存した際に default.mo ファイルができるのですが、
「rev6311」のcakeでは正常にmoファイルを使えません。
最新のrevisionでは修正されているようですのでそちらを使うことにします。
※変更点
Changes in branches/1.2.x.x/cake/libs/i18n.php [6296:6622]
これで、moファイルを読み込んで使用できます。
なお、default.moファイルを作らなければ、default.poファイルを使用するように
なっていますので、default.moを作らない方法でもいいかもしれませんね。
今後の作業でテキストの追加等を行った場合は、
「cake i18n」 コマンドでまた、default.pot を作成し、
Poeditで「カタログ」→「POTファイルを元に更新します」→default.potを指定すると、変更点がマージされます。
と、CakePHPでは、こんなに簡単に国際化ができました!!
次は、DBを使った方法も試してみたいと思います。