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 との結び付きが強すぎるし、コンパイルが必須なのもあって、あまり使う気がしない設計という印象。
0 件のコメント:
コメントを投稿