列出 PyGTK UI 字符串可用的语言

3
我正在清理我们的PyGTK应用程序中的本地化和翻译设置。该应用程序仅适用于GNU/Linux系统。我们想要的一个功能是让用户选择应用程序使用的语言(有些人喜欢使用他们的母语,有些人喜欢英语以保持一致性,有些人喜欢法语因为它听起来很浪漫等等)。
为了实现这个功能,我需要显示一个下拉框,其中包含可用的各种语言。我该如何获取此列表?实际上,我需要一份语言代码(“en”,“ru”等)和本地语言名称(“English(US)”,“Русские”)的配对列表。
如果我必须实现一种蛮力方法,我会做类似以下的事情:查找系统区域设置目录(例如“/usr/share/locale”),找到所有包含相对路径“LC_MESSAGES/OurAppName.mo”的语言代码目录(例如“en/”)。
是否有更加程序化的方法?
2个回答

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的更多信息,请参阅链接

我之前不知道gettext.find(...)方法或者babel包,太棒了!我很快会试一下。 - detly
相当不错,但不在线 -- 它们是随软件包安装的。 - ptomato

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接