1 寻找一个项目
进入一个python项目,这里我用的是之前写的项目myproject
2 步骤
2.1 在项目的目录下编写i18n.py文件
例如我的路径是:
myproject/myproject目录下面
内容如下:
# -*- encoding: utf-8 -*-
import oslo_i18n
# ref: https://docs.openstack.org/oslo.i18n/ocata/usage.html
DOMAIN = "myproject"
_translators = oslo_i18n.TranslatorFactory(domain=DOMAIN)
_ = _translators.primary
_LI = _translators.log_info
_LW = _translators.log_warning
_LE = _translators.log_eror
_LC = _translators.log_critical
def get_available_languages():
return oslo_i18n.get_available_languages(DOMAIN)
def translate(value, user_locale):
return oslo_i18n.translate(value, user_locale)
2.2 引用_,_LI等
from myproject.i18n import _, _LI
LOG.info(_LI('enter app_factory'))
或者这种用法,推荐用_而不是_LI
result = _('enter app_factory')
LOG.info(result)
经过验证:
发现现在_LI不能被国际化翻译了,_是可以的
3 准备po和mo文件
3.0 基础
PO:
含义: 可移植对象(portable object)。
作用: 被翻译人员使用的资源文件,gettext软件包会处理PO文件
MO:
含义: 机器对象(machine object)
作用: 面向计算机由PO文件通过gettext编译成的二进制文件,程序读取MO文件
使界面转换成用户使用的语言
po文件转换为mo文件: 使用msgfmt和pygettext
无需安装gettext:
因为已经在python的标准库中了,参考:
https://docs.python.org/2.7/py-modindex.html#cap-g
使用方法:
import gettext
/usr/lib/python2.7/site-packages/oslo_i18n
具体用法参见:
gettext.gettext(message)
Return the localized translation of message, based on the current global domain, language, and locale directory. This function is usually aliased as _() in the local namespace (see examples below).
https://docs.python.org/2.7/library/gettext.html#module-gettext
参考:
https://blog.csdn.net/ANXIN997483092/article/details/79539203
https://docs.openstack.org/oslo.i18n/ocata/usage.html
https://docs.openstack.org/oslo.i18n/latest/reference/index.html#oslo_i18n.translate
3.1 创建PO文件
xgettext -k_ -o i18n_demo.pot --from-code=UTF-8 i18n_demo.py
通过:
xgettext --help
查询到用法:
作用: 从给定的输入文件中提取出可翻译的字符串
用法: xgettext [选项] [输入文件]
-k: --keyword, 不使用默认关键字
-o: --output, 将输出写入指定文件
--from-code=名称 :输入文件的编码,例如 UTF-8
-D: --directory=目录, 在目录中查找输入文件
实际命令:
xgettext -k_ -o myproject.pot --from-code=UTF-8 app.py
最终执行
xgettext -k_LI -o myproject.pot --from-code=UTF-8 app.py
生成文件内容如下所示:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-05 15:25+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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: app.py:29
msgid "enter app_factory"
msgstr ""
注意:
需要去除pot中的
#
#, fuzzy
否则会导致后续翻译失败。
同时指定多个关键字:
只需要同时指定多个 -k即可
xgettext -k_LI -k_LW -o myproject.pot --from-code=UTF-8 app.py
从指定目录下提取多个文件的待翻译字符串:
xgettext -k_LI -k_LW -o myproject.pot --from-code=UTF-8 --directory=/home/machao/myproject/test_project/myproject
发现这个不可以
两种解决方法:
方法1:
find /home/cawa/www/deploy/module/Nav/ -type f \( -name '*.php' -or -name '*.phtml' \) -print > list
xgettext --files-from=list --language=PHP -j messages.po
方法2:
进入到项目目录下
find . -iname "*.py" | xargs xgettext -k_LI -k_LW -k_LE -k_LC -k_ --from-code=UTF-8 -o myproject.pot
最终采用方法2。
参考:
https://stackoverflow.com/questions/12671270/how-to-use-xgettext-how-to-parse-directory
修改app.py, students.py
参考:
https://blog.csdn.net/weixin_34137799/article/details/87705189#
https://www.atjiang.com/gnu-gettext-intro/
3.2 aodh中的i18n用法
i18n用法参考aodh的源码文件:
用法1: _LE
LOG.error(
_LE("Action %(scheme)s for alarm %(alarm_id)s is unknown,