gettext を利用した多言語対応方法
gettext の利用例
ここでは具体的に、次のページを、mo ファイルを用いて日本語表示しましょう。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> </head> <body> <h1><?php echo _("Hello!"); ?></h1> </body> </html>
上記ページを index.php として保存します。この時点ではまだ英語のメッセージが表示されています。
それでは、これを日本語表示可能としましょう。
準備として、gettext メッセージカタログの作成方法 等を参考にして、 test1.mo ファイルを作成して、C:\temp\locale\ja_JP\LC_MESSAGES ディレクトリに配置してください。
次に以下のコードを PHP ファイルの先頭で呼び出します。
bindtextdomain("test1", "C:\Temp\locale"); bind_textdomain_codeset("test1", "UTF-8"); textdomain("test1"); setlocale(LC_ALL, 'ja_JP'); putenv('LC_ALL=ja_JP');
bindtextdomain 関数で test1 というテキストドメインのロケールパスを指定します。 bind_textdomain_codeset 関数で利用するコードセットを指定します。 testdomain 関数でテキストドメインを設定します。
次に、現在の言語を設定するために setlocale と putenv を呼び出しています。
実際のところ私の Windows 環境では setlocale はメッセージカタログの切り替えに関して役に立っていないようですが...。
putenv によって環境変数を設定することによって、正しく動作するようになります。
試しにフランス語のメッセージカタログを作成してみます。
フランス語の言語コードと国コードは、fr_FR です。メッセージカタログ (test1.po 及び test1.mo) を作成し、 ロケールディレクトリ (C:\Temp\locale) 以下の fr_FR\LC_MESSAGES 内に配置します。 (Hello はボンジュール (Bonjour) ですよね)
さらに、コード内でロケールの設定箇所を次のように書き換えます。
setlocale(LC_ALL, 'fr_FR'); putenv('LC_ALL=fr_FR');
すると、次のように表示が切り替わりました。
最後に、さらに試しにメッセージカタログを用意せずに、以下のように適当なコードを設定します。
setlocale(LC_ALL, 'da_DK'); putenv('LC_ALL=da_DK');
この場合は、以下のように _() に渡したデフォルトの文字 (英文) が表示されました。