根据语言环境,输出相应语种翻译

gettext扩展实现多语言支持

  • gettext的用法简介,例如: 我们希望输出到页面的一个字符串"message"在英语用户的页面显示为"message"而在中文用户的页面显示为"消息"
  • 在代码中可以这样写 gettext("message") 或者 _("message")
  • _()gettext() 的简略写法
  • 程序运行时,到底显示什么字符串就是 由gettext 函数来决定的了; 主要由两个因素决定:
  • 一个是系统的locale及相关环境变量(LANGUAGE,LC_ALL,LC_MESSAGES和LANG)
  • 一个是相关的mo文件。与mo对应的还有一个po文件 。
  • 关于mo、po文件:
  • po文件是翻译人员翻译的文件,是给人阅读翻译用的;
  • mo文件是由po文件生成的机器码文件是由程序使用;
  • _("string") 函数传入的字符串相当于Key-Value数据库中的Key(msgid),Value则相当于翻译后的字符串(msgstr);
  • 如果mo文中,没有找到msgid,则返回传入的字符串"string",如果存在翻译则返回翻译后的字符串(msgstr)
  • po文件代码片段:
  • 关于环境变量

        // 设置语言环境
        define('LANGUAGE', $language['code']);
        $locale = $language['charset'];
        putenv('LANG=' . $locale);
        setlocale(LC_ALL, $locale);
        setlocale(LC_NUMERIC, 'en_US.utf8');
        // 设置翻译文件的存放目录
        bindtextdomain('api', LANG_PATH);
        textdomain('api');
    • LANG_PATH 即 APP_PATH/locale/
    • $local为zh_CN时,对应的文件为: APP_PATH/locale/zh_CN/LC_MESSAGES/api.mo
  • 关于po文件的更新与编辑

    • 下载安装Poedit

    • 打开需要更新的po文件

    • 翻译完成后,点击保存,编译为mo即可。

新增或更新mo文件后,需要重启php-fpm才能使mo文件生效