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

複数ファイルからなるソースコードを日本語化する場合の方法。
xgettextでmessages.poファイルを作成するときに、引数で必要なファイルをすべて指定すればうまくいく。
(例)以下の3つのソースファイルからなるプログラムの場合

# file-name: progress.py
import wx
import progress_sub
import setting

setting.set_translation()

app = wx.PySimpleApp()
progressMax = 5
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()

progress_sub.sub()
# file-name: progress_sub.py
import setting

def sub():
    setting.set_translation()

    print _("Success")
# file-name: setting.py
import wx
import os
import sys
import gettext

def set_translation():
    basepath = os.path.abspath(os.path.dirname(sys.argv[0]))
    localedir = os.path.join(basepath, "locale")
    domain = "progress"
    langid = wx.LANGUAGE_DEFAULT
    mylocale = wx.Locale(langid)

    mytranslation = gettext.translation(domain, localedir,
        [mylocale.GetCanonicalName()], fallback = True)
    mytranslation.install()

1番目と2番目のファイルに、日本語化したい文字列が含まれる。
xgettextでmessages.poファイルを作る。

$ xgettext *.py

こうすると、すべての*.pyファイルの中の文字列を含んだmessages.poファイルができるので、そのファイルを編集すればいい。charset=UTF-8にして、msgstrに日本語を書き込む。
msgfmtでprogress.moファイルを作る。

$ msgfmt -o progress.mo messages.po

作成したprogress.moファイルを、./locale/ja/LC_MESSAGES/に移動する。以上ですべて完了。progress.pyを実行すると、日本語化されたダイアログが表示される。

  • 次の問題:ソースコードを修正して文字列を加えた場合に、そのたびごとにmessages.poファイルを作り直さなければならないとしたら、たいへん。例えば使っている文字列が多数ある場合、全部の日本語訳を最初から書き直さなければいけなくなる!
  • Linuxでmoファイルを作ってwindowsに持ってきても動かない!UnicodeDecodeError: 'cp932' codec can't decode bytes