TimeHelperを使って多言語対応の日付・時刻を表示する
CakePHP1.3からは、TimeHelperでi18nFormat()というメソッドが使えます。
http://book.cakephp.org/ja/view/1566/View-と-Helper
概要
このメソッドは、strftime()の書式を与えると、アプリケーションのロケール情報に基づいて日付・時刻を返します。
- setlocale()してからstrftime($this->Time->fromString($time))するのと何が違うの?
この機構の素晴らしいところは、アプリケーションレベルでローカライゼーションの制御ができるということです。
と言ってもよくわからないと思うので、実際に使えるところまでのチュートリアルを示します。
LC_TIMEファイルの設置
まず、このメソッドを使うにあたって、LC_TIMEファイルを設置しなければなりません。
これはubuntuやdebianの、/usr/share/i18n/locales以下にあるファイル群からコピーできます。
設置場所はapp/locale/言語/LC_TIMEです。(言語 == Configure::read('Config.language'))
<?php // in config/core.php Configure::write('Config.language' ,'ja'); ?>
とします。
$ cp /usr/share/i18n/locales/ja_JP /var/www/myapp/app/locale/ja/LC_TIME
GUIで操作する場合、フォルダではなく、ファイルをコピーしてきてリネームしてください。
使ってみる
CakePHP1.3からはTimeHelper::format($date,$format)が18nFormat()のエイリアスになっています。
この例ではi18nFormat()として使っていますが、実用的にはformat()で十分でしょう。
デフォルトのフォーマット
<?php // in View echo $this->Time->i18nFormat(time()); ?>
さて、何が表示されましたか?
”2010年03月04日”
のような表示ならば成功です。
- ”2010U5E7403U670804U65E5”みたいなよくわからん文字になる
- Gitの最新版にアップデートしてください。修正しました。
- ”2010年03月%d日”となって文字化けする
- 修正パッチを送りましたがまだ適用されてません。後にパッチを載せておきますので、使ってみてください。
フォーマットを指定する
<?php // ”2010年03月04日” echo $this->Time->i18nFormat(time(),'%x %X'); echo $this->Time->i18nFormat(time(),'%c'); // ”午前07時50分59秒” echo $this->Time->i18nFormat(time(),'%r'); // ”木” echo $this->Time->i18nFormat(time(),'%a'); // ”木曜日” echo $this->Time->i18nFormat(time(),'%A'); // ”3月” echo $this->Time->i18nFormat(time(),'%b'); echo $this->Time->i18nFormat(time(),'%B'); ?>
などなど。
ただし、WindowsなどでUTF-8のときに%Z等を使うと文字化けします。これはstrftime()の仕様に基づきます。
なお、表示結果はLC_TIMEの中身に依存します。
つまり、気に入らないならば自分好みのLC_TIMEを作れる・使えるということですね。
※ただし、中身を弄るのはツールを使わない限り難しい
何故使うのか
さて、このようなことをせずとも、setlocale()とstrftime()で実は同じことが出来ます。
しかし、レンタルサーバーなど、日本語ロケールがそもそも存在しなかったり、Windowsだと文字化けで使い物にならなかったりします。
これらはそのような問題をCakePHPが吸収してくれます。
最後に
一つ注意ですが、LC_TIMEファイルだけで(自分のコピーしたファイルは)216KBもあります。
シェイプアップしたファイルを置いておきました。これは最新版のcake/tests/test_app/locale/ja_jpのものと同等です。
http://bin.cakephp.org/view/1264346250
パッチ
ファイルが欲しい
http://github.com/hiromi2424/cakephp1x/blob/1.3/cake/libs/view/helpers/time.php
コアのファイルに上書きしてください。
補足
nice()やniceShort()は未だに多言語対応してませんでした。(tommorow と yesterday だけ)
id:cake67 さんすいません。お詫びして訂正します。
※対応するようにパッチを投げる予定でいます