我正在清理PyGTK应用程序中的一些本地化和翻译设置。该应用程序仅用于GNU / Linux系统。我们想要的功能之一是用户选择用于应用程序的语言(有些人更喜欢他们的母语,有些人更喜欢英语一致,有些人喜欢法语,因为它听起来很浪漫等)。
为此,我需要实际显示一个包含各种语言的组合框。我怎样才能得到这个清单?事实上,我需要一组语言代码(“en”,“ru”等)和语言名称的母语(“英语(美国)”,“Русские”) )。
如果我必须实现强力方法,我会做类似的事情:在系统语言环境dir(例如“/ usr / share / locale”)中查找所有语言代码dirs(例如“en /” )包含相对路径“LC_MESSAGES / OurAppName.mo”。
是否有更程序化的方式?
答案 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