PHP通过gettext实现多语言国际化支持
首先介绍下.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) 国际化支持。
具体配置步骤如下:
一 在php中配置服务器支持gettext
在php中配置服务器支持gettext的方法很简单,只要把php.ini文件中的 “extension=php_gettext.dll” 前面的“;”去掉
extension=php_gettext.dll
重启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即可下载,下载后解压文件,我的解压路径是:E:\share\gettext ,解压后就可使用,在下载目录的bin/文件夹下 有各个命令的可执行程序。
三 写测试代码
接下来写测试代码 hello.php
define(‘PACKAGE’, ‘hello’);//定义要用的mo文件名称,常规来说,我们都把PACKAGE的名称定义和程序名称相同。
putenv(‘LANG=zh_CN’); // // 指定要用的语系,如:en_US、zh_CN、zh_TW
bindtextdomain(PACKAGE, ‘F:/gettext/locale’);
textdomain(PACKAGE);
// The .mo file searched is:
// F:/gettext/locale/zh_CN\LC_MESSAGES/hello.mo
echo gettext(“Hello World!”);
来看下创建po和mo文件的目录结构:
1. bindtextdomain’s dir
2. /language
3. /LC_MESSAGES
4. domain.po
5. domain.mo
其中 bindtextdomain’s dir 为 bindtextdomain() 所用的目录,language 为要用的语系,domain 为 PACKAGE 名称。
以上面代码中的目录为例:
1. /locale
2. /zh_CN
3. /LC_MESSAGES
4. hello.po
5. hello.mo
四 创建po文档
利用上面下载的生成po文件的软件,具体方法是:进入到dos命令行界面,进入到E:\share\gettext\bin 目录下,然后,执行xgettext -d hello hello.php –from-code=UTF-8 命令,执行后在E:\share\gettext\bin 目录下就会产生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”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2009-12-03 14:35+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”#: f:/gettext/hello.php:8
msgid “Hello World!”
msgstr “”
将文本中的 msgstr “” 修改成 msgstr “你好 世界!”,然后保存。
五 生成mo文件
在dos 命令行的界面,E:\share\gettext\bin 目录下执行 msgfmt -o hello.mo hello.po 命令,在运行后将在E:\share\gettext\bin 目录下产生一个hello.mo二进制文件。
运行: msgunfmt.exe hello.mo -o hello.po 可以反编译mo文件。
六 将 hello.po、hello.mo 拷贝到相关语系的目录下
(F:\gettext\locale\zh_CN\LC_MESSAGES 下)
七 浏览结果
在浏览器中浏览hello.php文件,就可以看到“你好 世界!”
至此,php就实现了国际化,能时间多个语言版本的互通,而且方便修改。
注意:
1、修改po文件后,重新编译生成mo,这时你如果发现在浏览器中浏览hellp.php没有变化,就需要重新启动一下apache。
2、整个目录创建po文件可以执行 xgettext -d hello *.php,如果出现xgettext extension `php’ is unknown等出错信息,说明你的gettext版本低了,可以到这里下载最新版本http://sourceforge.net/projects/gnuwin32/files/gettext/
浙公网安备 33010602011771号