代码之家  ›  专栏  ›  技术社区  ›  detly FBruynbroeck

列出Pygtk用户界面字符串的可用语言

  •  3
  • detly FBruynbroeck  · 技术社区  · 14 年前

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

    为了使其工作,我需要实际地显示一个具有各种可用语言的组合框。我怎样才能得到这个清单?实际上,我需要一个语言代码对的列表(“en”、“ru”等)和语言名称 用母语 (“英语(美国)”,“____ _:”__祫”)。

    如果我必须实现一个蛮力方法,我会做一些类似的事情:在系统区域设置目录(例如“/usr/share/locale”)中查找包含相对路径“lc-messages/ourappname.mo”的所有语言代码目录(例如“en/”)。

    有没有一种更具规划性的方法?

    2 回复  |  直到 13 年前
        1
  •  2
  •   ptomato    14 年前

    您可以使用gettex来查找翻译是否可用和安装,但是您需要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 也一样。

        2
  •  1
  •   Dave Brondsema    13 年前

    这是一个受gettex.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