列出PyGTK UI字符串可用语言

3 投票
2 回答
715 浏览
提问于 2025-04-15 23:02

我正在整理我们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的更多信息,可以查看这个链接

撰写回答