SHOP语言包制作
key | value |
---|---|
编写人 | 黄新泽 |
在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档( http://www.gnu.org/software/gettext/manual/gettext.html )
gettext简介
GNU gettext是翻译项目的重要一步,它提供了一个工作框架,由一些集成的工具和文档组成,帮助程序员、翻译人员和最终用户实现程序的国际化和本地化。用 Gettext的方式实现多语言得到了广泛的支持,著名的BLOG程序wordpress的国际化就是用的GNU gettext。
大致原理
GNU gettext使用PO或MO文件来实现国际化和本地化。PO的意思是Portable Object,是一种文本结构,可以方便的由人们阅读和修改。MO是Machine Object的简写,MO文件是PO文件的二进制形态。一般来说,一个PO或MO文件对应于一种语言,如果一个程序要支持多种语言,每一种语言都需要自己 的PO或MO文件。
运行环境
在 phpinfo() 中看到 gettext 字样,如果没有则需要安装php_gettext扩展。
SHOP中PHP使用
配置文件启用语言包/shop/configs/config.ini.php 中打开或者修改如下:
//初始化语言包 //zh_CN 代表使用中文语言包 //ShopSuite 语言包名称 if (function_exists('_')) { init_locale(APP_PATH . '/data/locales/', 'zh_CN', 'ShopSuite'); }
//init_locale 在 /libraries/init.php 中定义如下:
/** * 本地化 I18N 程序范例开始 * * * @param string $lan_path 设置某个域的mo文件路径 * @param string $lang bsd use zh_CN.UTF-8 * @param string $domain 定义要用的mo文件名称,常规来说,我们都把PACKAGE的名称定义和程序名称相同。 * @return void */ function init_locale($lan_path, $lang, $domain) { setlocale(LC_ALL, $lang); //// bsd use zh_CN.UTF-8 bindtextdomain($domain, $lan_path); //设置某个域的mo文件路径 bind_textdomain_codeset($domain, 'UTF-8'); //设置mo文件的编码为UTF-8 textdomain($domain); //设置gettext()函数从哪个域去找mo文件 }
语言包目录结构
-/shop/data/locales +en_US +jp_JP -zh_CN -LC_MESSAGES ShopSuite.mo ShopSuite.po
其它系统同理
SHOP中JS使用
JS中使用,采用数据Key\Value模式。
调用JS文件如下:
/shop/static/default/js/locales/zh_CN/LC_MESSAGES/ShopSuite.js
//key为待翻译, value为翻译后的字符串。
var G={“Title”:”Zero Framework”,”Hello World!”:”世界,你好!”};
调用的时候仍然采用 __(‘key’) 方式。
function __(key)
{
if (G[key])
{
return G[key]
}
else
{
return key;
}
}
语言包工具 - 生成po和mo文件。
- Poedit工具下载地址:https://poedit.net/download (用来编辑po文件,编辑需要翻译的语言,最后自动生成mo文件), 如果下载不了也可百度搜索其它站点下载。
- poedit的使用
如果语言包目录/shop/data/locales/zh_CN/LC_MESSAGES/中已经存在ShopSuite.po文件,直接用poedit进行编辑即可;如果不存在则参见以下步骤: - 点击“文件-新建消息目录文档”。
- 在弹出的对话框中填写“工程名称以及版本”、“团队”、“团队专用电子邮件”、“语言”、“字符集”、“源代码字符集”等信息。注意:不要填写“国家”,否则是否汉化会信赖于国家而不是信赖于语言。
- 切换到“路径”选项卡,在“基本路径”中填入要汉化的主题的路径,在“路径”中加入一个”点(.)”。例如: /shop
- 切换到“关键字”选项卡,在“关键字”中加入“__”和“__e”,这样poedit就会在所有php文件中查找由__()和__e()标识的字符串。
- 点击确定后,弹出“另存为”对话框,把po文件命名为ShopSuite.po。poedit会自动从所有php文件中提取出需要翻译的字符串,如下图所示,一项一项翻译就可以了。
- 在“编辑-首选-编辑器-行为”中勾上“保存时自动编译.mo文件”,则在保存时会自动生成ShopSuite.mo文件。
若翻译完后又在php文件中添加或删除了要翻译的字符串,点击“类目-自源更新”,poedit会查找出相应的变更。
最后记得要 重启Apache,方可看到效果。
备注
针对需要翻译的文字,大部分已经增加__(‘text’)标记,但是有些是没有的,注意排查后增加对应的__()函数。