空地

生活,工作,记录(内容基本都是转载,自己工作用到的时候看看而已)

导航

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

之 前PHP实现多语言国际化,大部分都会采用把语言直接提出来作为数组来调用,比如大家都知道的phpMyadmin,discuz等知名开源系统,不过, 这里介绍一种我觉得更好的实现方式,就是通过gettext,即用资源文件来实现。下面来说下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) 国际化支持。

具体配置步骤如下:
一 在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/

posted on 2010-02-20 11:18  小梅  阅读(266)  评论(0)    收藏  举报