PHP通过gettext实现多语言国际化支持

之前PHP实现多语言国际化,大部分都会采用把语言直接提出来作为数组来调用,例如比较有名phpMyadmin,discuz等知名开源系统,不过,这里介绍如何通过gettext,即用资源文件来实现。典型的CMS案例-wordpress也是通过它实现的语言国际化,下面来说下php中如何来利用配置文件实现国际化的。

首先介绍下.MO文件,在PHP中是利用.MO文件来做语言包实现的:
PO 是 Portable Object (可移植对象)的缩写形式;
MO 是 Machine Object (机器对象) 的缩写形式。
PO 文件是面向翻译人员的、提取于源代码的一种资源文件。当软件升级的时候,通过使用 gettext 软件包处理 PO 文件,可以在一定程度上使翻译成果得以继承,减轻翻译人员的负担。MO 文件是面向计算机的、由 PO 文件通过 gettext 软件包编译而成的二进制文件。程序通过读取 MO 文件使自身的界面转换成用户使用的语言。

通常人们写程序时都是将文字写死在程序里的,比如:echo “Hello World!”; ,假如要改成它国语言,写国际化程序,就要逐个打开进行修改,程序较短时还行,若程序有上万甚至更多,改起来就不是那么容易了。近来随着 i18n(internationalization的缩写,开头字母i和结尾字母n的中间一共18个字符,由此得来的缩写)的逐渐标准化,我也来讲一讲在PHP中如何实现国际化支持,跟其他程序语言一样,在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持。

具体配置步骤如下:
一、安装设置gettext套件

1) 类UNIX系统:

1、从 http://www.gnu.org/software/gettext/gettext.html 下载 gettext package,进行安装
2、编译PHP的时候加上“–with-gettext[=DIR]”,其中DIR为gettext安装的目录,缺省为:/usr/local
3、保存,然后 restart server。  

 

2) WIN32系统:在php中配置服务器支持gettext

1、打开php.ini档,查找extension=php_gettext.dll,去掉前面的“;”,xampp已经开启
2、保存,然后restart server。

重启web服务器(apache 或IIS )即可生效,在浏览phpinfo(); 信息时候,出现“gettext” 的字样就表明配置成功。

二 下载生成.mo文件的软件
php配置成功后,需要下载一个生成.mo文件的软件,点击http://jaist.dl.sourceforge.net/project/gettext/gettext-win32/0.12/gettext-tools-0.12.bin.woe32.zip即可下载,解压后就可使用,在下载目录的bin/文件夹下 有各个命令的可执行程序。

三、写测试用的i18n程序:
下面是 i18n 程序:hello.php

<?PHP
define('PACKAGE','i18n');// 定义要用的mo文件名称,常规来说,我们都把PACKAGE的名称定义和程序名称相同。

putenv("LANG=zh_CN");//设置环境变量,将语言设置为zh_CN
setlocale(LC_ALL,'zh_CN');//设置场景信息,此处设置为中文

bindtextdomain(PACKAGE,'E:/project/xampp/htdocs/test/i18n/lang');//设置要绑定的语言包的目录
textdomain(PACKAGE);//设置默认的包

echo gettext("Hello World");//取得变量对应的值,找不到对应的包,去默认值
?>

浏览器中输入i18n.php,输出结果为:"Hello World"
note:按照 GNU package 里面的习惯,可以使用 _(…) 来代替 gettext(…) ,这样就可以少打很多 gettext 了。

四、设置gettext po档:
1、创建目录结构,如下所示:
      /language
        /LC_MESSAGES
          domain.po
          domain.mo
其中 bindtextdomain’s dir 为 bindtextdomain() 所用的目录,language 为要用的语系,domain 为 PACKAGE 名称。

  以上面为例:
      /zh_CN
        /LC_MESSAGES
          i18n.po
          i18n.mo

2、创建PO档
xgettext -d [您定义的PACKAGE名称] [程序文件名]
WIN32下面的xgettext、msgfmt程序档可以从 ( http://sourceforge.net/projects/gettext/ ) 下载,需要 libiconv.dll,、libintl.dll 的支持。可以用poedit来编辑。

以上面i18n.php档为例,
命令格式为xgettext -Cd hello hello.php

xgettext -Cd E:/project/xampp/htdocs/test/i18n/lang/zh_CN/LC_MESSAGES/i18n E:/project/xampp/htdocs/test/i18n/i18n.php

运行后悔生成i18n.po文件,打开时这样的内容

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION/n"
"POT-Creation-Date: 2009-08-25 11:10+0800/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"

#: E:/project/xampp/htdocs/test/i18n/i18n.php:10
msgid "Hello World"
msgstr ""

#将msgstr的内容翻译"你好,世界"保存

3、创建MO档
$ msgfmt -o i18n.mo i18n.po
示例:msgfmt -o E:/project/xampp/htdocs/test/i18n/lang/zh_CN/LC_MESSAGES/i18n.mo E:/project/xampp/htdocs/test/i18n/lang/zh_CN/LC_MESSAGES/i18n.po
运行后将产生一个i18n.mo二进制档。

最后:浏览器中执行i18n.php,现在的结果就是:"你好,世界"
windows需要重启服务器,因为
在windows下以模块方式安装PHP后,使用gettext时会有”单一使用”的问题.即
1. 它接受第一次语言请求,并忽略随后的请求;
2. 它一次性检查文件的可用性,并拒绝再次检查

阅读更多
个人分类: PHP
想对作者说点什么? 我来说一句

php多语言支持简单的例子

2014年09月08日 819B 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭