{WordPress}{gettext 周りも整理して解説を充実させたい}{PHP で gettext を使う}{gettext}(4)

{WordPress 多言語対応の仕組みと翻訳作業 — その2 K#F85E/9C5A}

この描出は,2008年2月17日投稿の旧ブログ記事を再録したものです。長らく更新されていませんので,最新の情報は著者のページからお探し下さい。

本記事の「その1」では、WordPress を題材に gettext のごく基本的な用語や仕組みを説明しました。

gettext の扱い方は、WordPress の運用に限らず柔軟性のあるプログラムを作りたい場合には必須の知識です。プログラム作成者がとくに知っておく必要があるのは、ソースファイルから可訳文字列などを自動抽出して PO ファイルを作る xgettext と msginit コマンドの使い方です。これに加え、WordPress のテーマ作成者・翻訳者は MO ファイルをテーマごとに用意する方法も知っておくと非常に便利です。

xgettext コマンドの使い方

xgettext はソースファイルから可訳文字列やコメントを抽出し、PO ファイルの雛形 (POT: PO Template) となるファイルを作ります。

最も単純な使いかたは、下の通りです。可訳文字列を抽出したいファイルとキーワード関数の名前を "-k" オプションに続けて指定します。ファイルは複数指定できます。gettext の標準ではキーワードは "gettext" となっており、これに従う記法では省略できますが、WordPress (PHP-gettext?) では "__" と "_e" の二つを使うので指定する必要があります。

$ xgettext index.php -k__ -k_e

これを実行すると、カレントディレクトリに messages.po という名前の POT ファイルが作成されます。中身は、PO ファイルと同じ形式ですが、対象言語、翻訳者の名前・連絡先、更新日時など諸々の情報を記すためのヘッダ部分が未定の状態になっています。

出力される POT ファイルの名前は、下の通り "-o" オプションで指定することも出来ます。

$ xgettext index.php -o test.pot -k__ -k_e

ファイルは複数指定できますが、ファイルがたくさんあると毎回入力するのは面倒です。そういう場合、抽出したいファイル名を改行で区切ってテキストファイルに保存しておき、"-f" オプションで読みこませることが出来ます。

$ xgettext -f filelist.txt -k__ -k_e

"-c" オプションに続けて文字列を指定すると、その文字列が含まれているキーワード関数の直前にあるコメントを抽出することが出来ます。下の例では "NOTES:" を含むコメントを抽出します。これは主に特定の可訳文字列に対して、ソースファイルの作成者が補足的な情報を加えるために使われます。

$ xgettext -f ja_filelist.txt -k__ -k_e -cNOTES:

抽出する可訳文字列かコメントのどちらか一方にでも ASCII (英数字等) 以外の文字列が含まれている場合、"--from-code=" オプションでソースファイルの文字コードを指定する必要があります。日本語の場合は euc-jp, shift-jis, utf8 などですが、必ずソースファイルと同じものを指定します。下の例では utf8 (UTF-8) を指定しています。

$ xgettext -f ja_filelist.txt -k__ -k_e -cNOTES: --from-code=utf8

xgettext コマンドで主に使用するオプションは以上です。まとめると下記の通りです。

<dl> <dt>-k (--keyword=)</dt> <dd>キーワード関数の名前を指定する。</dd> <dt>-f (--files-from=)</dt> <dd>入力ファイルをリストから読みこむ。</dd> <dt>-o (--output=)</dt> <dd>出力ファイルの名前を指定する。</dd> <dt>-c (--add-comments=)</dt> <dd>キーワード関数直前にある、指定の文字列を含むコメントを抽出する。</dd> <dt>--from-code=</dt> <dd>ソースファイルの文字コードを指定する。</dd> </dl>

msginit コマンドの使い方

msginit は xgettext で作った POT から実際に編集作業に使う PO ファイルを作ります。 使い方は "-l" (または --locale=) オプションに続けて言語コードを、"-i" (または --input=) オプションに続けて POT ファイルを指定します。

$ msginit -l ja -i messages.po

これを実行すると、ヘッダ情報が設定された "[言語コード].po" ファイルが作成されます。例では日本語の "ja.po" です。ここで「不正な複数バイトのシーケンス」といったエラーがでる場合、下記のように抽出元ソースファイルの文字コードまで指定して下さい。(例では UTF-8)

$ msginit -l ja_JP.UTF-8 -i messages.po

テーマ別 MO ファイル

WordPress のテーマが使用する MO ファイルが置かれているディレクトリは、下のように「標準」と「テーマ別」の二箇所あります。

<dl> <dt>標準</dt> <dd>wp-content/languages/</dd> <dt>テーマ別</dt> <dd>wp-content/themes/[テーマ名]/</dd> </dl>

こちらの説明では省略しましたが、キーワード関数には第二引数があり、これを省略すると標準の MO ファイルが使用されるようになっています。第二引数には、テキストドメインという、可訳文字列の所属を表わす文字列を指定します。テーマにテキストドメインが設定されていれば、それを指定してテーマ毎の MO ファイルを使用するように出来ます。テーマ別の翻訳ファイルであれば、テーマと一緒に簡単に配布できて便利です。

テーマにテキストドメインを設定するには、テーマのディレクトリ内の "functions.php" というファイルに下の行を追加します (存在しない場合は同名の空ファイルを新規に作成します)。例ではテーマ名を "abc" とします。

<?php load_theme_textdomain('abc'); ?>

こうした上で、下記のキーワード関数で指定された可訳文字列にはテーマディレクトリ内の MO ファイルが適用されます 。"__()" 関数でも同様です。

<?php _e('Translatable string', 'abc'); ?>

2008/2/28 加筆・修正

2008/2/24 修正