ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 1\. SHOP语言包制作 | key | value | | --- | --- | | 编写人 | pm关 | 在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档([http://www.gnu.org/software/gettext/manual/gettext.html](http://www.gnu.org/software/gettext/manual/gettext.html)) ## 1.1. gettext简介 GNU gettext是翻译项目的重要一步,它提供了一个工作框架,由一些集成的工具和文档组成,帮助程序员、翻译人员和最终用户实现程序的国际化和本地化。用 Gettext的方式实现多语言得到了广泛的支持,著名的BLOG程序wordpress的国际化就是用的GNU gettext。 ## 1.2. 大致原理 GNU gettext使用PO或MO文件来实现国际化和本地化。PO的意思是Portable Object,是一种文本结构,可以方便的由人们阅读和修改。MO是Machine Object的简写,MO文件是PO文件的二进制形态。一般来说,一个PO或MO文件对应于一种语言,如果一个程序要支持多种语言,每一种语言都需要自己 的PO或MO文件。 ![image](https://static.shopsuite.cn/p/poedit/o_gettext01.jpg) ## 1.3. 运行环境 在 phpinfo() 中看到 gettext 字样,如果没有则需要安装php\_gettext扩展。 ## 1.4. SHOP中PHP使用 1. 配置文件启用语言包/shop/configs/config.ini.php 中打开或者修改如下: ~~~php //初始化语言包 //zh_CN 代表使用中文语言包 //BbcBuilder 语言包名称 if (function_exists('_')) { init_locale(APP_PATH . '/data/locales/', 'zh_CN', 'BbcBuilder'); } ~~~ //init\_locale 在 /libraries/**init**.php 中定义如下: ~~~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文件 } ~~~ 2. 语言包目录结构 ~~~ -/shop/data/locales +en_US +jp_JP -zh_CN -LC_MESSAGES BbcBuilder.mo BbcBuilder.po ~~~ 3. 其它系统同理 ## 1.5. SHOP中JS使用 JS中使用,采用数据Key\\Value模式。 调用JS文件如下: /shop/static/default/js/locales/zh\_CN/LC\_MESSAGES/BbcBuilder.js //key为待翻译, value为翻译后的字符串。 var G={"Title":"Zero Framework","Hello World!":"世界,你好!"}; 调用的时候仍然采用 \_\_('key') 方式。 ~~~ function __(key) { if (G[key]) { return G[key] } else { return key; } } ~~~ ## 1.6. 语言包工具 - 生成po和mo文件。 1. Poedit工具下载地址:[https://poedit.net/download](https://poedit.net/download)(用来编辑po文件,编辑需要翻译的语言,最后自动生成mo文件), 如果下载不了也可百度搜索其它站点下载。 2. poedit的使用 如果语言包目录/shop/data/locales/zh\_CN/LC\_MESSAGES/中已经存在BbcBuilder.po文件,直接用poedit进行编辑即可;如果不存在则参见以下步骤: 3. 点击“文件-新建消息目录文档”。 4. 在弹出的对话框中填写“工程名称以及版本”、“团队”、“团队专用电子邮件”、“语言”、“字符集”、“源代码字符集”等信息。注意:不要填写“国家”,否则是否汉化会信赖于国家而不是信赖于语言。![](https://box.kancloud.cn/991ffc3d36dcfb971acaacaf2b9fd86c_321x351.png) 5. 切换到“路径”选项卡,在“基本路径”中填入要汉化的主题的路径,在“路径”中加入一个"点(.)"。例如: /shop![](https://box.kancloud.cn/64c1fcc5f1da7fa39ac7cedcd28da3bb_323x354.png) 6. 切换到“关键字”选项卡,在“关键字”中加入“\_\_”和“\_\_e”,这样poedit就会在所有php文件中查找由\_\_()和\_\_e()标识的字符串。(images/screenshot_1560311657403.png) 7. 点击确定后,弹出“另存为”对话框,把po文件命名为BbcBuilder.po。poedit会自动从所有php文件中提取出需要翻译的字符串,如下图所示,一项一项翻译就可以了。![](https://box.kancloud.cn/b7b05cfc3db7df3c9af52d3758f726f8_504x467.png) 8. 在“编辑-首选-编辑器-行为”中勾上“保存时自动编译.mo文件”,则在保存时会自动生成BbcBuilder.mo文件。 若翻译完后又在php文件中添加或删除了要翻译的字符串,点击“类目-自源更新”,poedit会查找出相应的变更。 ## 1.7. 最后记得要 重启Apache,方可看到效果。 ## 1.8. 备注 针对需要翻译的文字,大部分已经增加\_\_('text')标记,但是有些是没有的,注意排查后增加对应的\_\_()函数。