python gettext使用简介

概要

gettext模块为Python模块和应用程序提供国际化(i18n)和本地化(l10n)支持。该模块既支持GNU gettext风格的API,也支持更高级的、基于类的API。通过gettext,在应用程序中,可以只使用一种自然语言。之后,在运行时,再将其翻译成多种不同的自然语言。


GNU gettext风格API

需要注意的是:GNU风格的API会全局地影响整个应用程序的翻译。因此,当应用程序需要在运行时切换语言的话,那么应该使用基于类的API。

  • gettext.bindtextdomain(domain, localedir=None)
    • domain绑定到locale目录localdir。对于给定的domain,gettext会使用路径:localedir/language/LC_MESSAGES/domain.mo寻找二进制的.mo文件。其中language的值是环境变量LANGUAGELC_ALLLC_MESSAGESLANG中的第一个非空值。
      如果省略了localedir或者将其设置为None,该函数会返回domain当前所绑定到的locale目录
  • gettext.bind_textdomain_codeset(domain, codeset=None)
    • domain绑定到codeset上。该函数会改变gettext()系列函数所返回的字符串的编码。如果忽略了codeset,那么会返回当前绑定的字符集
  • gettext.textdomain(domain=None)
    • 更改或查询当前的全局domain。如果domain参数的值是None,那么该函数返回当前的全局domain,否则将当前的全局domain设置为domain参数所指定的值,并返回
  • gettext.gettext(message)
    • 根据当前的全局domain,language和locale目录,返回message的本地化翻译

例1:

  • 创建源代码文件:
  1 #coding: utf8
  2
  3 import os
  4 import gettext
  5
  6 for name in ["LANGUAGE", "LC_ALL", "LC_MESSAGES", "LANG"]:
  7     if name in os.environ and os.environ[name]:
  8         print "当前的语言环境是:", os.environ[name]
  9
 10 gettext.bindtextdomain("test_messages", "translations/")
 11 gettext.textdomain("test_messages")
 12
 13 _ = gettext.gettext
 14 print _("just a test string")
 15 gettext.textdomain("messages")
 16 print _("just a test string")  
  • 创建locale相关的目录:
mkdir -p translations/en_US/LC_MESSAGES/  
  • 使用GNU工具xgettext从源代码中抽取需要国际化的文本消息:
xgettext test_gettext.py -o test_messages.pot  
  • test_messages.pot作为模版,创建test_messages.po文件,并将po文件拷贝到locale目录:
vim test_messages.pot

...
17 "Content-Type: text/plain; charset=UTF-8\n"  
...
21 msgid "just a test string"  
22 msgstr "这是一个测试字符串"  
mv test_messages.pot translations/en_US/LC_MESSAGES/  
  • .po文件转换成二进制的.mo文件
msgfmt translations/en_US/LC_MESSAGES/test_messages.po -o translations/en_US/LC_MESSAGES/test_messages.mo  
  • 执行源代码:
[vagrant@hadoop-slave-1 test]$ python test_gettext.py
当前的语言环境是: en_US.UTF-8
这是一个测试字符串
just a test string  

基于类的API

  • gettext.find(domain, localedir=None, languages=None, all=False)
    • 该函数实现了标准的.mo文件搜索算法。domain参数的含义与gettext.textdomain函数中的domain参数的含义相同;可选的localedir参数与gettext.bindtextdomain函数中的localedir参数的含义相同;可选的languages参数是一个字符串列表,列表中的每一个字符串代表一个 语言代码。
      如果没有指定localedir,那么会使用系统默认的locale目录。如果没有指定languages,那么会使用环境变量LANGUAGELC_ALLLC_MESSAGESLANG中的第一个非空值,这几个环境变量的值应该是冒号分隔的语言编码列表。
      find函数会展开和标准化languages,然后通过它们来迭代,搜索.mo文件(localedir/language/LC_MESSAGES/domain.mo)。
      默认情况下,find函数在找到一个已经存在的.mo文件后,就会返回。如果将all参数设置为True,那么find函数会返回所有符合条件的.mo文件的列表
  • gettext.translation(domain, localedir=None, languages=None, class_=None, fallback=False, codeset=None)
    • 根据domainlocaledirlanguages,返回一个Translations实例,这些参数首先会被传递给find函数,用以获取相关的.mo文件路径列表。
      如果提供了class_参数,那么使用class_参数所指定的类来生成Translations实例,否则使用GNUTranslations生成Translations实例。并且这些类的构造器必须有且仅有一个file object参数。
      如果没有找到.mo文件,并且fallback参数是False,那么这个函数会抛出OSError;如果fallback参数是True,那么返回一个NullTranslations实例。

下面是例1的另外一种写法:

1.jpg


参考文档

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: