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)などから言語を取得するらしいので検索エンジンなどへの対応が必要なら適宜すると良いらしい。
参考文献
- CakePHP Bakeの機能を変更してみる | WIDGET-INFO
- CakePHP/国際化と地域化 – PukiWiki
- CakePHP における国際化 :: 地域化と国際化 :: CakePHPによる作業の定石 :: マニュアル :: 1.2 Collection :: The Cookbook
- CakePHPで国際化の方法を試してみました : アシアルブログ
- CakePHP のおいしい食べ方: CakePHP1.2の簡単国際化
コメント