TimeHelperを使って多言語対応の日付・時刻を表示する

CakePHP1.3からは、TimeHelperでi18nFormat()というメソッドが使えます。
http://book.cakephp.org/ja/view/1566/View-と-Helper

概要

このメソッドは、strftime()の書式を与えると、アプリケーションのロケール情報に基づいて日付・時刻を返します。

  1. setlocale()してからstrftime($this->Time->fromString($time))するのと何が違うの?

この機構の素晴らしいところは、アプリケーションレベルでローカライゼーションの制御ができるということです。
と言ってもよくわからないと思うので、実際に使えるところまでのチュートリアルを示します。

LC_TIMEファイルの設置

まず、このメソッドを使うにあたって、LC_TIMEファイルを設置しなければなりません。
これはubuntudebianの、/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日”
のような表示ならば成功です。

  1. ”2010U5E7403U670804U65E5”みたいなよくわからん文字になる
    1. Gitの最新版にアップデートしてください。修正しました。
  2. ”2010年03月%d日”となって文字化けする
    1. 修正パッチを送りましたがまだ適用されてません。後にパッチを載せておきますので、使ってみてください。
フォーマットを指定する
<?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 さんすいません。お詫びして訂正します。
※対応するようにパッチを投げる予定でいます