PHP环境gettext使用指引

栏目: PHP · 发布时间: 6年前

内容简介:gettext是一种国际化与本地化系统,在类Unix系统中编写多语言程序时经常被使用。gettext的一个常用的实现版本为GNU gettext,1995年发布。源代码中所有需要多语言支持的(需要翻译的)字符串都修改为使用gettext需要先配置好对应的语言包,并在代码中进行设置需要翻译的语言,然后根据对应的语言包对选择的文本进行翻译。

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、访问系统,可实现多语言返回结果。


以上所述就是小编给大家介绍的《PHP环境gettext使用指引》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C#入门经典

C#入门经典

[美] Karli Watson、Christian Nagel / 齐立波、黄静 / 清华大学出版社 / 2008-12 / 118.00元

这是一本成就无数C#程序员的经典名著,厚而不“重”,可帮助您轻松掌握C#的各种编程知识,为您的职业生涯打下坚实的基础,《C#入门经典》自第1版出版以来,全球销量已经达数万册,在中国也有近8万册的销量,已经成为广大初级C#程序员首选的入门教程,也是目前国内市场上最畅销的C#专业店销书,曾两次被CSDN、《程序员》等机构和读者评选为“最受读者喜爱的十大技术开发类图书”!第4版面向C#2008和.NET......一起来看看 《C#入门经典》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具