gettext中的一点缺憾

时间:2022-11-22 00:17:50

在python中做国际化编程,自然是首选gettext了,不过在使用过程中遇到了不少问题。

1、程序中待翻译字符串只能是english字串,chinese字串无法翻译,如下面一段程序:

#!/usr/bin/env python
# -*- coding: gb2312 -*-
import gettext

en = gettext.translation('test', localedir='.', languages=['en'])
en.install()
print _("我爱你")

 

输出结果仍然是"我爱你",而不是我期望的"i love you",除非这样写:

 

 

#!/usr/bin/env python
# -*- coding: gb2312 -*-
import gettext

en = gettext.translation('test', localedir='.', languages=['en'])
en.install()
print _(u"我爱你")

 

这是很不方便的,我尝试了以下2中方法

 

1)在translation中指定codeset='gb2312'

 

2)在install函数中指定unicode=True

都无法解决问题。是什么原因导致的呢?单步跟踪发现,原来gettext是把原始字串和翻译字串以字典形式存入translation类的_catalog中的,下面是调试时的信息,从中可以知道两点,一是存储在字典中的字串都是unicode的,二是gettext直接以_()中的字串作为key在_catalog字典中查找。结果当时是由于类型不匹配而找不到,因此返回原字串。

gettext中的一点缺憾

 

知道了原因,当然就知道怎么做了。修改gettext345行成下面这样:

 

gettext中的一点缺憾

 

然后使用的时候就是在构造translation时指定codeset就可以了,再也不用显式传递unicode字串给_()函数,岂不是很方便?

#!/usr/bin/env python
# -*- coding: gb2312 -*-
import gettext

en = gettext.translation('test', localedir='.', languages=['en'], codeset='gb2312')
en.install()
print _("我爱你")