列出PyGTK UI字符串可用语言
我正在整理我们PyGTK应用程序中的本地化和翻译设置。这个应用程序只打算在GNU/Linux系统上使用。我们希望用户能够选择应用程序使用的语言(有些人喜欢他们的母语,有些人为了统一喜欢英语,还有些人喜欢法语,因为听起来很浪漫等等)。
为了实现这个功能,我需要显示一个下拉框,里面有各种可用的语言。那我该如何获取这个列表呢?实际上,我需要一对对的语言代码(比如“en”,“ru”等)和用本地语言写的语言名称(比如“English (US)”,“Русские”)。
如果我不得不用一种简单粗暴的方法来实现,我会这样做:在系统的语言目录(例如“/usr/share/locale”)中查找所有语言代码的目录(例如“en/”),这些目录里包含相对路径“LC_MESSAGES/OurAppName.mo”。
有没有更程序化的方法呢?
2 个回答
1
这里有一个函数,它的灵感来自于gettext.find,但它的做法是查看哪些文件存在,而不是需要从Babel那里获取语言列表。这个函数会返回地区代码,不过你还是需要用Babel来获取每个地区的显示名称。
def available_langs(self, domain=None, localedir=None):
if domain is None:
domain = gettext._current_domain
if localedir is None:
localedir = gettext._default_localedir
files = glob(os.path.join(localedir, '*', 'LC_MESSAGES', '%s.mo' % domain))
langs = [file.split(os.path.sep)[-3] for file in files]
return langs
2
你可以使用gettext来检查某个翻译是否可用并且已经安装,但你还需要babel(在我的Ubuntu系统上,它是以python-pybabel
这个包的形式存在)来获取翻译的名称。下面是一个代码片段,可以返回你想要的翻译列表:
import gettext
import babel
messagefiles = gettext.find('OurAppName',
languages=babel.Locale('en').languages.keys(),
all=True)
messagefiles.sort()
languages = [path.split('/')[-3] for path in messagefiles]
langlist = zip(languages,
[babel.Locale.parse(lang).display_name for lang in languages])
print langlist
如果你想在程序运行中间切换语言,可以查看Python文档中相关的部分。这可能需要重新构建你所有的GTK组件,不过我不太确定。
关于gettext.find
的更多信息,可以查看这个链接。