python 64式: 第24式、python项目国际化翻译实战

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, 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值