php gettext方式实现UTF-8国际化多语言(i18n)
php gettext方式实现UTF-8国际化多语言(i18n)
一、总结
一句话总结:
二、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简介:
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代码:

$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文件放入项目目录
如我们放入的是简体中文,则放入:
如我们放入的是繁体中文,则放入:
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文件命令如下:

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 ,表明是以追加的形式添加语言包的。)
最终生成的 .po 文件效果如下:

最后把 生成的 “cn.po”、“cn.mo” 文件拷贝到文件夹 “locale\zh_CN\LC_MESSAGES\” 中。
最最后就是重启下Apache啦。
附:wordpress之模板汉化(poedit的使用技巧
及 .po .mo 批量生成技术)
php gettext方式实现UTF-8国际化多语言(i18n)的更多相关文章
- php nginx window系统 gettext方式实现UTF-8国际化多语言(i18n)
开始应用: 步骤一:搭建环境(服务器已经完成,环境已经搭建好了) 1.首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后 ...
- Spring Boot Security 国际化 多语言 i18n 趟过巨坑
网上很多的spring boot国际化的文章都是正常情况下的使用方法 如果你像我一样用了Spring Security 那么在多语言的时候可能就会遇到一个深渊 Spring Security里面的异常 ...
- iOS 国际化多语言设置 xcode7
iOS 国际化多语言设置 方式一: 1. 在storyboard中创建好UI,然后在 project 里面 Localizables 栏目里面,添加你需要的语言:默认是Englist; 比如这里我添 ...
- jQuery国际化插件 jQuery.i18n.properties 【轻量级】
jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化. 国际化英文单词为:Internationalization,又称i18n,“i”为单词的第 ...
- Web前端国际化之jQuery.i18n.properties
Web前端国际化之jQuery.i18n.properties jQuery.i18n.properties介绍 国际化是如今Web应用程序开发过程中的重要一环,jQuery.i18n.propert ...
- WPF 实际国际化多语言界面
前段时候写了一个WPF多语言界面处理,个人感觉还行,分享给大家.使用合并字典,静态绑定,动态绑定.样式等东西 效果图 定义一个实体类LanguageModel,实际INotifyPropertyCha ...
- 更好用的excel国际化多语言导出
不知道大家在开发中有没有遇到过『excel导出』的需求,反正我最近写了不少这种功能,刚开始利用poi,一行行的手动塞数据,生成excel,而且还有国际化需求,比如:标题栏有一列,用户切换成" ...
- [Spring]Spring Mvc实现国际化/多语言
1.添加多语言文件*.properties F64_en_EN.properties详情如下: F60_G00_M100=Please select data. F60_G00_M101=Are yo ...
- iOS 学习笔记六 【APP中的文字和APP名字的国际化多语言处理】
今天为新手解决下APP中的文字和APP名字的国际化多语言处理, 不多说了,直接上步骤: 1.打开你的项目,单机project名字,选中project,直接看图吧: 2.创建Localizable.st ...
随机推荐
- .Net写的比较清晰的接口
尼玛,隔行如隔山. .Net真操蛋. /// <summary> /// 加入群 /// </summary> /// <returns></returns& ...
- 简单理解javascript的闭包
看过网上关于javascript的闭包的概念和分析,看完之后都是一头雾水,完全不懂,零度我本来就对于概念性的东西很烦躁,没办法,硬着头皮翻阅了很多的资料,总算理清了一点头绪,现在分享给大家,错误之处还 ...
- LuoguP2765 魔术球问题(最大流)
题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...
- BZOJ3994: [SDOI2015]约数个数和(莫比乌斯反演)
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Out ...
- docker部署mysql 实现远程连接
1. docker search mysql # 查看mysql版本 2. docker pull mysql:5.7 # 拉取mysql 5.7 3. docker images # 查 ...
- 洛谷——P2590 [ZJOI2008]树的统计
https://www.luogu.org/problem/show?pid=2590#sub 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这 ...
- 雅黑PHP探针 For PHP7
雅黑PHP探针 For PHP7资料来源: https://kn007.net/topics/yahei-php-probe-for-php7/在v0.4.7版本的基础上,修正了废弃函数及错误语法.使 ...
- git- 仓库创建、修改、提交、撤销
1.仓库创建 zhangshuli@zhangshuli-MS-:~$ mkdir myGit zhangshuli@zhangshuli-MS-:~$ cd myGit/ zhangshuli@zh ...
- [NOI.AC#33]bst 线段树
链接 区间修改,完全二叉树,这引导我们把这棵树看成一棵线段树 .线段树的每一个节点相当于这棵二叉树的节点, 对于区间交换操作,我们对二叉树的每一层从上到下分别考虑,找到L,R在第i层对应的节点修改 这 ...
- C#解析HTML源码
刚做了一个小任务,需要抓取其他网站的部分数据,这里就顺便介绍使用Winista.Text.HtmlParser这个类库如何解析HTML并抓取部分数据 1.获取指定网站的页面源码 string url ...