應用程序國際化,在開源世界里常以i18n被提及,i18n是Internationalization的簡寫,正好18個字母。在wxPython程序進行i18n,如果字符串是編碼在源文件中時,完全可按照python程序的i18n的方法,即使用gexttext和locale模塊。而wxPython程序在使用XRC文件做為界面資源時,則應使用wx.Locale模塊,它封裝了區域化相關的操作。i18n,或者國際化實際上涉及到語言習慣,數字格式等等類別的內容。這里只介紹語言多國化,將一個簡單的英文程序轉換為中文,涉及到源文件,可從這里下載。
創建PO文件
PO文件是Portable Object文件的簡稱,它包含需要翻譯的字符串。我們需要從源文件進行提取。首先,對源文件test.py編輯,標識代碼里需要翻譯的字符串內容。我們使用_("xx")的方法,這種形式可能在許多開源源代碼中見識過。
#加載菜單欄
menubar = rc.LoadMenuBar('IDR_MENU')
這里的IDR_MENU是資源標識ID,不需要翻譯,因此不做改變,而下面的代碼:
info.SetVersion('1.0')
info.SetDescription('XRC i18n Demo')
'XRC i18n Demo'是描述性的文本,需要進行翻譯,將需要處理為
info.SetVersion('1.0')
info.SetDescription(_('XRC i18n Demo'))
接著需要生成.pot(Portable Object Template),這是po的模板文件。在將來程序可能配置成其他語種,其他語言的po文件都從它而來。為了創建這文件,需要用到GNU gettext工具集中的xgettext。向xgettext傳入些必要的信息,來創建.pot文件。
>xgetttext --output=test.pot test.py
我們將wxPython界面以XRC文件保存了,那里同樣有要翻譯的字符串需要提取。用XRCed工具將XRC生成python代碼,勾選上'Generate gettext strings'項即可。將源文件和XRC生成的test_xrc.py文件一起處理,生成一個test.pot。
>xgettext --output=test.pot test.py test_xrc.py
將得到的test.pot另存為test.po文件,然后進行翻譯編輯,在這過程中文件需要使用utf-8編碼。將對應的英文翻譯成中文,將charset更改為utf-8。
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: test.py:19
msgid "XRC i18n Demo"
msgstr "XRC 國際化示例"
...
.pot和.po這些文件都是文本文件,主要供翻譯者使用。為了使程序在運行時能獲取相關的翻譯的內容,要進行所謂的編譯過程,將文本文件轉換為二進制文件.mo。這里用了gettext工具集中的另一程序msgfmt。
> msgfmt --output=test.mo test.po
因為windows下沒有像linux像有公共存儲.mo文件的目錄,保持平臺的遷移性,在應用程序本地目錄下新建locale目錄,用來存放編譯過的.mo文件,然后將test.mo移動至locale目錄。在完成這些步驟后,就轉入代碼方面的更改了。
wxPython代碼更改
原先的代碼只需要做小改動:
def OnInit(self):
wx.Locale.AddCatalogLookupPathPrefix('locale')
self.locale = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
self.locale.AddCatalog('test')
import __builtin__
__builtin__.__dict__['_'] = wx.GetTranslation
首先,增加了新的目錄文件路徑,這將使wxPython搜索這個目錄,尋找匹配的.mo文件。接著創建wx.Locale對象,將其初始化為簡體中文,這將對應于zh_CN。最后將wx.GetTranslation做了一全局映射,這樣你在其他類中,比如示例中TestFrame也能使用_('xx')調用。這樣wxPython的i18n工作就完成了,下面是翻譯前后的界面截圖。
一些有益的討論
.mo文件的查找目錄
如果你將locale目錄下的test.mo文件刪除掉,然后將test.py中的wx.LANGUAGE_CHINESE_SIMPLIFIED改為wx.LANGUAGE_CHINESE,重新運行程序看看。發現界面變成了如下的繁體中文,但是菜單'檔案'下的Exit還是英文。
因為缺失.mo文件,但又指定wx.LANGUAGE_CHINESE,wxPython運行時使用了wxstd.mo文件。wxstd.mo有許多預編譯好的常見字符串的對應關系,它隨wxPython發布,在wx/locale下有許多語言版本的wxstd.mo。
對于wxPython會對待查目錄"DIR"來搜索.mo文件,查找它下面的這些目錄,(DIR/LANG/LC_MESSAGES;DIR/LANG;DIR),對于哪些是待查目錄,各個系統下又有不同,在所有的平臺上,LC_PATH環境變量指定的目錄將成為待查目錄,在Linux下/share/locale, /usr/share/locale, /usr/lib/locale, /usr/locale /share/locale以及當前目錄將是待查目錄。在上面我們已經用過AddCatalogLookupPathPrefix()函數,其作用就是增加自己的待查目錄。
在示例程序中,將test.mo放在locale\zh_CN\LC_MESSAGES或者locale\zh\LC_MESSAGES同樣是可行的。但是如果使用wx.LANGUAGE_CHINESE指定,則zh_CN目錄將不可行,因為它只是特化目錄,指簡體中文,而zh目錄同樣適用。
工具鏈再討論
gettext進行國際化是開源社區的主流方案,它也提供了許多實用工具供使用。上面提到了xgettext,msgfmt,還有msginit.exe,它將根據.pot文件創建新的.po文件,然后初始化一些元信息,像作者信息,項目,以及編碼等,當然也可像上面的手工編輯。msgmerge.exe將兩個.po文件進行合并。除了使用GNU Gettext工具集,也可使用隨python發布的tool\i18n目錄下pygettext.py和msgfmt.py,它們等同于上述的兩個工具。
對于編輯.po文件,可以嘗試一下Poedit,它提供了圖形化的編輯環境,其他功能我就不清楚了。
posted on 2008-07-15 20:21
len 閱讀(2213)
評論(0) 編輯 收藏 引用 所屬分類:
程序開發