在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、总结一句话总结:
二、php gettext方式实现UTF-8国际化多语言(i18n)近 来随着i18n(国际化)的逐渐标准化,我也来讲一讲在PHP中如何实现国际化支持。跟其他程序语言一样,在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档( http://www.gnu.org/software/gettext/manual/gettext.html ) 这里我们主要介绍window平台下使用php的扩展gettext实现程序的国际化。 gettext简介: 大致原理: 开始应用: 步骤一:搭建环境(服务器已经完成,环境已经搭建好了) 若一切顺利,就可以在 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函数里包含的文字。
<?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里)
假设我们都安装好了这些软件,现在我们开始对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 -j --from-code=utf-8
最终生成的 .po 文件效果如下:
最后把 生成的 “cn.po”、“cn.mo” 文件拷贝到文件夹 “locale\zh_CN\LC_MESSAGES\” 中。 最最后就是重启下Apache啦。
附:wordpress之模板汉化(poedit的使用技巧 及 .po .mo 批量生成技术)
|
2022-08-16
2022-08-30
2022-07-18
2022-08-18
2022-07-29
请发表评论