PHP环境gettext使用指引

作者: X先生说 | 来源:发表于2018-11-30 15:23 被阅读5次

    gettext简介

    gettext是一种国际化与本地化系统,在类Unix系统中编写多语言程序时经常被使用。gettext的一个常用的实现版本为GNU gettext,1995年发布。

    源代码中所有需要多语言支持的(需要翻译的)字符串都修改为使用gettext函数包装起来。为了方便也可以使用下划线_。比如:

    echo gettext('示例');
    
    echo _('示例');
    

    gettext需要先配置好对应的语言包,并在代码中进行设置需要翻译的语言,然后根据对应的语言包对选择的文本进行翻译。

    其中gettext会用到两个语言文件,一个以.po结尾,是我们用于编辑语言翻译的文本文件,另外一个以.mo结尾,这个是.po文件的二进制版本,也是PHP程序真正使用的文件。

    我们每次修改了.po文件之后都需要编译成对应的.mo文件。这些文件的编辑可以用软件 Poedit来操作。

    PHP环境gettext使用指引

    1、确定PHP已安装且已启用gettext拓展(现在机器基本都已安装且启用),通过以下命令查看是否已开启。

    php -m | grep gettext
    

    2、window、linux环境需安装gettext(仅用于开发环境生成PO文件,线上环境不需安装)

    window直接在这里下载,并且需要把bin目录设置到环境变量的path里去

    linux 通过命令直接安装 yum install gettext

    3、对代码里所有需要翻译的文本,用_或者gettext封装起来,如下

    throw new CustomException(_('请输入备注'), StatusCode::PARAMETER);
    

    4、生成PO和MO文件

    • 通过命令行生成

      # 把所有需要生成的php文件罗列出来
      find app -type f -name '*.php' -print | sort >file_list
      
      # 通过xgettext生成po文件 
      # -d表示表示生成为***.po
      # -D表示需要查找的目录 疑似不生效 因此使用find配合
      # -j表示为在源输出文件后增加,不会覆盖原有翻译后的内容,首次生成不需要添加-j参数
      # --files-from表示从文件读入需要扫描的源文件
      # --no-wrap 翻译的文案过长,生成的po文件会自动换行,增加--no-wrap解决换行问题
      # --strict 增加--strict做成严格统一的注释说明
      xgettext --files-from=file_list -d setup_service --from-code=utf-8 -L PHP --no-wrap --strict
      
      #生成对应的mo文件
      msgfmt setup_service.po -o setup_service.mo
      
    • 也可以通过Poedit来生成po文件

      1. 打开软件,然后按ctrl+n新建文件,选择要翻译成的语言,例如英语,点击确定
      2. 这样就新建了一个文件,按ctrl+s保存文件(保存后才能操作),输入要保存的名字和位置
      3. alt+enter打开属性设置页面,点击源路径,再点击在路径下面的+,选择要生成po文件的文件夹或者文件,点击确定
      4. 点击上方菜单栏的从代码更新
      5. 此时软件即会提取需要翻译的文本,生成对应的po文件。
      6. ctrl+s保存文件,同时会生成对应的.mo文件。
    • 也可以通过Poedit来编辑po文件

      安装了Poedit后,双击po文件即可打开进行编辑。

    将PO文件的头部charset的部分修改为charset=UTF-8
    或增加以下代码(建议)

      "Plural-Forms: nplurals=1; plural=0;\n"
      "Project-Id-Version: \n"
      "POT-Creation-Date: \n"
      "PO-Revision-Date: \n"
      "Last-Translator: \n"
      "Language-Team: \n"
      "MIME-Version: 1.0\n"
      "Content-Type: text/plain; charset=UTF-8\n"
      "Content-Transfer-Encoding: 8bit\n"
      "Language: en_US\n"
      "X-Generator: Poedit 2.2\n"
      "X-Poedit-SourceCharset: UTF-8\n"
    

    5、代码里使用gettext

    if (self::isCn()) {
        putenv('LANG=zh_CN');
        #setlocale(LC_ALL, 'zh_CN'); //centos可以直接用这行,ubuntu需要用下面一行带utf8的。下同
        setlocale(LC_ALL, 'zh_CN.utf8');
    } elseif (self::isHk()) {
        putenv('LANG=zh_HK');
        setlocale(LC_ALL, 'zh_HK.utf8');
    } elseif (self::isEn()) {
        putenv('LANG=en_US');
        setlocale(LC_ALL, 'en_US.utf8');  //指定要用的语系,如:en_US、zh_CN、zh_HK
    }
    bindtextdomain('setup_service', resource_path('locale'));   //设置某个域的mo文件路径
    bind_textdomain_codeset('setup_service', 'UTF-8');      //设置mo文件的编码为UTF-8
    textdomain('setup_service');
    
    #对应路径为 
    locale/en_US/LC_MESSAGES/setup_service.po 
    locale/en_US/LC_MESSAGES/setup_service.mo
    

    6、访问系统,可实现多语言返回结果。

    Enjoy it !

    如果觉得文章对你有用,可以赞助我喝杯咖啡~

    版权声明

    转载请注明作者和文章出处
    作者: 小鱼儿

    首发于 https://blog.ricoo.top/phphuan-jing-gettextshi-yong-zhi-yin/

    相关文章

      网友评论

        本文标题:PHP环境gettext使用指引

        本文链接:https://www.haomeiwen.com/subject/lsehcqtx.html