CODE‎ > ‎Python‎ > ‎

多國語言

利用wxPython開發GUI的確很方便,尤其是對多國語言的支持更是方便。

首先下載GetText for Windows,將來可以抽出要多國化的語言包。

再來拿網路上的一段程式碼
#!/usr/bin/python

import wx
_ = wx.GetTranslation

class Translation(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(220, 100))

        panel = wx.Panel(self, -1)

        wx.StaticText(panel, -1, _("Hello"), (10, 10))
        
        self.Centre()
        self.Show(True)

app = wx.App()

mylocale = wx.Locale()
mylocale.AddCatalogLookupPathPrefix('.')
mylocale.AddCatalog('CHT') #Use CHT.mo

Translation(None, -1, 'Translation')
app.MainLoop()
把以上程式存成 wx_test.py 執行結果如下

使用 wx.Locale 的 AddCatalog(),wxPython就會去搜尋目前的目錄、系統目錄,或是透過AddCatalogLookupPathPrefix()指定的路徑。
mylocale.AddCatalog('CHT') 就可以指定要使用的語言包,但以上程式並找不到 CHT.mo 所以會直接忽略。
而現在開始就是要產生 CHT.mo 這個檔案,打開剛才下載的GetText for Windows程式,執行以下指令
xgettext --default-domain=test wx_test.py
便會產生 test.po 檔案,打開後編輯
....(略)...
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: ..\test.py:12
msgid "Hello"
msgstr ""
Content-Type: text/plain; charset=CHARSET\n 改成 Content-Type: text/plain; charset=utf-8\n 並將檔案編碼改成UTF-8後儲存,否則待會的編輯會造成錯誤。
繼續編輯,將
msgid "Hello"
msgstr ""
改成
msgid "Hello"
msgstr "哈囉"
接著執行 msgfmt --output=CHT.mo test.po 就能產生 CHT.mo 檔了,接著再執行 wx_test.py 看結果

同樣的方法產生日語檔 JPN.mo 後 mylocale.AddCatalog('JPN') 可以看到日語結果

到此算是已經完整,但是有時程式一修改後新增功能後就會新增一些語言包所沒有的字串,那也不必從新編輯 po 檔,只要再執行
xgettext --default-domain=test01 wx_test.py
先不要去編輯test01.po檔,因為我們接著要進行合併工作
msgmerge --update test.po test01.po
然後再去編輯 test.po 檔,如此就不必全部重新編輯,最後再把 po 檔製成 mo 檔就可以了。

PS. 在WIN下執行py檔常會帶著一個DOS視窗,指要把.py改成.pyw就不再會跟著DOS視窗了。

Comments