【Python】Python3之国际化与本地化
最近在完成阿里云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文件同名,十分方便(我首先使用的这种方式)。
整个程序结构如下:
运行效果如下:
- 点赞
- 收藏
- 关注作者
评论(0)