Asial Blog

Recruit! Asialで一緒に働きませんか?

CakePHPで国際化の方法を試してみました

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
PHP
CakePHP
cakePHPでは、翻訳ファイルを使う方法と、データベースを使う方法の2種類が用意されているようです。
今回は、翻訳ファイルを使う方法を試してみたいと思います。
尚、使用したcakeのバージョンは「1.2.0.6311-beta」です。



----------------------------------------------
以下、長々と書いていますが、[CakePHP のおいしい食べ方: CakePHP1.2の簡単国際化]の方法でほぼ、そのまま動きました。
違いは、cake_1.2.0.6311-beta でmoファイルの読み込みが不具合ある部分を変更しているくらいです。
----------------------------------------------

まずは、翻訳対象にするテキストをテンプレート内で、以下のように「__(アンダースコア*2)関数」を使用して記述します。
  1. <?php __('Hello World'); ?>
__関数ですが、第1引数に文字列を渡し、第2引数はデフォルトはfalseでecho出力し、trueを渡すと戻り値として返却になります。
(※basics.phpに関数定義されています。)
そして、cakeのコンソールを使って翻訳ファイルを作成します。
  1. $ /path/to/myproject/cake/console/cake i18n
  2. Hello yoshiki,
  3. Welcome to CakePHP v1.2.0.6311 beta Console
  4. ---------------------------------------------------------------
  5. What is the full path you would like to extract?
  6. Example: /data/myapp
  7. [Q]uit  
  8. [Q] > /path/to/myproject/app #対象ディレクトをフルパスで指定
  9. What is the full path you would like to output?
  10. Example: /path/to/myproject/app/locale
  11. [Q]uit  
  12. [/path/to/myproject/app/locale] >  ## デフォルトのままlocaleを使用
  13. I18n Shell
  14. ---------------------------------------------------------------
  15. [E]xtract POT file from sources
  16. [I]nitialize i18n database table
  17. [H]elp
  18. [Q]uit
  19. What would you like to do? (E/I/H/Q) 
  20. > E ##Eを選択
  21. Extracting...
  22. ---------------------------------------------------------------
  23. Path: /path/to/myproject/app
  24. Output Directory: /path/to/myproject/app/locale/
  25. ---------------------------------------------------------------
  26. Would you like to merge all translations into one file? (y/n) 
  27. [y] > ## yes
  28. What should we name this file?  
  29. [default] >  ## defaultを使用
  30. Processing /path/to/myproject/app/index.php...
  31. Processing /path/to/myproject/app/config/acl.ini.php...
  32. Processing /path/to/myproject/app/config/bootstrap.php...
  33. Processing /path/to/myproject/app/config/core.php...
  34. Processing /path/to/myproject/app/config/inflections.php...
  35. Processing /path/to/myproject/app/config/routes.php...
  36. Processing /path/to/myproject/app/config/sql/db_acl.php...
  37. Processing /path/to/myproject/app/config/sql/i18n.php...
  38. Processing /path/to/myproject/app/config/sql/sessions.php...
  39. Processing /path/to/myproject/app/views/layouts/default.ctp...
  40. Processing /path/to/myproject/app/views/layouts/flash.ctp...
  41. Processing /path/to/myproject/app/views/pages/home.ctp...
  42. Processing /path/to/myproject/app/webroot/css.php...
  43. Processing /path/to/myproject/app/webroot/index.php...
  44. Processing /path/to/myproject/app/webroot/test.php...
  45. Processing /path/to/myproject/app/webroot/js/vendors.php...
  46. Done.
  47. ---------------------------------------------------------------
  48. I18n Shell
  49. ---------------------------------------------------------------
  50. [E]xtract POT file from sources
  51. [I]nitialize i18n database table
  52. [H]elp
  53. [Q]uit
  54. What would you like to do? (E/I/H/Q) 
  55. > Q ## 終了

これで、
  1. /path/to/myproject/app/locale/default.pot  
が、作成されます。

次に、日本語用のディレクトリ 「/jpn/LC_MESSAGES」 を作成します。
  1. $ mkdir -p  /path/to/myproject/app/locale/jpn/LC_MESSAGES
default.pot を 作成したディレクトリにdefault.poのファイル名でコピーします。
  1. $ 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を使った方法も試してみたいと思います。