gettextで日本語化の検討(1)

gettextを用いて、wxPythonで作る画面を日本語化したい。
まず、Linuxでやってみる。例えば、プログレスバーを表示するだけの例なのだが、下記のソースがある。ファイル名はprogress.pyとする。

import wx

if __name__ == "__main__":
    app = wx.PySimpleApp()
    progressMax = 15
    dialog = wx.ProgressDialog("A progress box",
            "Time remaining", progressMax,
            style=wx.PD_ELAPSED_TIME | wx.PD_REMAINING_TIME |
                  wx.PD_AUTO_HIDE)
    keepGoing = True
    count = 0
    while keepGoing and count < progressMax:
        count = count + 1
        wx.Sleep(1)
        keepGoing = dialog.Update(count)
    dialog.Destroy()

このコードを実行すると、ダイアログにプログレスバーが表示されて15秒後に自動的に閉じる。

ソースコードの変更

日本語化するための変更点は、

  • import gettext以降、3行を加える。
  • 日本語にする文字列を_()で囲む。この例では2箇所。

変更後のソースコードは、

import wx
import gettext
t = gettext.translation('progress', './locale')
_ = t.ugettext

if __name__ == "__main__":
    app = wx.PySimpleApp()
    progressMax = 15
    dialog = wx.ProgressDialog(_("A progress box"),
            _("Time remaining"), progressMax,
            style=wx.PD_ELAPSED_TIME | wx.PD_REMAINING_TIME |
                  wx.PD_AUTO_HIDE)
    keepGoing = True
    count = 0
    while keepGoing and count < progressMax:
        count = count + 1
        wx.Sleep(1)
        keepGoing = dialog.Update(count)
    dialog.Destroy()

poファイルの作成と編集

pygettext(自分の環境では、コマンドとして既に使える状態であった)を使って、poファイルを作成する。

$ pygettext -o ja.po progress.py

作成されたja.poファイルを編集する。下記のように赤字の部分を修正した。

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2010-12-21 09:40+JST\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"

#: progress.py:14
msgid "A progress box"
msgstr "プログレスバー表示"

#: progress.py:15
msgid "Time remaining"
msgstr "残り時間"

moファイルの作成

msgfmt(自分の環境では、既にコマンドとして使える状態にあった)を使って、moファイルを作成する。

$ msgfmt -o progress.mo ja.po

作成されたファイルprogress.moを、./locale/ja/LC_MESSAGES/に移動する。ここまでやって、再びprogress.pyを実行すると日本語のダイアログが表示される。

課題

これで日本語化できたような感じだが、下記の問題がある。

  • 環境変数LANGがenの環境で実行すると、translation fileのIOErrorになる。元々、英語表記のコードなのだから、英語環境ではそのまま表示されて欲しいが、translation file(たぶん.moファイル)を読もうとしてしまう。このままだと、ソースコードの中身を直接日本語にするのと変わらない。
  • 複数ファイルから成るプログラム全体を日本語化するときどうするか?ファイル一つ一つからpoファイル、moファイルを作るのはたいへん、というか絶対正しいやり方ではない。

gettextの正しい使い方の検討を続ける。