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

image

运行环境

在 phpinfo() 中看到 gettext 字样,如果没有则需要安装php_gettext扩展。

SHOP中PHP使用

  1. 配置文件启用语言包/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文件
     }
  2. 语言包目录结构

     -/shop/data/locales
         +en_US
         +jp_JP
         -zh_CN
             -LC_MESSAGES
                 ShopSuite.mo
                 ShopSuite.po
    
  3. 其它系统同理

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

  1. Poedit工具下载地址:https://poedit.net/download (用来编辑po文件,编辑需要翻译的语言,最后自动生成mo文件), 如果下载不了也可百度搜索其它站点下载。
  2. poedit的使用
    如果语言包目录/shop/data/locales/zh_CN/LC_MESSAGES/中已经存在ShopSuite.po文件,直接用poedit进行编辑即可;如果不存在则参见以下步骤:
  3. 点击“文件-新建消息目录文档”。
  4. 在弹出的对话框中填写“工程名称以及版本”、“团队”、“团队专用电子邮件”、“语言”、“字符集”、“源代码字符集”等信息。注意:不要填写“国家”,否则是否汉化会信赖于国家而不是信赖于语言。image
  5. 切换到“路径”选项卡,在“基本路径”中填入要汉化的主题的路径,在“路径”中加入一个”点(.)”。例如: /shopimage
  6. 切换到“关键字”选项卡,在“关键字”中加入“__”和“__e”,这样poedit就会在所有php文件中查找由__()和__e()标识的字符串。image
  7. 点击确定后,弹出“另存为”对话框,把po文件命名为ShopSuite.po。poedit会自动从所有php文件中提取出需要翻译的字符串,如下图所示,一项一项翻译就可以了。image
  8. 在“编辑-首选-编辑器-行为”中勾上“保存时自动编译.mo文件”,则在保存时会自动生成ShopSuite.mo文件。
    若翻译完后又在php文件中添加或删除了要翻译的字符串,点击“类目-自源更新”,poedit会查找出相应的变更。

最后记得要 重启Apache,方可看到效果。

备注

针对需要翻译的文字,大部分已经增加__(‘text’)标记,但是有些是没有的,注意排查后增加对应的__()函数。

文档更新时间: 2022-09-29 18:24   作者:随商信息技术(上海)有限公司