国際化(i18n)メモ

gettextという仕組みを使えるようになってる。gettextはC言語などでも利用可。

日本語化の例を追って見ていく*1

日本語化対象アプリ

test.py

import sys
import gettext
gettext.install("test","/usr/share/locale")
i=1
sys.stdout.write(_("test %d") % i)

実行結果:
test 1
と表示されるだけ。

国際化対象にしたい文字列を_(...)で囲む。
今回は_("test %d")となってる。

gettext.installで、国際化メッセージファイル(moファイル)の位置を指定
/usr/share/locale/|言語名|/LC_MESSAGES/test.mo
からmoファイルを読むようになる。

pygettext.pyでpotファイルを生成

pygettext.pyはpython-toolsパッケージに入ってる。

$ pygettext.py test.py
message.potというファイルが生成。
これは国際化メッセージファイルの雛型のようなものらしい。

日本語翻訳者にはこのファイルを「ja.po」という名前で配布(これが俗に言うpoファイル)
今回は日本語化したいので
$ cp message.pot ja.po

ja.poのヘッダ編集

"Language-Team: LANGUAGE \n"

  • >

"Language-Team: japanese\n"
"Content-Type: text/plain; charset=CHARSET\n"

  • >

"Content-Type: text/plain; charset=UTF-8\n"

*1:日本語化は、正しくいうとi18nとはいわずlocalization(l10n)だなぁ

ja.poの対応部分を翻訳

msgid "test %d"
msgstr ""

という行を発見。msgstr ""に翻訳を書く。

msgid "test %d"
msgstr "テスト %d です"

msgfmt.pyでmoファイルを生成。

$ msgfmt.py ja
ja.moファイルが生成。アプリはこいつを読み込む。
これを以下のようにコピー
# cp ja.mo /usr/share/locale/ja/LC_MESSAGES/test.mo

テスト

$ locale
LANG=ja_JP.UTF-8
....
↑日本語環境であることを確認

$ python test.py
テスト 1 です

言語を英語に切り替えると。。
$ LANG=en_US.UTF-8 python test.py
test 1

おお、日本語、英語メッセージが切り替わった。グレイト。