专栏首页python3python国际化(i18n)和中英文切

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

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 pythonimport 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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 初识Django,了解一下大概流程

    学习Django一个礼拜了,对其有了一个大概的了解,自己画了一个简单的图,虽然有点丑,但是基本上已经把自己所想已经表达

    py3study
  • python中的import

    python中的import操作有点类似于C语言中的#include,但又有很大的不同。在c语言中,#include是编译前将另一个文件包含进当前文件中。在py...

    py3study
  • Python 之文件读写操作

            使用 open 打开文件后,格式:open(filename,mode),最后一定要调用文件对象的 close() 方法,如图所示:

    py3study
  • MeanShift算法C++解析(三)

    最后是最重要的核心啦,就是MeanShift_Tracking这个函数。同样的,我们先来看看这个函数的内部变量。

    钱塘小甲子
  • C 文件读写2

    在执行读文件操作时,如果遇到文件尾,则函数返回逻辑真(1);否则,则返回逻辑假(0)。

    饶文津
  • 面试Mybatis之类型处理器​(typeHandlers)

    无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换...

    小土豆Yuki
  • 放假整理的四个知识,附带小工具

    py 是脚本语言呀,不管是导包,还是定义函数,还是干嘛的,都是一行一行执行的。导入模块的时候,就会把模块内的所有代码执行一次,当然有缓存「pycache」文件,...

    清菡
  • Windows本地域名解析

    进入C:\Windows\System32\drivers\etc目录,找到hosts文件,右键编辑。

    头皮阴都都
  • 千万不要点进来,否则你会后悔的

    是的,我建立了一个免费的知识星球,名字就是:「非著名程序员」读者群。是的,你没有看错,免费加入。

    非著名程序员
  • 傻瓜方法求集合的所有子集问题(java版)

        给定任意长度的一个集合,用一个数组表示,如{"a", "b","c"},求它的所有子集。结果是{ {a}, {b}, {c}, {a,b}, {a,c}...

    天涯泪小武

扫码关注云+社区

领取腾讯云代金券