使用i18n使应用程序国际化

为了赶上国际化的潮流,或者单单是为了汉化歪果仁的优秀成果,使用i18n可以方便的完成国际化。

1 简介

摘自《开源世界旅行手册》作者:kardinal
习惯上,internationalization(国际化)简写为I18N,中间的数字为省略的字母个数。
在 Linux 系统中,通过定义一组环境变量来设置程序的语言环境,以实现对I18N的支持,这种机制称为:locale(本地化)
[email protected]:~$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[email protected]:~$
locale 变量LANG         低优先级全局 locale 变量         如果下面的变量未赋值,默认使用此变量的值
LC_COLLATE         比较和排序习惯         会影响目录列表的分类显示等
LC_CTYPE         定义系统的字符处理特性         哪些字符能被视为字母、数字,等等;与中文输入关系密切
LC_MESSAGES         提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等
LC_MONETARY         定义货币单位和货币型数值的格式
LC_NUMERIC         定义非货币型数值的格式         影响到千位分隔符和小数分隔符等
LC_TIME         定义日期和时间的格式
LC_NAME         姓名书写方式
LC_ADDRESS         地址书写方式
LC_TELEPHONE         电话号码书写方式
LC_MEASUREMENT         度量衡表达方式
LC_PAPER         定义默认的纸张尺寸
LC_IDENTIFICATION         对 locale 自身包含信息的概述
LC_ALL         高优先级全局 locale 变量         为此变量赋值会强行覆盖上面变量的值,不推荐
假如未设置以上变量,系统将采用 POSIX 作为 lcoale,也就是 C locale
locale值locale 变量的值有三个要素:语言代码 (Language Code)、 地域代码 (Country Code) 和字符集(Encoding)(中文 Windows 系统中使用的字符集为GB2132,而 UTF-8 是大势所趋,它能够显示比 GB2132 更多的字符)
语言代码[_地域代码[.字符集]]例如:
语言/国家代码         描述
en_US.ISO-8859-1         美国英语
en_US.UTF-8
zh_CN.UTF-8         简体中文
zh_TW.UTF-8         繁体中文
字符集众所周知,计算机中的信息,是以数字形式表示的,字符也不例外。字符以数字编号的形式存储,使用时,根据这个编号,在字符集中找到相应的字符
字符集是字符在系统内的编码方式,也就是通常所说的内码。不同的字符集有不同的编码方式,
例如“码”字,它的 GB2312编码 为 426B;UTF-8编码 为 E7A081 。如果错误的以 GB2312编码 来检索 E7A081,将会产生类似 “锘跨爜” 的乱码
只要系统中安装了中文字体,通过字符集的支持,便可以正常显示中文,而无需设置 locale;locale 可以使操作界面显示中文,并可以使用中文输入等
其他另外还有一个本地化变量叫做 LINGUAS。它会影响到基于 gettext 的程序;它还能决定某些特殊软件包的本地化,比如kde-i18n和openoffice。这个变量的值为一组以空格分隔的语言代码:
LINGUAS="zh en"

2 PO文件和MO文件

PO 是 Portable Object (可移植对象)的缩写形式;MO 是 Machine Object (机器对象) 的缩写形式。PO 文件是面向翻译人员的、提取于源代码的一种资源文件。当软件升级的时候,通过使用 gettext 软件包处理 PO 文件,可以在一定程度上使翻译成果得以继承,减轻翻译人员的负担。MO 文件是面向计算机的、由 PO 文件通过 gettext 软件包编译而成的二进制文件。程序通过读取 MO 文件使自身的界面转换成用户使用的语言。

I18N 主要使用什么工具工作?

I18N 主要使用 gettext 软件包使软件实现国际化支持。事实上它是一整套 I18N 解决方案。

4 PO和MO文件的转化

po文件和mo文件通过msgfmt工具转化。

创建po文档:在当前目录下创建locale文件夹,下面分别建en_US/LC_MESSAGES/ 和 zh_CN/LC_MESSAGES/目录。

创建mo文档:在当前目录下使用msgfmt程序转换po文件到莫文件。

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)

时间: 2024-10-10 07:16:03

使用i18n使应用程序国际化的相关文章

iOS之应用程序国际化

iOS之应用程序国际化 一.程序国际化 准备工作: 1.首先我们要先创建一个工程,我们给他命名Internationalization-Demo,然后添加语言. 从代码中分离文本: 目前,应用展示的所有文本都是以硬编码字符串存在于Main.storyboard 和 ViewController里.为了本地化这些字符串,你需要把它们放在一个单独的文件中.他将会在包中简单地引用这些字符串,而不是在你的方法中进行硬编码.Xcode使用带有 .strings 扩展名的文件来存储和检索app中使用的所有字

iOS开发-Xcode6应用程序国际化本地化

[置顶] iOS开发-Xcode6应用程序国际化本地化 分类: iOS开发2014-10-11 19:44 3116人阅读 评论(0) 收藏 举报 ios应用国际化本地化xcodeiOS国际化终极教程 应用程序国际化和本地化 本文来自:http://blog.csdn.net/yangbingbinga/article/details/39998673转载请注明出处 1.国际化.首先创建一个工程,在  Localizations里面添加你需要支持的语言 2.然后对要国际化的东西  如,故事板 右

iOS 多语言支持,应用程序国际化 xcode4.5

最近要对一款游戏进行多语言本地化,在网上找了一些方案,加上自己的一点点想法整理出一套方案和大家分享! 多语言在应用程序中一般有两种做法:一.程序中提供给用户自己选择的机会:二.根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 第一种做法比较简单完全靠自己的发挥了,这里主要讲第二种做法,主要分一下几点: 1.本地化应用程序名称2.本地化字符串3.本地化图片4.本地化其他文件 1.本地化应用程序名称 (1)点击"new file"然后在弹出窗口左侧选择IOS的resource

WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中——浏览器里运行其他语言的程序?

Mozilla.谷歌.微软和苹果已经决定开发一种面向Web的二进制格式.该格式名为WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中. 几年前,我们在InfoQ上讨论过面向Web的通用字节码的优点(见<讨论:我们是否需要一种通用的Web字节码?>),概括了创建这样一种格式的困难.其中提及的一个主要问题是主要的浏览器制造商无法达成一致:Mozilla在推asm.js,谷歌支持PNaCI,苹果在开发FLTJIT,而微软没有对其中的任何一种表示出兴趣.但现

IOS 应用程序国际化

一.什么是应用程序的国际化? 根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 对于个人开发者而言国外市场比国内市场更加有价值些,毕竟国外的版权意识,付费理念较好些. 二.怎么做? 1.本地化应用程序名称 (1)应用程序名称的设置在 InfoPlist.strings文件中,而本地化的InofPlist.strings(simple Chinese)等在Xcode 5 之后只能在Project ->Info-> Localizations 中点击加号添加即可.操作如下图 (2)点

[转]通过apk签名使应用程序有系统权限

[转]通过apk签名使应用程序有系统权限 (2013-01-08 13:40:50) 转载▼ it 分类: Android 出处:http://blog.csdn.net/doom66151/article/details/7085464 问题: 系统预装软件,需要访问一些配置文件,配置文件的owner都是设置为system.所以应用程序需要有授权才可以读写. google搜索找到以下文章,解决了这个问题. 以下内容解释了: android系统权限规则? 如何使应用程序获取系统权限? apk签名

ios应用程序国际化

1.程序名称国际化: 在Xcode中新建项目后,可以在project的info选项卡中找到Localization的项目,可以添加应用程序需要支持的国际语言. 回到项目中可以发现在InfoPlist.strings.Main.storyboard(Main.strings)增加了相应项,而Localizable.strings文件如果已经存在的情况也会增加对应的语言版本.(默认情况,Xcode5+iOS7下Localizable文件需要新建,如下图) 完成以上的设置和文件添加,来看应用程序国际化

通过try、except和else的使用来使Python程序更加“强壮”

在执行的程序中,难免会碰到因为一些原因如输入输出导致致命性错误产生的情况(如因为输入的文件名错误而导致无法运行相关的代码.).此时你不希望程序直接挂掉,而是通过显示一些信息,使其平稳的结束.此时,就可以使用try,except和else这三个关键字来组成一个包容性很好的程序. 分别解释三个关键字: try:执行可能会出错的试探性语句,即这里面的语句是可以导致致命性错误使得程序无法继续执行下去 except:如果try里面的语句无法正确执行,那么就执行except里面的语句,这里面可以是错误信息或

应用程序国际化

应用程序本地化 标签: iosiOSIOS国际化多语言本地化 一.简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名 * 当本地化的应用程序需要载入某一资源时,如图像.属性列表.nib文件,应用程序会检查用户的语言和地区,并查找相匹配的本地化文件夹.如果找到了相应的文件夹,就会载入这个文件夹中的资源 二.默认的效果图 工程目录结构 运行效