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

发布于 2024-09-02 18:46:38 字数 391 浏览 7 评论 0原文

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

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

如果我必须实现暴力方法,我会这样做:在系统区域设置目录(例如“/usr/share/locale”)中查找包含以下内容的所有语言代码目录(例如“en/”)相对路径“LC_MESSAGES/OurAppName.mo”。

有没有更程序化的方式?

I'm cleaning up some localisation and translation settings in our PyGTK application. The app is only intended to be used under GNU/Linux systems. One of the features we want is for users to select the language used for the applications (some prefer their native language, some prefer English for consistency, some like French because it sounds romantic, etc).

For this to work, I need to actually show a combo box with the various languages available. How can I get this list? In fact, I need a list of pairs of the language code ("en", "ru", etc) and the language name in the native language ("English (US)", "Русские").

If I had to implement a brute force method, I'd do something like: look in the system locale dir (eg. "/usr/share/locale") for all language code dirs (eg. "en/") containing the relative path "LC_MESSAGES/OurAppName.mo".

Is there a more programmatic way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

嘿嘿嘿 2024-09-09 18:46:38

您可以使用 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 的更多信息,请参阅 也链接到该链接。

You can use gettext to find whether a translation is available and installed, but you need babel (which was available on my Ubuntu system as the package python-pybabel) to get the names. Here is a code snippet which returns the list that you want:

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

To change languages in the middle of your program, see the relevant section of the Python docs. This probably entails reconstructing all your GTK widgets, although I'm not sure.

For more information on gettext.find, here is the link to that too.

怪我鬧 2024-09-09 18:46:38

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

Here's a function inspired by gettext.find, but looks to see what files exist, rather than needing a list of languages from Babel. It returns the locale codes, you'll still have to use babel to get display_name for each.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文