6.22.2015

How to Internationalize Messages in Python

Python アプリケーション内のメッセージの国際化 (i18n) について

 

思ったよりも面倒だったのでメモ。

 

tl;dr

  • GNU gettext API よりも クラスベース API が推奨されている
  • ロケール辞書の置き場所が必要
  • 翻訳対象のメッセージにマーク _('text') を付けてアプリケーション・コードを書く
  • ソースコードからカタログ(.po)を作成する。
    これを実現するツールは lingua, babel, po-utils, xpot, xgettext など多数ある模様。
  • カタログを編集して翻訳後の文字列を記述し、コンパイルしてバイナリファイル(.mo)を作成。
    そして所定の位置に配備する。

 

具体例

 

ソースコード
import gettext

_ = gettext.translation('hello_i18n', 'locale', fallback=True).ugettext

print(_('hello i18n'))
print(_('hello %(world)s') % {'world': 'i18n'})

 

カタログの作成

今回は、xgettext + msgfmt で実現する。

### Macの場合
$ brew install gettext

### バージョンは環境に合わせて適宜変更
$ /usr/local/Cellar/gettext/0.19.4/bin/xgettext --language=python --from-code=UTF-8 \
--keyword=_ --add-comments=NOTE -o hello_i18n.po hello_i18n.py

$ vi hello_i18n.po
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-06-21 23:48+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: hello_i18n.py:5
msgid "hello i18n"
msgstr "こんにちは i18n"

#: hello_i18n.py:6
#, python-format
msgid "hello %(world)s"
msgstr "%(world)s、こんにちは"

 

カタログのコンパイル
$ mkdir -p locale/ja_JP/LC_MESSAGES
$ /usr/local/Cellar/gettext/0.19.4/bin/msgfmt -o locale/ja_JP/LC_MESSAGES/hello_i18n.mo \
./hello_i18n.po

 

実行結果
$ python2 ./hello_i18n.py
こんにちは i18n
i18n、こんにちは
$ LC_ALL=C python2 ./hello_i18n.py
hello i18n
hello i18n

 

GNU gettext との結び付きが強すぎるし、コンパイルが必須なのもあって、あまり使う気がしない設計という印象。

 

References

0 件のコメント:

コメントを投稿