やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonで国際化してみた

Hello World!!こんにちは世界!へ置き換えた。

成果物

GitHubPython.i18n.201709142046

ファイル構成

main.pyが本体。pygettext.pymsgfmt.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
こんにちは世界!

手順

  1. コードを書く(main.py)
  2. 以下のファイルを入手する
  3. $ python pygettext.py main.pymessages.potファイルが出力される
  4. messages.potファイルをコピーしてhello.poにリネームする
  5. hello.poの項目を任意に埋める(msgstr ""msgstr "こんにちは世界!"とする等)
  6. $ python msgfmt.py hello.pohello.moファイルが出力される
  7. ./ja/LC_MESSAGES/hello.moに配置する
  8. $ 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コメントなら変数で直接代入すれば可能か。微妙に中途半端。