Translation2
Translation2もメッセージファイルの国際化・地域化のためのライブラリです。Gettextだけでなく、データベースやXMLファイルを使うこともできますが、先に述べたように、gettextによる開発が事実上の標準になっているので、ここではTranslation2でgettextを使う方法のみを紹介します。
ソースコードにメッセージIDを埋め込む
ソースコードにメッセージIDを埋め込む方法はこれまでとあまり変わりませんが、ここでは、_
や_2
ではなく、$tr->get
としておきます。該当部分だけ以下に示します。
<title><?php echo $tr->get('title') ?></title> </head> <body> <p><?php $firstName='Taro'; $lastName='YABUKI'; printf($tr->get('hi %s %s.'),$firstName,$lastName); ?></p>
Translation2には、&&識別子&&
という文字列を使って、メッセージ文字列にパラメータを埋め込む仕組みが用意されています。しかしながらこの方法はTranslation2でしか使えない独自のものなので、先に紹介した数値$
を利用した方がいいでしょう(メッセージIDの書き方は、先に紹介した2つの手法の場合と同じです)。
テンプレート
ソースコードからメッセージIDを抜き出して、テンプレートを作成します(get
の部分がメッセージIDだということを指定しています)。
xgettext -k"get" trans3.php -o messages3.pot
POファイル(メッセージカタログ)
ロケールごとにメッセージカタログを置くためのディレクトリを作り、テンプレートをコピーします。
mkdir -p locale/ja/LC_MESSAGES mkdir -p locale/en_US/LC_MESSAGES cp messages3.pot locale/ja/LC_MESSAGES/messages3.po cp messages3.pot locale/en_US/LC_MESSAGES/messages3.po
各POファイルを作成し、UTF-8で保存します(添付ファイルのlocale/ja/LC_MESSAGES/messages3.poとlocale/en_US/LC_MESSAGES/messages3.poを参照してください)。
設定ファイル
利用可能なロケールのリストをファイル「langs.ini」に書きます。
[en_US] name = English encoding = iso-8859-1 [ja] name = Japanese encoding = UTF-8
さらに、ドメインとディレクトリの関係をファイル「domains.ini」に書きます(これは、標準のGetttextのbindtextdomain
関数に相当します)。
messages3 = ./locale
POファイルの利用
作成したPOファイルを利用するためには、次のような準備が必要です。
//パッケージのロード require_once 'I18Nv2/Negotiator.php'; require_once 'Translation2.php'; //パラメータを指定してTranslation2のインスタンスを生成 $params = array( 'prefetch'=> false, 'langs_avail_file' => './langs.ini', 'domains_path_file' => './domains.ini', 'default_domain'=> 'messages3', 'file_type' => 'po', ); $tr=Translation2::factory('gettext', $params); //ロケールの設定 $i18n=new I18Nv2_Negotiator(); $tr->setLang($i18n->getLocaleMatch());
$tr->get(メッセージID)
によってメッセージ文字列を取得できます。全体のソースコードは添付ファイルの「trans3.php」を参照してください。
ブラウザの言語設定で、日本語を最優先にすると日本語のメッセージ、英語を最優先にすると英語のメッセージが表示されます。
おわりに
Gettextを利用してメッセージ文字列を国際化・地域化する方法を3つ紹介しました。
最初に紹介したPHP標準のGettextを利用する方法には、Windows版PHPの日本語ロケールが原因の問題がありました。Gettextを利用するだけならば、2番目に紹介したFile_Gettextで十分でしょう。実際、3番目に紹介したTranslation2も、内部ではFile_Gettextを利用しています。本稿では紹介しませんでしたが、gettext以外の方法を利用したい場合には、Translation2を検討するといいでしょう。
参考文献
- 『PHPライブラリコレクション』 山田祥寛 著、翔泳社、2008年1月
- 『Inside Linux Software』 佐藤竜一 著、翔泳社、2007年3月