近来随着i18n的逐渐标准化,在 PHP 也可以利用 gettext 库写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持。以下是gettext对po/mo操作的记录。
操作环境:windows7 ,程序语言:php
因为是Windows环境我们使用GNU gettext,可以进入sourceforge.net下载页面。这里我们下载完整包(Complete package, except sources)
为了方便操作,先把其安装目录下的bin目录加入到系统环境变量 path(路径)中。(步骤:我的电脑->属性->高级-点击 环境变量)
以下是被翻译源码:
<?php
echo gettext('Hello world');
$me=_("in perfect harmony;");
?>
1. 开始创建pot模板文档(默认是生产是po后缀文档,可以需手动改成pot)
打开命令行(win7需要管理员身份运行)命令如下,生成 hello.pot 模板:
xgettext -d hello -o E:\hello.pot --from-code=UTF-8 E:\hello.php
用法:xgettext [选项] [输入文件]…
从给定的输入文件中提取可翻译的字符串。
2. 生成翻译的拷贝 (这是以中文为例zh_CN,同时注意编码)
msginit -i hello.pot -l zh_CN -o my-zh_CN.po
用法:msginit [选项]
创建新的 PO 文件,即根据用户环境取值初始化文件头。
生成my-zh_CN.po完全大写的地方,就是要你(翻译者)去正确填写的部分。不同的国家(地区),不同的翻译者,填写的时候都要遵守一定的规则。而翻译工作,在填完了以上这些头部内容以后,就显得非常简单了。只要对应于 msgid”…” 中的内容,把它翻译成你(翻译者)自己的语言,写在 msgstr”" 中就行了。
3.生成二进制文件
msgfmt my-zh_CN.po -o zh_CN.mo
用法:msgfmt [选项] 文件名.po …
由文字模式描述生成二进制消息文件。
你反编译 可以使用msgunfmt zh_CN.mo -o my-zh_CN.po
在学习Zend_Translate(是Zend框架为多语言应用程序提供的一个解决方案.)时候了解到I18N。
以下是我最近学习一些资料
php需要Gettext 扩展支持I18N 具体可以查看http://www.gnu.org/software/gettext/manual/gettext.html。但据zend framework 手册说明 Gettext 是非线程安全的: PHP’的gettext库不是现在安全的,并且它不应该用于多线程环境中.这是由于gettex本生的问题而不是PHP,但却是一个存在的问题.
在这期间我使用POEDIT编辑翻译源
具体使用方法不多说了,可以查看下面2个参考资料:
PHP gettext 用法
Rails框架开发工具讲座: 介绍国际化编辑器工具poEdit