i18n的实现–gettext的实现原理

 

http://blog.donews.com/limodou/archive/2004/06/15/28961.aspx

 

附:gettext的实现原理

只是本人的理解!

gettext的功能其实挺简单:定义_()函数并安装,根据传入的翻译项从mo文件中取得译文,并根据uniocde标识进行应用的unicode编码处理。

一个gettext对象提供了两个基本的获得译文的函数:gettext和ugettext。一个用来获得未进行编码转换的译文,一个用来获得转成unicode的译文。根据unicode的标志,这两个函数之一将被引用到_()函数上。如果未安装任何译文,则缺省返回是只是翻译项,即原样返回。因此不安装任何译文,gettext一样是可以用的。

如何安装_()。

import __buildin__
__buildin__.__dict__['_']=unicode and self.ugettext or self.gettext

这样就将_()函数变成一个内置函数了,在其它的后续的模块中就可以直接使用它了。因此,使用gettext时,安装要很靠前,并且只需要在启动模块中装入即可。

后记:为什么 NewEdit 不动态更新界面

既然实现了国际化处理,如果用户改变了使用的语言,如果整个应用立即改变不是更好吗?当然是很吸引人,但对于 NewEdit 存在问题。一方面所有界面与国际化处理相关的地方,都要用代码去实现更新过程,工作量大。另外,除非测试,一个用户不会总是在各种语言之间切换来切换去,一般都是固定使用某种语言,因此,在重新启动后启用新的语言设置是可以接受的方案。还有一个重要的原因就是:使用_()这种方式只适合函数调用方式,对于全局变量或模块变量无能为力。为什么呢?比如:

message = _(‘Chinese’)

这样定义了一个变量。如果它是存在一个模块中,作为模块的全局变量的话,当导入这个模块时,这个语句会执行。并且导入过程只会执行一次。这样当语句执行完毕后message就是具体的值,而不再是message=_(‘Chinese’)这种语句了。这样,当我们改变了语言,message只会是上一个语言的译文,不会变成新的译文。这一点真是很难解决。而为什么在函数调用时可以呢?严格来说应该是这样的形式可以:

call(_(‘Chinese’))

这是因为,当调用函数时参数是动态计算的,因此每次调用call时都会重新计算参数的值,因此这种方式可以的。总的来说,如果在执行时可以每次调用_()函数的话,这样就可以实现动态语言切换。如果不行,则使用静态语言切换。因此 NewEdit 使用了静态语言的切换。


posted @ 2012-07-29 22:19  功夫 熊猫  阅读(1913)  评论(0编辑  收藏  举报