[CakePHP] 国際化と洒落込む

CakePHPを使っていくつかのテストをしているところ。外国人さんとの交流も多いし、世の中UTF-8な感じになっているし、ここは一つ国際化と洒落込むことにする。

ほとんどのサイトでC言語を思い出させる%sを使ってのサンプルが出てこない。そして手動で作った.poファイルは、この部分だけどうしても受け付けてくれない。

手動で作るのをあきらめ、仕方なくコンソールへ落ちて作業し、peditを使って出力して、何がどうなっているのかを見てみる。

スポンサードリンク

テストソースはこんな感じ

引数を持つもの

<?php echo sprintf(__('Welcome <B>%s</B>', true), $user->name); ?>

通常の固定メッセージ

<?php echo $html->link(__('Home', true), "http://" . $_SERVER["SERVER_NAME"]); ?>
<?php echo $html->link(__('Informations', true), "http://".$_SERVER["SERVER_NAME"]."/information");?>

コンソールで作業する

※ちなみに今回はさくらインターネット

Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
 The Regents of the University of California.  All rights reserved.

FreeBSD 7.1-RELEASE-p8 (SAKURA11S) #6: Mon Oct  5 17:36:52 JST 2009

Welcome to FreeBSD!

%php /home/[SakuraAcc]/cake125/cake/console/cake.php -app /home/[SakuraAcc]/www/foo.bar.jp/app/ i18n

Welcome to CakePHP v1.2.4.8284 Console
---------------------------------------------------------------
App : app
Path: /home/[SakuraAcc]/www/foo.bar.jp/app
---------------------------------------------------------------
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
What is the full path you would like to extract?
Example: /home/[SakuraAcc]/www/foo.bar.jp/myapp
[Q]uit
[/home/[SakuraAcc]/www/foo.bar.jp/app] >
What is the full path you would like to output?
Example: /home/[SakuraAcc]/www/foo.bar.jp/app/locale
[Q]uit
[/home/[SakuraAcc]/www/foo.bar.jp/app/locale] >

Extracting...
---------------------------------------------------------------
Path: /home/[SakuraAcc]/www/foo.bar.jp/app
Output Directory: /home/[SakuraAcc]/www/foo.bar.jp/app/locale/
---------------------------------------------------------------
Would you like to merge all translations into one file? (y/n)
[y] > y
What should we name this file?
[default] >
Processing /home/[SakuraAcc]/www/foo.bar.jp/app/app_controller.php...
・
・
・
Processing /home/[SakuraAcc]/www/foo.bar.jp/app/webroot/index.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
%

要約すると

目的のものを呼び出して

%php /home/[SakuraAcc]/cake125/cake/console/cake.php -app /home/[SakuraAcc]/www/foo.bar.jp/app/ i18n
What would you like to do? (E/I/H/Q)
> e

あとはデフォルトで

[/home/[SakuraAcc]/www/foo.bar.jp/app] >
[/home/[SakuraAcc]/www/foo.bar.jp/app/locale] >
Would you like to merge all translations into one file? (y/n)
[y] > y
What should we name this file?
[default] >

potファイルが作成される

poteditorで作業する

potファイルをpoにリネームしてpoeditorで開き、日本語メッセージを入力して、/locale/jpn/LC_MESSAGES へアップロードする。(複数形の設定で nplurals=1; plural=0;  などと設定しておくと良いらしいが設定中にpoeditorがフリーズしたので…やってない)

moファイルが存在しなければpoファイルが読み込まれるらしいので、とりあえずこれでいい。ただし、default.poを必ず持たなければならないとCakePHPマニュアルにあるので注意する。

出来上がったテストファイル

#: /views/layouts/default.ctp:16
msgid "Welcome <B>%s</B>"
msgstr "ようこそ <B>%s</B> さん"

#: /views/layouts/default.ctp:18
msgid "Home"
msgstr "Home"

#: /views/layouts/default.ctp:20
msgid "Informations"
msgstr "お知らせ"

#: /views/layouts/default.ctp:25
msgid "SignIn"
msgstr "ログイン"

#: /views/layouts/default.ctp:28
msgid "SignOut"
msgstr "ログアウト"

コントローラの変更

コントローラの beforeFilter() に以下を設定する

App::import('core', 'l10n');
Configure::write('Config.language', 'ja');

※UA(UserAgent)などから言語を取得するらしいので検索エンジンなどへの対応が必要なら適宜すると良いらしい。

参考文献

コメント