官方文档:
https://docs.openstack.org/oslo.i18n/latest/user/usage.html
https://docs.openstack.org/oslo.i18n/latest/user/guidelines.htmlhtml
.mo
文件1. 运行 Python 安装目录下的 Tools/i18n/pygettext.py
,生成 .pot
文件模版
messages.pot:linux
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2019-10-23 13:37+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n"
2. 修改 .pot
文件:写入翻译,保存为 .po
文件app
messages.po:dom
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2019-10-23 13:37+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" msgid "Hello world" msgstr "你好,世界"
3. 运行 Python 安装目录下的 Tools/i18n/msgfmt.py
,经过 .po
文件生成 .mo
文件
4. 将 .mo
文件放入文件夹 <localedir>/<language>/LC_MESSAGES/<domain>.mo
(默认为: /usr/share/locale/zh_CN/LC_MESSAGES/),文件名为程序名ide
首先须要实例化一个 oslo_i18n.TranslatorFactory
对象
以后将 .primary
封装成 (_
)
在报错的字符串前使用 _
函数对字符串进行处理函数
import oslo_i18n as i18n DOMAIN = 'my_app' _translators = i18n.TranslatorFactory(domain='my_app') # The primary translation function using the well-known name "_" _ = _translators.primary # The contextual translation function using the name "_C" # requires oslo.i18n >=2.1.0 _C = _translators.contextual_form # The plural translation function using the name "_P" # requires oslo.i18n >=2.1.0 _P = _translators.plural_form # Translators for log levels. # # The abbreviated names are meant to reflect the usual use of a short # name like '_'. The "L" is for "log" and the other letter comes from # the level. _LI = _translators.log_info _LW = _translators.log_warning _LE = _translators.log_error _LC = _translators.log_critical def translate(value, user_locale): return i18n.translate(value, user_locale) def get_available_languages(): return i18n.get_available_languages(DOMAIN)
将须要翻译的字符串使用 _()
处理ui
LOG.error('There was an error.') raise LocalExceptionClass(_('An error occurred.'))
_()
在使用 _()
函数时须要注意的是:_()
是用来标记代码中的可翻译字符串,因此应该直接传入字符串,而不是变量名翻译
_C()
_C()
是用来进行上下文翻译的日志
_P()
_P()
是用来进行负数翻译的code
官方再也不支持日志翻译,若是须要翻译使用 _
便可
以前支持的
LOG.INFO: _LI()
LOG.WARNING: _LW()
LOG.ERROR: _LE()
LOG.CRITICAL: _LC()
I18N 模块会根据 Linux 系统语言的设定,去寻找相应的语言包
经过 echo $LANG
进行查看
经过 export LANG=en_US.UTF-8
进行临时修改 (即时生效,重启失效)
经过修改配置文件 /etc/locale.conf
能够永久生效,须要 source /etc/locale.conf
使其当即生效