python国际化(i18n)和中英文切换

简介: Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现: 1.

Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现:

1.         python安装目录下的./Tools/i18n/(windows下例 D:\Program Files\Python25\Tools\i18n)目录中找到pygettext.py运行之,生成翻译文件模版messages.pot,内容大概是这个样子:

 

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2007-01-24 15:05+China Standard Time\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=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"

改之,charset=gb2312 Content-Transfer-Encoding: utf8如下:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2007-01-18 09:55+China Standard Time\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=gb2312\n"
"Content-Transfer-Encoding: utf8\n"
"Generated-By: pygettext.py 1.5\n"

那个msgid” ” msgstr” “不要动

,翻译文件已经建立了,保存之,文件名改为lang.po.

2.         建立翻译文件路径,在主文件目录下建立中文翻译路径 ./locale/cn/LC_MESSAGES/(windows下例D:\ python-prj\src\locale\cn\LC_MESSAGES,其中src目录是源文件主目录),英文翻译路径 ./locale/en/LC_MESSAGES/(windows下例D:\ python-prj\src\locale\en\LC_MESSAGES,其中src目录是源文件主目录)

3.         在主文件中引入gettext模块:

 

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import gettext
gettext.install('lang', './locale', unicode=False)
gettext.translation('lang', './locale', languages=['cn']).install(True)

第四行中lang是翻译文件主名, ./locale是存放翻译文件的路径,第三个参数是是否使用unicode,第五行languages参数指定要使用的语言存放的子目录,这里cn表示使用./locale/cn/LC_MESSAGES/路径下的翻译文件.

注意: # -*- coding: utf-8 -*- 一定要写在前两行,写第三行都不会生效

4.         处理要翻译的字符串,:

 

print “Hello world!”
print “Python is a good Language.

改之:

print _(“Hello world!”)
print _(“Python is a good Language.)

5.         编写并生成翻译文件,打开步骤1中编辑过的lang.po文件添加翻译文字,形成如下内容:

 

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2007-01-18 09:55+China Standard Time\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=gb2312\n"
"Content-Transfer-Encoding: utf8\n"
"Generated-By: pygettext.py 1.5\n"

msgid " Hello world!"
msgstr "世界你好!"

msgid " Python is a good Language."
msgstr "Python 是门好语言."

保存之,运行./Tools/i18n/目录下的msgfmt.py,Linux下命令为: python msgfmt.py lang.po(widows下的话,lang.po文件拷贝到./Tools/i18n/目录下,运行命令行窗口,到改目录下键入:msgfmt.py lang.po),生成lang.mo,将该文件拷贝至./locale/cn/LC_MESSAGES/目录下,将步骤1生成的lang.po文件直接生成lang.mo文件拷贝到./locale/en/LC_MESSAGES/目录下,好了一切都准备好了,命令行下运行你的主文件,看看两个print命令是不是输出了世界你好! Python 是门好语言.,如果将主文件第五行languages参数置为en,则输出是Hello world! Python is a good Language.,因为en目录下lang.mo文件未做任何的翻译,默认字符串不被替换.

上述实现的方法用在界面编程上可以实现中英文界面的切换,需要作个配置文件选择中/英文;或者在主文件开始时先获取操作系统本地语言然后根据获取结果再设置中/英文,这样就可以实现软件语言自适应;如果想实现软件语言在线切换,对于python来说就比较困难了,需要在软件中加入界面刷新机制,不推荐,可以在切换中/英文设置后软件下一次启动生效(软件如Ulipad).

 

Note:

.调用python安装目录的 Tools/i18n/pygettext.py抽取所需翻译的模板
>>> pygettext.py path/to/yourfile.py
将生成一个名为messages.pot的文件
2.生成模板文件后,修改这个模板文件,其中的msgid为键值,对应你程序里写的文本,如:_("New File"),而msgstr为翻译后的值。还有就是注意修改文件头部分Content-Type的charset为合适的编码,比如utf8
3.编写好模板后,把扩展名修改为.po,运行Tools/i18n/msgfmt.py,生成二进制的资源文件
>>> msgfmt.py messages.po
将生成一个名为messages.mo的文件
4.把这个mo文件放在正确的位置.
比如你在程序中是这样写的:
gettext.install('i18ntest', './locale', unicode=True)
gettext.translation('i18ntest', './locale', languages=['cn']).install(True)
那么你的程序目录下需要存在./local/cn/LC_MESSAGES/i18ntest.mo

这样程序启动时就会读取这个资源文件,替换对应的文本,实现国际化了。
注意:如果使用utf格式保存,po文件不能有BOM头。cn目录是所对应的语言,LC_MESSAGES目录是gettext.py里要求的,mo文件必须和所定义的域同名,见
gettext.py的mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain)

目录
相关文章
|
Python
python + uiautomator2编译平板语言工具并切换打包exe可执行文件1.1.4版本--终版(下)
python + uiautomator2编译平板语言工具并切换打包exe可执行文件1.1.4版本--终版(下)
198 0
python + uiautomator2编译平板语言工具并切换打包exe可执行文件1.1.4版本--终版(下)
|
Python
python + uiautomator2编译平板语言工具并切换打包exe可执行文件1.1.4版本--终版(上)
python + uiautomator2编译平板语言工具并切换打包exe可执行文件1.1.4版本--终版(上)
255 0
python + uiautomator2编译平板语言工具并切换打包exe可执行文件1.1.4版本--终版(上)
|
Python
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(下)
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(下)
314 0
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(下)
|
Python
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(中)
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(中)
416 0
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(中)
|
Shell Python
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(上)
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(上)
394 0
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(上)
|
Python
Babel | Python国际化就用它
Babel | Python国际化就用它
406 0
|
索引 Python
一文搞清楚python混乱的切换操作和优雅的推导式
因为工作中不怎么使用python,所以对python的了解不够,只是在使用的时候才去学,在之前的几个例子中几乎没使用什么python的特有语法,本着完成任务优先的原则也没有深入,但是在阅读别人的代码的时候发现有些特有语法不是很熟悉,搞不清代码的真正意思,今天就搞清楚切片和推导式的使用,OK。我们开始吧
111 0
一文搞清楚python混乱的切换操作和优雅的推导式
|
数据采集 监控 JavaScript
Python切换代理开发指南
在这本开发指南中,您将了解到如何使用requests库设置一个代理、使用Scrapy隧道代理中间件、使用2808Proxy隧道代理,2808Proxy可以申请14天的试用时间。 代理是一个中间服务器,它隐藏了您的IP,因此您可以匿名和安全地浏览网页。它有许多非常有趣的实用案例,最常见的是定价情报的网络抓取、SEO监控、市场研究的数据收集等。
286 1
|
小程序 IDE API
使用Python做一个切换电脑桌面壁纸的小程序
简介:免费的壁纸软件竟有许多广告,影响自己体验? 那就使用python自己制作一个小软件满足自己的需求!
使用Python做一个切换电脑桌面壁纸的小程序