info
kitetu.net
2008/2/17 日曜日 (17:33:19)、宇田川 浩行 による、WordPress への投稿。
本記事の「その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 コマンドで主に使用するオプションは以上です。まとめると下記の通りです。
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 ファイルが置かれているディレクトリは、下のように「標準」と「テーマ別」の二箇所あります。
こちらの説明では省略しましたが、キーワード関数には第二引数があり、これを省略すると標準の MO ファイルが使用されるようになっています。第二引数には、テキストドメインという、可訳文字列の所属を表わす文字列を指定します。テーマにテキストドメインが設定されていれば、それを指定してテーマ毎の MO ファイルを使用するように出来ます。テーマ別の翻訳ファイルであれば、テーマと一緒に簡単に配布できて便利です。
テーマにテキストドメインを設定するには、テーマのディレクトリ内の “functions.php” というファイルに下の行を追加します (存在しない場合は同名の空ファイルを新規に作成します)。例ではテーマ名を “abc” とします。
<?php load_theme_textdomain('abc'); ?>
こうした上で、下記のキーワード関数で指定された可訳文字列にはテーマディレクトリ内の MO ファイルが適用されます 。”__()” 関数でも同様です。
<?php _e('Translatable string', 'abc'); ?>
2008/2/28 加筆・修正
2008/2/24 修正
この記事に寄せられたご意見は、現在 5件です。(RSS 2.0)
2008/6/18 水曜日 (21:45:47)、vyv00411 さんによる投稿。
大変わかりやすく、参考になりました。
2008/6/19 木曜日 (10:29:22)、宇田川 浩行 さんによる投稿。
vyv00411さん
ありがとうございます。励みになります。
2009/3/13 金曜日 (9:53:06)、リン宝 さんによる投稿。
以上の内容は読みました。本当に勉強になりましたね。 ただ、一つ質問があります。 gettextは翻訳した文字列を操作する場合、エンコード変換を行いますか?例えば: ソースエンコード:euc-jp 翻訳したい言語:中国語GB2312 poファイルのcharset:UTF-8 LANG = zh_CN.gb2312 それでは、プログラム実行時に、自動的に翻訳された文字列のエンコードをUTF-8からGB2312までに変更できますか?
2009/3/15 日曜日 (22:30:52)、宇田川 浩行 さんによる投稿。
リン宝さん、ありがとうございます。
私自身、エンコードに関する詳しい知識があるわけでなく、狭い知識の範囲でお答えしてしまいますが、リン宝さんのおっしゃる「プログラム」が「自作プログラム」のこと、「文字列の操作」が「翻訳文字列の取得」であれば、以下の点によって多少回答が変わりそうです。
・お使いのプログラミング言語のgettextや文字エンコーディング関係ライブラリの仕様
・何を実現したいか
ちなみに、翻訳ファイルを用意し、gettext付属のコマンドラインツールでpoファイルを作成するまでの手順では、コマンドオプションで厳密にエンコーディングを指定してあげないと上手くいかなかった記憶があるので、特にgettext関係のツールが自動的にエンコーディング問題を解決してくれることはないと思います。恐らく殆んどのライブラリでは、プログラム中で取得できる文字列のエンコーディングはMO/POファイル作成時のものと同じです。
ですから、プログラム側がどういう言語に対応したエンコーディングであるかに合わせて翻訳ファイルを作成する必要があります。リン宝さんの例で、仮に言語がPHPだとすれば、プログラムのソースエンコーディングや内部エンコーディング(mb_internal_encoding)をUTF-8に変更し(元の日本語は保存できます)、UTF-8で中国語のpoファイルを作るか、あくまでもGB2312で表現したいということであれば、プログラム自体をGB2312に変更し(多少日本語が崩れるかもしれません)、同じエンコーディングでpoファイルを作るしかないと思います。
これ以上複雑にエンコーディングを混在させても、変換時に抜け落ちて表現の範囲は変わらないと思うのですが、何かご事情があるのでしょうか?
2009/5/12 火曜日 (8:05:39)、load_plugin_textdomain の適切な指定方法 « 鵺的:想空間 さんによる投稿。
[…] WordPress 多言語対応の仕組みと翻訳作業 — その2(希哲館) ⇒ プラグインとテーマをローカライズする(iDeasilo) ⇒ […]
この記事へのトラックバック URI :
http://www.kitetu.net/old/notes/0010.html/trackback