“国际化”(常简称为i18n)是对应用程序进行改造的过程,使得所有用户可见的文本都能被翻译成用户所选的语言,并且诸如日期、金额以及一般数字等内容都能以用户熟悉或习惯的格式显示。
展示所需内容的最简单方法是使用一个小的代码示例。
文本翻译
源码准备
在Python中,文本翻译是通过使用gettext[1]来完成的。为了确保所有的wxPython标签都能被翻译,我们将使用wx.Locale和wx.GetTranslation。
如何准备你的源代码以便实现文本的翻译:
aString = _(u"This is a string which will be translated")
如你所见,这非常简单,你只需用翻译函数“_()”将文本括起来即可。显然,其中还有更多的细节,如下所示。
要为整个应用程序启用国际化(I18N),你需要在应用程序文件中按照以下步骤进行一些设置:
import builtins
builtins.__dict__['_'] = wx.GetTranslation
在这里,我们设置了“_”翻译函数,并通过将其添加到内置函数中,使其在整个应用程序中都能使用。
切换到不同语言所需的代码如下:
def updateLanguage(self, lang):
"""
将语言更新为指定语言。
务必确保在创建新区域设置之前删除所有现有的区域设置。
在创建新的C++对象之前,需要先删除旧的C++对象。
而且,如果我们只是将一个新实例赋值给旧的Python变量,
旧的C++区域设置不会被及时销毁,
这很可能会导致程序崩溃。
:param string `lang`: 所支持的语言代码之一
"""
# if an unsupported language is requested default to English
if lang in appC.supLang:
selLang = appC.supLang[lang]
else:
selLang = wx.LANGUAGE_ENGLISH
if self.locale:
assert sys.getrefcount(self.locale) <= 2
del self.locale
# create a locale object for this language
self.locale = wx.Locale(selLang)
if self.locale.IsOk():
self.locale.AddCatalog(appC.langDomain)
else:
self.locale = None
进行实际的翻译工作
你需要提取所有由“_”函数标记的文本字符串。在可下载的压缩文件中有一个名为geni18n.py的小脚本,它会提取所有字符串并生成一个.pot文件,该文件会被放置到locale文件夹中。geni18n.py脚本还会为已定义的语言生成.mo文件。
然后将.pot文件提供给翻译人员,他们用它来为自己所翻译的语言生成一个.po文件,或者他们也可以使用.pot文件将新的或已更改的文本字符串合并到现有的.po文件中。
要进行实际的翻译工作,我们推荐使用poEdit[2] ,它允许你根据.pot文件创建或更新翻译目录(.po文件)。
示例应用程序
在可下载的压缩文件中中,我们包含了一个小型示例应用程序,用于展示上述功能的实际运行情况。
- app_base.py包含初始化代码
- sampleapp.py是主框架/应用程序,运行这个文件就能看到实际效果
- geni18n.py是用于生成
.pot文件的脚本,它还会生成.mo文件
注意:该应用程序有一个按钮,点击后会弹出文件对话框。由于wxPython为此使用了原生控件,对话框中的文本会显示为操作系统的语言,而非app_base.py中所选的语言。
本地化概述
“本地化”,常简称为“L10n”,是使日期和数字的显示符合当地习惯的过程。
例如,“4/5/2012” 对于美国人来说意味着2012年4月5日,但对于大多数欧洲人来说,它表示2012年5月4日。
日期本地化
待办:等待编写内容
数字本地化
待办:等待编写内容
更多资源
脚注
[1]gettext - docs.python.org/library/get…
[2]poEdit - www.poedit.net/