Hello World!!
をこんにちは世界!
へ置き換えた。
成果物
ファイル構成
- main.py
- pygettext.py
- msgfmt.py
- messages.pot
- hello.po
- ja/
- LC_MESSAGES/
- hello.mo
- LC_MESSAGES/
main.py
が本体。pygettext.pyとmsgfmt.pyは翻訳ファイル生成ツール。.pot
, .po
, mo
はそれぞれ翻訳用テンプレ、翻訳後テキスト、翻訳後バイナリ。本体はmo
ファイルを参照することで翻訳する。
コード
main.py
import gettext import os _ = gettext.translation( domain='hello', localedir=os.path.join(os.path.dirname(__file__)), fallback=True).gettext print(_('Hello World !!'))
- domain:
hello.mo
ファイルと同じ名前にする(拡張子をとる) - localedir:
(ここで指定したディレクトリ)/ja/LC_MESSAGES/hello.mo
- fallback: moファイルが見つからない場合そのまま実行する
_(...)
で囲った文字列が翻訳対象となる
ソースコードには英語しかない。しかし実行結果は日本語が表示される。
(たぶん「システムの言語が日本語の場合」という条件付き。言語を指定すれば日本語のmoファイルを使うようにできると思う)
実行
$ python main.py こんにちは世界!
手順
- コードを書く(
main.py
) - 以下のファイルを入手する
$ python pygettext.py main.py
でmessages.pot
ファイルが出力されるmessages.pot
ファイルをコピーしてhello.po
にリネームするhello.po
の項目を任意に埋める(msgstr ""
をmsgstr "こんにちは世界!"
とする等)$ python msgfmt.py hello.po
でhello.mo
ファイルが出力される./ja/LC_MESSAGES/hello.mo
に配置する$ python main.py
を実行してHello World !!
でなくこんにちは世界!
と表示されたら成功
hello.po
msgstr ""
の部分をそれぞれ翻訳して埋める。以下、日本語用ファイルの場合。
# SOME DESCRIPTIVE TITLE. # Copyright (C) 2017 ytyaru # FIRST AUTHOR <EMAIL@ADDRESS>, 2017. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "POT-Creation-Date: 2017-09-14 20:26+0900\n" "PO-Revision-Date: 2017-09-14 20:28+0900\n" "Last-Translator: ytyaru <EMAIL@ADDRESS>\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: main.py:3 msgid "Hello World !!" msgstr "こんにちは世界!"
所感
できるだけ日本語などは外部ファイル化したい。PythonのPEPではソースコードにASCII文字のみ使うことが推奨されていたと思うから。
でも、コメントまでは国際化できない。docコメントなら変数で直接代入すれば可能か。微妙に中途半端。