PHP での Gettext の使用法
gettext プログラムは Linux/Unix の世界では非常に一般的ですが、一般の人が日常的に使用する機会はあまりありません。これは、アプリケーションに国際化サポートを追加するために使用されます。たとえば、プログラム内の文字列リソースがプログラム ソース ファイルにハードコーディングされておらず、言語パック ファイルとして存在する場合は、言語パック ファイルを追加することでプログラム インターフェイスの言語を変更できます。 gettext はこのようなことを行うことができます。
gettext 拡張機能は Windows の PHP5 にすでに含まれており、Zend Server にもこの拡張機能があります。 php.ini ファイル内の「extension=php_gettext.dll」の前のセミコロンを削除し、Apache を再起動します。すべてが正常であれば、phpinfo() の出力に gettext セクションが存在するはずです。ここでは、gettext を使用して複数の言語をサポートする方法を示す簡単な「Hello World」の例を示します。
次の内容の PHP ファイル test.php を作成します:
putenv("LANG=zh_CN");
bindtextdomain('test', './) locale ');
textdomain('test');
echo gettext('Hello World!');
?> コードの最初の 2 行は、ロケールを簡体字中国語に設定します。 bindtextdomain は、ドメイン テストのディレクトリを現在のディレクトリ下のロケール ディレクトリに設定します。 textdomain('text') は、gettext 関数がテスト ドメインに移動して置換文字列を見つける必要があることを PHP インタープリタに指示します。
このファイルをブラウザで開くと、結果が「Hello World」となっていることがわかりますが、中国語言語パックがまだ生成されていないため、そのまま出力されています。ソースプログラムを変更せずにブラウザで中国語を出力できるようにするには、PO ファイルと MO ファイルの 2 つのファイルを用意する必要があります。これら 2 つのファイルを取得するには、xgettext プログラムと msgfmt プログラムを使用する必要があります。 Windows ユーザーは、GnuWin32 にアクセスして、これら 2 つのプログラムを含む GetText ソフトウェア パッケージをダウンロードできます。
次に、対応するディレクトリ構造を作成します。 test.php ディレクトリに「localezh_CNLC_MESSAGES」などのディレクトリを作成します。ディレクトリ名 zh_CN は、コード内の言語名 zh_CN と同じである必要があります。次にコマンド プロンプトで次のコマンドを実行します:
xgettext -d test test.php
「-d test」はドメインが「test」であることを意味し、現在のディレクトリに test.po ファイルが生成されます。テキストエディタで開き、次の変更を加えます:
…
“Content-Type: text/plain; charset=GB2312n”
“Content-Transfer-Encoding: 8bitn”
#: test.php:11
msgid “ Hello World!"
msgstr "Hello, world! "
文字セットを中国語エンコーディング「GB2312」に設定し、対応する msgid 内の英語の文字列を中国語に翻訳し、以下の msgstr に入力します。次に msgfmt を使用して MO ファイルを生成します。 MO はバイナリ形式のファイルであり、gettext はそこから文字列リソースを抽出します。コマンド プロンプトで次のコマンドを実行して、変更した PO ファイルから MO ファイルを取得します:
msgfmt -o test.mo test.po
最後に、test.po と test.mo を localezh_CNLC_MESSAGES ディレクトリに配置し、ブラウザでは中国語表示になっているのがわかります。