【Python】Python3之国际化与本地化

举报
华为MVP-技术无限 发表于 2019/05/15 11:40:09 2019/05/15
【摘要】 最近在完成阿里云MVP共创任务定pgAdmin4定制任务的时候,接触到了Python的本地化与国际化,了解了Python多语言化的基本知识,记录一下分享。其中涉及Python基础类库gettext,大家可访问官方API。首先创建一个测试文件i18ndemo.py,基本内容如下:# Python Localization Sampleimport os, gettext, sys# Suppo...

最近在完成阿里云MVP共创任务定pgAdmin4定制任务的时候,接触到了Python的本地化与国际化,了解了Python多语言化的基本知识,记录一下分享。
其中涉及Python基础类库gettext,大家可访问官方API
首先创建一个测试文件i18ndemo.py,基本内容如下:

# Python Localization Sampleimport os, gettext, sys

# Support localization
_ = None
def getUserLanguage():    if (len(sys.argv) > 1):        return sys.argv[1]    return "zh-CN"# Get loc string by language
def getLocStrings():
    currentDir = os.path.dirname(os.path.realpath(__file__))    return gettext.translation('resource', currentDir, [getUserLanguage(), "en-US"]).gettext 

_ = getLocStrings()
print(_("Hello"))

该程序接受一个参数指定语言区域(可参考全球语言区域)。在不输入语言码的情况下默认为zh-CN(中文)。
我们把把所有需要本地化的字符串放到_()里面,注意‘resource’是资源文件的名字,例如:'resource.mo'。getUserLanguage() 返回需要显示的语言,"en-US"作为备份,如果找不到对应语言的资源文件,就使用"en-US"。
pygettext.py在python安装目录下 Toolsi18n 文件夹里面。 使用pygettext.py从py文件中提取所有被标记成需要本地化的字符串,也就是在_()里面的字符串。 例如:
运行

python [pathto]pygettext.py -o resource.pot locsample.py

生成resource.pot。其中pathto是pygettext.py文件所在的路径。一般在Python安装目录的Toolsi18n目录下。
生成的内容如下:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2019-05-13 11:13+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=cp936\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"


#: locsample.py:15
msgid "Hello"
msgstr ""

我们在i18ndemo.py同级目录下创建zh-CNLC_MESSAGES,en-USLC_MESSAGES两个目录,把resource.pot改名为resource.po,为每种语言拷贝一份resource.po,zh-CN的resource.po内容修改如下:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2019-05-13 08:51+0800\n"
"PO-Revision-Date: 2019-05-13 11:08+0800\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=cp936\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 2.2\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"

msgid "Hello"
msgstr "你好,世界"

en-US的resource.po内容如下:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2019-05-13 11:13+0800\n"
"PO-Revision-Date: 2019-05-13 11:14+0800\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=cp936\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en_US\n"
"X-Generator: Poedit 2.2\n"

#: locsample.py:15
msgid "Hello"
msgstr "Hello World"

将每种语言的po文件编译为gettext可读写的二进制mo文件,这里有两种方式,一种是使用python提供的工具,运行如下命令

python [pathto]msgfmt.py -o resource.mo resource.po

运行命令时候进入每种语言的目录LC_MESSAGES目录下。
另一种就是使用poEdit软件编辑保存,它会自动生成一份mo文件,并且同po文件同名,十分方便(我首先使用的这种方式)。
整个程序结构如下:

2019-05-13_140043.png

运行效果如下:

2019-05-13_140250.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。