アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

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を使った方法も試してみたいと思います。