设为首页 收藏本站
查看: 680|回复: 0

[经验分享] php gettext方式实现UTF-8国际化多语言(i18n)

[复制链接]

尚未签到

发表于 2015-8-29 08:47:23 | 显示全部楼层 |阅读模式
  近 来随着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文件。
DSC0000.jpg
  开始应用:
  步骤一:搭建环境(服务器已经完成,环境已经搭建好了)  
1、首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后放到php扩展目录。
2、打开php.ini,查找”;extension=php_gettext.dll“ ,然后去除注释,重启apache。
  若一切顺利,就可以在 phpinfo() 中看到 gettext 字样,至此服务器环境配置完毕。
  步骤二:假如我们要翻译test.php页面里的hello word!这句话。  
  编辑test.php,将要翻译 的文字用gettext函数包含,表示这些被包含的文字是需要用来翻译的。
  



<?  
include_once ( 'inc/setLan.php' );   
$domain  =  'test' ;                     //域名,可以任意取个有意义的名字,不过要跟相应的.mo文件的文件名相同(不包括扩展名)。
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  
$lan  =  $_REQUEST [ 'lan' ];  
if ( $lan  ==  'zh_CN' ){  
  putenv('LANG=zh_CN' );   
  setlocale(LC_ALL, 'zh_CN' );  //指定要用的语系,如:en_US、zh_CN、zh_TW   
}elseif  ( $lan  ==  'zh_TW' ){  
  putenv('LANG=zh_TW' );   
  setlocale(LC_ALL, 'zh_TW' );  //指定要用的语系,如:en_US、zh_CN、zh_TW   
}elseif  ( $lan  ==  'en_US' ) {  
  putenv('LANG=en_US' );   
  setlocale(LC_ALL, 'en_US' );  //指定要用的语系,如:en_US、zh_CN、zh_TW   
}  
?>   

  

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

  1、gettext工具下载地址:http://nchc.dl.sourceforge.net/sourceforge/gnuwin32/gettext-0.14.4.exe
  (用来生成po文件,安装好了以后,需要把&#8221;安装路径/bin&#8221;添加到系统环境变量path里
2、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
  用poedit工具打开test.po,然后针对这些语言翻译成我们对应的语言,保存后poedit会自动生产mo文件(unicode二进制码)。
  
DSC0001.jpg
  
  将po文件和mo文件放入项目目录
  


/locale/language/LC_MESSAGES/test.po

/locale/language/LC_MESSAGES/test.mo
  
如我们放入的是简体中文,则放入:

  


/locale/zh_CN/LC_MESSAGES/test.po

/locale/zh_CN/LC_MESSAGES/test.mo
  

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


/locale/zh_TW/LC_MESSAGES/test.po

/locale/zh_TW/LC_MESSAGES/test.mo
  
  OK。一切都非常顺利,我们开始访问测试下多语言吧。访问test.php?lan=zh_CN则显示简体,访问test.php?lan=zh_TW显示繁体。有什么问题,留言共同讨论 :)
  php 通过include方式实现国际化多语言(i18n) :
  

  
  最后记得要  重启Apache,方可看到效果。

  
  
  
  ++++++++++++++++++++++++++++++++++++++++++
  ++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++  如何将多个文件的语言翻译放到同一个.mo文件中???

  
  
  
  如下图,测试项目文件结构如下:
  
DSC0002.png
  
  现想把 前台文件 test.php,test2.php 等文件的语言包等放集中放在cn.mo文件中,操作如下:
  只需要把 test.php,test2.php 等文件的 语言包&#8220;域&#8221;都设置为&#8220;cn&#8221;,并且在对每个php文件生成.mo文件时,以追加的形式添加到&#8220;域cn&#8221; 即可。

  
  test.php 文件内容如下:
  


<?  
putenv ('LANG=zh_CN' );
setlocale ( LC_ALL, 'zh_CN' );
//定义要用的语言文件名称  
$domain  =  'cn' ;  
bindtextdomain ( $domain ,  dirname(__FILE__).'/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>   
  
  生成.po文件命令如下:


xgettext -d cn test.php --from-code=utf-8  
  
  

test2.php 文件内容如下:  
  


<?  
putenv ('LANG=zh_CN' );
setlocale ( LC_ALL, 'zh_CN' );
//定义要用的语言文件名称  
$domain  =  'cn' ;  
bindtextdomain ( $domain ,  dirname(__FILE__).'/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 ('woshishui') ?>  
</body>  
</html>   
  
  生成.po文件命令如下: (注意,此时多加了一个命令参数 -j ,表明是以追加的形式添加语言包的。)



xgettext -d cn test.php -j --from-code=utf-8  
  最终生成的 .po 文件效果如下:

  
DSC0003.png
  
  
  最后把 生成的 &#8220;cn.po&#8221;、&#8220;cn.mo&#8221; 文件拷贝到文件夹  &#8220;locale\zh_CN\LC_MESSAGES\&#8221; 中。

  最最后就是重启下Apache啦。

  
  
  
  
  
  
  附:wordpress之模板汉化(poedit的使用技巧 及 .po .mo 批量生成技术)

  
  
  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105737-1-1.html 上篇帖子: PHP经典面试题汇总(续) 下篇帖子: PHP时区设置,PHP时间问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表