CakePHPの国際化関数
PHPの標準関数で国際化(ローカライズ)を行うのにgettext()
やdgettext()
という関数がありますが、CakePHPではこれらの関数をラップした専用の関数を使います。
基本的には、Viewの中で__()
や__d()
といった言語変換用の関数をよく使います。
<html> <body> <input type="button" value="<?php echo __('Push me!') ?>"> </body> </html>
html-script: true
例えば上記のように、キーとなる翻訳対象の文字列を__()
関数でくくり、辞書ファイルに対応する文字列を登録しておくと、ロケールに合わせて日本語ブラウザなら、その他言語ならそのままというふうに、ボタンを表示することができます。
基本的には上記例のように__()
という関数だけで事足りるのですが、CakePHPの公式サイトを眺めていると、他にも似たような翻訳用の関数がたくさんあるようで、何がどう違うのか調べてみました。
国際化関数がたくさんある
基本は__()
と__c()
と__d()
と__n()
があり、カテゴリ指定、ドメイン指定、個数指定が可能な関数が用意されています。また、残りの__dc()
と__dn()
と__dcn()
は、これら関数の組み合わせとなります。
以下、それぞれの簡単な説明と例です。
関数名 | 説明 | プログラム例 | 辞書ファイルの位置例 | 出力例 |
---|---|---|---|---|
__() |
辞書ファイルに対応する文字列があれば出力 | __('hoge') |
app/Locale/jpn/LC_MESSAGES/default.po | ほげ |
__c() |
指定したカテゴリにある辞書ファイルを参照 | __c('%d-%d-%d', LC_TIME, 2014, 6, 4) |
app/Locale/jpn/LC_TIME/default.po | 2014年6月4日 |
__d() |
指定したドメインの辞書ファイルを参照 | __d('dev', 'huge') |
app/Locale/jpn/LC_MESSAGES/dev.po | ふげ |
__n() |
指定の数によって単数/複数に合わせて辞書に対応する文字列を出力 | __n('apple', 'apples', 99) |
app/Locale/jpn/LC_MESSAGES/default.po | リンゴ達 |
__dc() |
上記__d() と__c() の組み合せ |
__dc('dev', 'hege', LC_MONETARY) |
app/Locale/jpn/LC_MONETARY/dev.po | へげ |
__dn() |
上記__d() と__n() の組み合せ |
__dn('dev', 'apple', 'apples', 99) |
app/Locale/jpn/LC_MESSAGES/dev.po | リンゴ達 |
__dcn() |
上記__d() と__c() と__n() の組み合せ |
__dcn('dev', 'apple', 'apples', 1, LC_ALL) |
app/Locale/jpn/LC_ALL/dev.po | リンゴ |
(※辞書ファイルの記述例は省略しています)
ドメインとは、辞書ファイル名になる部分の文字列で、未指定の場合は default が使用されます。
カテゴリとは以下のロケール用の定数で、各種用途により作成したディレクトリに辞書ファイルを格納するようになります。定義値の数値を指定してもOKですが、なるべく定数名を使用しましょう。未指定の場合は LC_MESSAGES が使用されます。
定数名 | 定義値 | 意味 |
---|---|---|
LC_ALL | 0 | 全てのカテゴリ用 |
LC_COLLATE | 1 | 比較用 |
LC_CTYPE | 2 | 文字の変換/分類用 |
LC_MONETARY | 3 | 通過フォーマット用 |
LC_NUMERIC | 4 | 数字の区切り文字用 |
LC_TIME | 5 | 日時用 |
LC_MESSAGES | 6 | システムメッセージ用 |
(※PHPのコンパイルオプションによっては定数LC_MESSAGES
を指定するとエラーや警告が出る場合があります。なるべくI18n::LC_MESSAGES
のように頭にI18n
パッケージ名を付けてあげる方がいいようです。)
以上、ご参考になれば幸いです。
確認したバージョン
- CakePHP 2.5.1
- PHP 5.4.17(Windowsバイナリ)