有关XRC I18N的第一个中文文档。
转自
[python-chinese]
[python-chinese] 用XRC生成wxPython的界面,如何实现I18N呢?
Hong Yuan hongyuan在homemaster.cn 星期一 七月 23 13:04:46 HKT 2007
马踏飞燕 写道:
> 我用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文件。具体的 步骤如下:
- 从xrc
文件中生成.po文件用于翻译。有两种方法,一是使用wxrc
-g将xrc文件中可翻译的字符串转换成_(str)的格式,然后用xgettext像对其他程序一样进行.po文件的抽取。wxrc工具在Debian
中位于wx2.5-common包内。另一种方式是将xrc文件导入到wxGlade这样的工具中,通过wxGlade转换成C++或python代码,
然后使用xgettext进行字串抽取。翻译完的.mo文件必须放在[lang]/LC_MESSAGES目录下。
- 初始化locale,指定语言以及在何处可以找到相应的.mo文件。通常情况下系统首先在当前目录中查找catalog,然后在系统目录中搜 索。但保险起见用AddCatalogLookupPathPrefix比较可靠。
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对象依旧作为全局变
量存在。
- 之后可以使用XmlResource生成相
应的对象。也可以使用Locale.GetString(string)函数返回对应Locale 的翻
译字符。该函数的功能类似于_(),但如果在同一界面中需要显示同一字串的不同语言译文时只要调用不同Locale的GetString函数即可。