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
次にmsgmergeでja.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 新しいメッセージ
関連記事:
- Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(作業の流れと動作確認・前半)
- Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(Pythonのコードについて)
- Pythonで作成したgettextのテストプログラムをC言語で書いてみる
参考URL:
使用したバージョン:
- Python 2.4.4(2.4.4-r13)
- gettext 0.17