PHP gettext多语言支持

原文地址:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/08/09/2132603.html


近 来随着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函数包含,表示这些被包含的文字是需要用来翻译的。

 

复制代码
<?   
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文件,安装好了以后,需要把”安装路径/bin”添加到系统环境变量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二进制码)。

 

 

将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文件中???

 

 

 

 如下图,测试项目文件结构如下:

 

 

现想把 前台文件 test.php,test2.php 等文件的语言包等放集中放在cn.mo文件中,操作如下:

只需要把 test.php,test2.php 等文件的 语言包“域”都设置为“cn”,并且在对每个php文件生成.mo文件时,以追加的形式添加到“域cn” 即可。

 

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  - -- from - code = utf - 8

 

最终生成的 .po 文件效果如下:

 

 

 

 

 最后把 生成的 “cn.po”、“cn.mo” 文件拷贝到文件夹  “locale\zh_CN\LC_MESSAGES\” 中。

最最后就是重启下Apache啦。


补充:windows下Poedit生成的mo/po文件也能用在Linux下。

Linux下安装php的gettext扩展。

centos用户如果编译安装php的时候没有使用–with-gettext参数,则有需要使用phpize编译安装gettext
进入php源码包,如 cd /usr/local/src/php/ext/gettext
执行/usr/local/php/bin/phpize //运行后此目录下多出了一此configure文件

执行./configure --with-php-config=/usr/local/php/bin/php-config --with-gettext
执行make && make install
系统提示生成的getext.so文件的所在路径,如,/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

将路径加入到php.ini中,vim /usr/local/php/etc/php.ini,增加

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/gettext.so

重启apache,/etc/init.d/apache restart


使用phpinfo()函数可以查看到gettext模块,说明安装成功。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值