試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(作業の流れと動作確認・後半)

Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(作業の流れと動作確認・前半)」の続き。
作業もその最後(ja.poの作成)まで行っているものとする。

msgfmt: テキスト形式のメッセージカタログ(.po)を機械語形式(.mo)に変換

.poファイルはそのままでは使用できず、機械語(.moファイル)に変換した上で、適切な場所に適切なファイル名で配置*1される必要がある。
今回の例では、プログラム側で「[プログラムのあるディレクトリ]/../share/locale」と場所を指定しているので、その中に直接生成している。

[work/po]$ msgfmt -c --statistics ja.po -o ../share/locale/ja/LC_MESSAGES/gettexttest.mo
4 個の翻訳メッセージ.

実際のアプリケーションでは、ビルドシステムにより自動で変換(ビルド時)・配置(インストール時)が行われる。手動でmsgfmtを実行することはあまりないと思われる。
ちなみに、.mo形式の機械語メッセージカタログはmsgunfmtでテキスト(.po)形式に変換することができる(コメントは一切表示されない)。

動作確認

日本語ロケール上で実行したときに

[work/po]$ ../bin/gettexttest.py
メッセージ
文字列: test
1 個の項目
2 個の項目
0 個の項目
B による A

となっていればOK。
環境変数LC_MESSAGESを変更することでメッセージのロケールを変更できるのだが、元の英語のメッセージは下のようにすると確認できる。

$ LC_MESSAGES=C ../bin/gettexttest.py
message
string: test
1 item
2 items
0 items
A by B

msgmerge: メッセージの追加に対応して.poファイルを更新

メッセージが追加されたときには、xgettextで.potファイルを再生成後、既存の.poファイルと新しい.potファイルとを入力として、msgmergeというコマンドを使用して、追加された(未翻訳)メッセージを翻訳する準備を行う。
例えば、プログラム側で

print _("newmsg")

という処理を後ろに追加した場合、そのままでは

$ ../bin/gettexttest.py              
メッセージ
文字列: test
1 個の項目
2 個の項目
0 個の項目
B による A
newmsg

となり、追加した文字列が英語で表示されてしまう。しかし、その時点の.poファイルには、追加された文字列に関するmsgid/msgstrの記述はない。
以下、xgettextの再実行例(前回と同じ)。

[work/po]$ xgettext --add-comments=TRANSLATORS: --copyright-holder=myname --package-name=gettexttest --package-version=0.1 -k_ -kngettext -o gettexttest.pot ../bin/gettexttest.py

次にmsgmergeja.poを更新する。下の例では.potファイルを「*.pot」として指定しているが、.potファイルは基本的に1つなので、この書き方は使い回せる。

$ msgmerge -s ja.po *.pot -o ja.po                         

更新が完了すると、ja.po

#: ../bin/gettexttest.py:45
msgid "newmsg"
msgstr ""

のように、追加された項目がある。それ(ら)を編集する(msgstrに翻訳後のメッセージを入れていく)ことで、新しいメッセージに対応していくことになる。

#: ../bin/gettexttest.py:45
msgid "newmsg"
msgstr "新しいメッセージ"

その後改めてmsgfmtを実行して機械語メッセージカタログ(.moファイル)を更新すると、メッセージが日本語で表示される。

[work/po]$ msgfmt -c --statistics ja.po -o ../share/locale/ja/LC_MESSAGES/gettexttest.mo
5 個の翻訳メッセージ.
[work/po]$ ../bin/gettexttest.py
メッセージ
文字列: test
1 個の項目
2 個の項目
0 個の項目
B による A
新しいメッセージ

関連記事:

参考URL:

使用したバージョン:

  • Python 2.4.4(2.4.4-r13)
  • gettext 0.17

*1:[ロケールディレクトリ(/usr/share/locale など)]/[ロケール名]/LC_MESSAGES/[ドメイン].mo