# 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文件。

## 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. 在彈出的對話框中填寫“工程名稱以及版本”、“團隊”、“團隊專用電子郵件”、“語言”、“字符集”、“源代碼字符集”等信息。注意:不要填寫“國家”,否則是否漢化會信賴于國家而不是信賴于語言。
5. 切換到“路徑”選項卡,在“基本路徑”中填入要漢化的主題的路徑,在“路徑”中加入一個"點(.)"。例如: /shop
6. 切換到“關鍵字”選項卡,在“關鍵字”中加入“\_\_”和“\_\_e”,這樣poedit就會在所有php文件中查找由\_\_()和\_\_e()標識的字符串。(images/screenshot_1560311657403.png)
7. 點擊確定后,彈出“另存為”對話框,把po文件命名為BbcBuilder.po。poedit會自動從所有php文件中提取出需要翻譯的字符串,如下圖所示,一項一項翻譯就可以了。
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