您的位置:首页 > 编程语言 > PHP开发

php gettext方式实现UTF-8国际化多语言--(补充)

2012-10-04 15:38 459 查看
在看了wangking717的《php gettext方式实现UTF-8国际化多语言(i18n)》(原文:http://blog.csdn.net/wangking717/article/details/4739465#reply)后,自己操作时有少许出入,故记下补充内容。下面转载原文,红字为自己的补充内容。

近来随着i18n(国际化)的逐渐标准化,我也来讲一讲在PHP中如何实现国际化支持。跟其他程序语言一样,在
PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档(http://www.gnu.org/software/gettext/manual/gettext.html)

这里我们主要介绍window平台下使用php的扩展gettext实现程序的国际化。

gettext简介: 

GNU gettext是翻译项目的重要一步,它提供了一个工作框架,由一些集成的工具和文档组成,帮助程序员、翻译人员和最终用户实现程序的国际化和本地化。用Gettext的方式实现多语言得到了广泛的支持,著名的BLOG程序wordpress的国际化就是用的GNU gettext。

大致原理: 

GNU gettext使用PO或MO文件来实现国际化和本地化。PO的意思是Portable Object,是一种文本结构,可以方便的由人们阅读和修改。MO是Machine Object的简写,MO文件是PO文件的二进制形态。一般来说,一个PO或MO文件对应于一种语言,如果一个程序要支持多种语言,每一种语言都需要自己的PO或MO文件。



开始应用:
步骤一:搭建环境(服务器已经完成,环境已经搭建好了)
1。首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后放到php扩展目录。
2。打开php.ini,查找”;extension=php_gettext.dll“ ,然后去除注释,重启apache。

若一切顺利,就可以在 phpinfo() 中看到 gettext 字样,至此服务器环境配置完毕。

 
步骤二:假如我们要翻译test.php页面里的hello word!这句话。

编辑test.php,将要翻译 的文字用gettext函数包含,表示这些被包含的文字是需要用来翻译的。

[php] view
plaincopy

<?  

include_once('inc/setLan.php');   

$domain = 'test';  

bindtextdomain($domain, "locale/");//设置某个域的mo文件路径   

bind_textdomain_codeset($domain, 'UTF-8'); //设置mo文件的编码为UTF-8   

textdomain($domain); //设置gettext()函数从哪个域去找mo文件   

?>  

<html>  

<head>  

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

<title>title</title>  

</head>  

<body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">  

<?= gettext('hello world.') ?>  

</body>  

</html>  

这里的setLan.php组件是用来接收语言参数的,当调用test.php?lan=zh_CN的时候,则显示中文翻译后的页面,调用test.php?lan=zh_TW,则显示繁体翻译后的页面,当没有参数的情况,则默认根据http头信息里的语言进行显示,如果头信息里的语言我们没有提供语言包,则默认显示gettext函数里包含的文字。 

setLan.php代码:

[php] view
plaincopy

<?php  

$lan = $_REQUEST['lan'];  

if($lan == 'zh_CN'){  

putenv('LANG=zh_CN');   

setlocale(LC_ALL, 'zh_CN'); //指定要用的语系,如:en_US、zh_CN、zh_TW  

}else if ($lan == 'zh_TW'){  

putenv('LANG=zh_TW');   

setlocale(LC_ALL, 'zh_TW'); //指定要用的语系,如:en_US、zh_CN、zh_TW  

}else
if ($lan == 'en_US') {  

putenv('LANG=en_US');   

setlocale(LC_ALL, 'en_US'); //指定要用的语系,如:en_US、zh_CN、zh_TW  

}  

?>  

 
步骤三:编辑好了test.php后,我们就应该对这个页面生成对应的语言包(test.po和test.mo文件)

要生成语言包,我们需要借助两款工具。 

gettext工具下载地址:http://nchc.dl.sourceforge.net/sourceforge/gnuwin32/gettext-0.14.4.exe (用来生成po文件,安装好了以后,需要把”安装路径/bin”添加到系统环境变量path里) 

Poedit工具下载地址:http://www.poedit.net/download.php (用来编辑po文件,编辑需要翻译的语言,最后自动生成mo文件)

假设我们都安装好了这些软件,现在我们开始对test.php进行翻译工作。打开命令提示符cmd,切换到test.php所在的目录。

 

输入xgettext -d test test.php --from-code=utf-8(当你要翻译的页面为index.php,只需要将蓝色部分改为index即可),然后执行,这时候你可以在test.php所在目录看到新生成的文件test.po
【补充1:】
1、在用Poedit修改po前记得先用其他文本编辑器把"Project-Id-Version: PACKAGE VERSION\n"里的“PACKAGE VERSION”改成其他版本号,例如1.0;否则用Poedit编辑后保存失败;

用poedit工具打开test.po,然后针对这些语言翻译成我们对应的语言,保存后poedit会自动生产mo文件(unicode二进制码)。



 
将po文件和mo文件放入项目根目录 

/locale

/language //这个建议改为en_US
/LC_MESSAGES
test.po
test.mo 
如我们放入的是简体中文则放入: 
/locale
/zh_CN
/LC_MESSAGES
test.po
test.mo

如我们放入的是繁体中文则放入: 

/locale

/zh_TW

/LC_MESSAGES

test.po

test.mo
【补充2:】
2、更新mo后要重启服务器,否则修改不起作用。

OK。一切都非常顺利,我们开始访问测试下多语言吧。访问test.php?lan=zh_CN则显示简体,访问test.php?lan=zh_TW显示繁体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息