File_Gettext
先に紹介したPHPの標準のGettextには、日本語の文字コードがWindows-31Jになるという問題がありました(Windows版PHPの場合)。PEARのFile_Gettextを利用すれば、この問題を回避できます。File_GettextはPOファイルを直接読めるので、先のMOファイルを作る手順は省略できるようになります。File_Gettextには、標準のGettextが利用できないような環境でも利用できるというメリットもあります。
ソースコードにメッセージIDを埋め込む
メッセージIDの埋め込み方は、先の例と同じです。ただし、_
関数を再定義することはできないので、_2
としておきます。該当部分だけ以下に示します。
trans2.php
<title><?php echo _2('title') ?></title> </head> <body> <p><?php $firstName='Taro'; $lastName='YABUKI'; printf(_2('hi %s %s.'),$firstName,$lastName); ?></p>
テンプレート
ソースコードからメッセージIDを抜き出して、テンプレートを作成します(_2
の部分がメッセージIDだということを指定しています)。
xgettext -k"_2" trans2.php -o messages2.pot
POファイル(メッセージカタログ)
ロケールごとにメッセージカタログを置くためのディレクトリを作り、テンプレートをコピーします。
mkdir -p locale/ja/LC_MESSAGES mkdir -p locale/en_US/LC_MESSAGES cp messages2.pot locale/ja/LC_MESSAGES/messages2.po cp messages2.pot locale/en_US/LC_MESSAGES/messages2.po
各POファイルを作成し、UTF-8で保存します。先に示した例と同様なので、ここには載せません。添付ファイルのlocale/ja/LC_MESSAGES/messages2.poとlocale/en_US/LC_MESSAGES/messages2.poを参照してください。
POファイルの利用
File_GettextでPOファイルを利用するためには、次のような準備が必要です(I18Nv2を利用した言語の設定については別稿を参照してください)。
//パッケージのロード require_once "File/Gettext.php"; require_once 'I18Nv2/Negotiator.php'; //言語の設定 $i18n=new I18Nv2_Negotiator(); $locale=$i18n->getLocaleMatch(); //POファイルのロード $domain='messages2'; $obj = File_Gettext::factory( "PO", "./locale/$locale/LC_MESSAGES/$domain.po"); $obj->load(); $GLOBALS["messages"]=$obj->strings;
メッセージIDを指定して、ロードしたデータからメッセージ文字列を取り出すための関数_2
は次のようになります。メッセージ文字列が見つからない場合にはメッセージIDが返るようにしておきます(これは先に紹介した標準のGettextと同じ動作です)。
function _2($message) { return isset($GLOBALS["messages"][$message]) ? $GLOBALS["messages"][$message] : $message; }
全体をまとめた結果は、添付ファイル「trans2.php」を参照してください。ブラウザの言語設定で、日本語を最優先にすると日本語のメッセージ、英語を最優先にすると英語のメッセージが表示されます。