原标题: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国际化的缩写,开头字母我状语从句结尾字母ñ的中间一共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,保存,然后重新启动服务器。

 

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

1,打开php.ini档,查找extension = php_gettext.dll,去掉前面的“;”,xampp已经开启
2,保存,然后重新启动服务器。

重启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:/项目/ XAMPP / htdocs中/测试/ I18N /郎’); //设置要绑定的语言包的目录
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的dir为bindtextdomain()所用的目录,language为要用的语系,domain为PACKAGE名称。

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

2,创建PO档
xgettext -d [您定义的包名称] [程序文件名]
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 /测试/ I18N / i18n.php

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

#一些描述性的标题。
#版权(C)年自由软件基金会,
#第一作者< 电子邮件@地址 >,年。

#,模糊
MSGID “”
msgstr “”
“ 项目-ID-版本:包版本/ N”
“POT-创建日期:2009-08-25 11:10 + 0800 / N”
“PO-修订-日期:YEAR -MO-DA HO:MI + ZONE / n“
”Last-Translator:FULL NAME < EMAIL @ ADDRESS> / n “
”Language-Team:LANGUAGE < LL@li.org> / n “
”MIME版本:1.0 / n“
”Content-Type:text / plain; charset = CHARSET / n“
”Content-Transfer-Encoding:8bit / n“

msgstr“Hello World”
msgstr“” #:e:/project/xampp/htdocs/test/i18n/i18n.php:10

#将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下以模块方式安装PHP后,使用gettext时会有“单一使用”的问题。
1。它接受第一次语言请求,并忽略随后的请求;
2.它一次性检查文件的可用性,并拒绝再次检查

发表评论

电子邮件地址不会被公开。 必填项已用*标注