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

时间:2010-05-23 09:42:43

标签: python gtk translation pygtk gettext

我正在清理PyGTK应用程序中的一些本地化和翻译设置。该应用程序仅用于GNU / Linux系统。我们想要的功能之一是用户选择用于应用程序的语言(有些人更喜欢他们的母语,有些人更喜欢英语一致,有些人喜欢法语,因为它听起来很浪漫等)。

为此,我需要实际显示一个包含各种语言的组合框。我怎样才能得到这个清单?事实上,我需要一组语言代码(“en”,“ru”等)和语言名称的母语(“英语(美国)”,“Русские”) )。

如果我必须实现强力方法,我会做类似的事情:在系统语言环境dir(例如“/ usr / share / locale”)中查找所有语言代码dirs(例如“en /” )包含相对路径“LC_MESSAGES / OurAppName.mo”。

是否有更程序化的方式?

2 个答案:

答案 0 :(得分: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

要更改程序中间的语言,请参阅relevant section of the Python docs。这可能需要重建你所有的GTK小部件,虽然我不确定。

有关gettext.find的更多信息,这里也是link

答案 1 :(得分:1)

这是一个受gettext.find启发的功能,但是看看是否存在哪些文件,而不需要Babel的语言列表。它返回语言环境代码,你仍然需要使用babel为每个代码获取display_name。

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