# 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')标记,但是有些是没有的,注意排查后增加对应的\_\_()函数。
- 开发文档
- /输出格式化处理
- /MySQL.md
- /tpl.md
- /locale.md
- /试衣镜.md
- /note.md
- /api/shop.md
- Table of Content
- shop 项目
- 1.1. ActivityCtl
- 1.2. CartCtl
- 1.3. CategoryCtl
- 1.4. ChainCtl
- 1.5. ChooseIndustryCtl
- 1.6. Distribution_UserCtl
- 1.7. IndexCtl
- 1.8. JoinController
- 1.9. JoinCtl
- 1.10. LoginCtl
- 1.11. MediaCtl
- 1.12. PageCtl
- 1.13. PlatformController
- 1.14. PointController
- 1.15. PointCtl
- 1.16. ProductCtl
- 1.17. SitemapCtl
- 1.18. StoreController
- 1.19. StoreCtl
- 1.20. UrlCtl
- 1.21. User_AccountCtl
- 1.22. User_ActivityCtl
- 1.23. User_AskCtl
- 1.24. User_CommentCtl
- 1.25. User_DeliveryAddressCtl
- 1.26. User_FavoritesCtl
- 1.27. User_FeedbackCtl
- 1.28. User_InvoiceCtl
- 1.29. User_OrderCtl
- 1.30. User_ResourceCtl
- 1.31. User_ReturnCtl
- 1.32. User_VoucherCtl
- 1.33. UserCenterController
- 1.34. UserCtl
- 1.35. VerifyCodeCtl
- 1.36. WechatCallbackCtl
- /框架核心说明.md