馬踏飛燕 寫道:> 我用wxPython自帶的XRCed生成了一個界面,然后用代碼調用之后可以顯示出界面了.> 但是,現在的問題是,我雖然用XRCed提供的生成gettext的功能而得到了一個寫有> _('File') 這樣的代碼,但是我用poEdit翻譯之后并且install了,只有在程序代碼中直接創建控件的地方寫的_('some> text')才有翻譯的效果,從xrc生成的還是英文的.>> 有什么辦法嗎?
上面的方法是對于所有python程序的通用方法。對于wxPython的程序,如果所有的界面元素都使用代碼來生成,即界面中的文字都出現在界面 代碼中,則可以完全使用相同的方法來實現i18N。
但 是wxPython提供了另外一種生成面界的方法,即使用XRC資源文件定義界面,在程序中只要加載相應的界面對象。通過這種方式生成界面時在 python代碼中看不見界面元素的字串常量,這些字符串都保存在.xrc的資源文件中,無法用xgettext直接進行處理。
wxPython 的XRC支持包括了對i18N的支持。函數XmlResource有一個默認參數flags=XRC_USE_LOCALE,這樣 在加載XRC資源時會根據當前locale判斷是否存在語言包,從語言包中將相應字串的翻譯顯示出來。wxPython本身庫函數中的文字內容則存放在 wxstd.mo中。
這樣對于xrc使用i18N的前提一是正確設置wxPython的locale,二是從xrc文件中抽取需要翻譯的字符串,生成.mo文件。具體的 步驟如下:
L = wx.Locale()L.Init(wx.LANGUAGE_CHINESE_SIMPLIFIED)L.AddCatalogLookupPathPrefix('./locale')L.AddCatalog('messages')
注意: 在wxPython 2.7以后的版本中,必須先生成wx.App對象后才能調用wx.Locale對象的Init方法。因此對上述代碼需略微修改,將L=wx.Locale ()放在生成wx.App前,而在wx.App對象的OnInit代碼中調用L.Init等代碼。這樣可以保證在OnInit結束后L對象依舊作為全局變 量存在。
Powered by: C++博客 Copyright © 金慶