最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

mac中php关于gettext支持多语言功能

PHP 1646浏览 0评论

最近公司打算开发台湾和英文版本的APP,需要系统能够支持多语言。初步考虑的话,可以将所有涉及到语言的文字提取到一个文件里,程序里面不直接输出语言文字,而是从这个文件提取。那么需要支持多语言的话,只需要将这个文件翻译成相应的语言,程序在调取的时候从相应的语言文件读取就可以了。

正准备折腾的时候,突然想起来以前换wordpress模板的时候,有翻译过一个英文的文档,后缀是po的文件,顺着这个思路是查找,才了解到po文件是GNU gettext项目的一套应用规范,属于L10n方案,是用来支持国际化的一个语言文件模板,便于翻译人员翻译。翻译完成之后可以生成.mo后缀的文件是供机器读取的。

关于标准这个东西真的非常好,制定好后,各方都会根据这个标准看法相应的工具和库,也有统一的文档参考,真的是非常方便。例如可以查看下linux的/usr/share/locale/目录,里面也都是语言文件,都是生成出来的mo文件。php搞这么久了,想必应当也会有相应的库支持的。

安装环境

php中对这套规范的支持就是使用gettext库了。在mac中安装gettext库可以通过brew命令进行安装:

$ brew install gettext

关于linux和windows系统,可以参考http://www.gnu.org/software/gettext/gettext.html官方地址进行安装。

安装后,记的重启下web服务器,然后看看phpinfo,如果有gettext显示就表示支持了。

测试程序和目录

搞这个的时候,语言文件的目录设置和程序中的一些配置有关,注意不能搞错,否则多语言就无法生效,这里先看下目录结构:

php中gettext目录结构

php中gettext目录结构

其中hello.php代码如下:

//设置语言文件的存放目录
$dir    = __DIR__ . '/locale';
//文件的名称,如该例为hello.mo
$domain = 'hello';
//语言类型 ,和关联到locale/zh_CN目录
$locale = 'zh_CN';

putenv('LANG=' . $locale);
setlocale(LC_MESSAGES, $locale);

bindtextdomain($domain, $dir);
bind_textdomain_codeset($domain, "UTF-8");
textdomain($domain);

//_是gettext函数的简写
echo _("Hello World!");

生成po文件

接下来用xgettext工具生成.po文件:

$ xgettext.pl -o hello.po hello.php

mac和linux下有一些不太一样,linux下应当为xgettext命令,mac这里要加.pl,用perl写得。

hello.po内容如下:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: hello.php:19
msgid "Hello World!"
msgstr ""

生成mo文件,mac下一直没有找到生成mo的命令行工具,就用Poedit这个工具进行编辑,然后保存就会生成相应的mo文件了。

而后将mo文件复制到程序目录和hello.po同一个目录下,再访问以下程序,看看是不是就显示中文了。

中文无法生效的问题

在测试的过程中,一开始代码一直无法生效,无法输出中文出来,各种排查:文件权限、目录设置等,后来加上了:

putenv('LANG=' . $locale);

bind_textdomain_codeset($domain, "UTF-8");

这两行代码才生效。

参考地址

用php gettext库来开发多语言系统:http://www.cnblogs.com/ccdc/archive/2012/05/03/2480074.html
使用 gettext 來實做 PHP 多國語系支援(I18N):http://blog.longwin.com.tw/2007/09/gettext_php_i18n_2007/

转载请注明:快乐编程 » mac中php关于gettext支持多语言功能

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址