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');

この場合は、以下のように _() に渡したデフォルトの文字 (英文) が表示されました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説