PHP中使用gettext解决国际化问题的例子(i18n)


Posted in PHP onJune 13, 2014

实现国际化的方式比较多,很多php framework都内置i18n支持,但大部分是基于PHP的数组实现的,这种方法并不推荐。目前最为流行也最通用的方法是gettext。

Gettext 用于系统的国际化(I18N)和本地化(L10N),可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文. 关于gettext的更多资料请参见: 下面说说如何利用gettext在你的PHP程序中实现国际化。

一、检查环境需求 首先查看phpinfo(),确保你的PHP启用了gettext扩展。如果启用了gettext,在phpinfo页面中应该能看到以下信息:
PHP中使用gettext解决国际化问题的例子(i18n)

如果没有找到,请修改php.ini以启用该扩展

二、为你的项目新建locale文件夹 gettext涉及到两个文件,*.po是翻译源文件,里面储存了项目中所有待翻译的字符串和翻译后的结果;*.mo文件是po文件编译后二进制文件,真正读取翻译信息的时候是从mo文件中读取的,所以这个文件也是必不可少的。 gettext对目录要求比较死,你必须把国际化文件放在指定目录,大部分使用gettext不成功都是由于po文件和mo文件没有放对位置导致的,下面举例看一个典型项目目录树:

PHP中使用gettext解决国际化问题的例子(i18n)

三、初始化i18n环境 这个主要是在程序端进行简单的设置,下面给个简单的例子:

< ?php
//定义要翻译的目标语言及po文件的编码
$locale = "zh_CN.utf8";
setlocale(LC_ALL, $locale);
//设置翻译文本域,下面的代码就会让程序去locale/zh_CN/LC_MESSAGES/default.mo去寻找翻译文件
bindtextdomain("default", dirname(__FILE__)."/locale");
textdomain("default");
?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
< ?php echo _("Hello\n");; ?>

四、建立po文件档

到这一步方法就比较多了,当然可以手动建立,不过这样子一个最大的缺点就是你不知道项目中哪些字符串需要翻译,这里推荐下一个软件——PoEdit,Windows平台和Linux都是适用的。

选择文件->新建消息目录文档,填好一些必要信息,注意如果目标语言是中文的话,由于中文是双字节字符,所以最好在“复数形式”填上 “nplurals=2; plural=(n!=1);”(没有引号),如下图

PHP中使用gettext解决国际化问题的例子(i18n)

然后将项目所在文件夹加入到“路径”中,设置好翻译所用的关键字,PoEdit就会自动搜索项目中所有待翻译的字符串,生成po文件。翻译完成后选择“保存”,PoEdit会自动生成mo文件。以后每次项目中待翻译字符串有更新,只要打开PoEdit选择类目->从源更新,就好了 这样的思路不仅适用于PHP,其他语言都大同小异,前段时间做django一个项目的翻译,也仅仅是建立po文件更加方便了,其他步骤十分类似。大家举一反三就好了,尤其注意下目录结构,这个是最容易出现问题的地方。

PHP 相关文章推荐
PHP中的日期处理方法集锦
Jan 02 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
php数据库抽象层 PDO
May 07 PHP
php下利用curl判断远程文件是否存在的实现代码
Oct 08 PHP
深入解析php之sphinx
May 15 PHP
php操作mongoDB实例分析
Dec 29 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
PHP实现git部署的方法教程
Dec 19 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP的PDO连接讲解
Jan 24 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
如何用PHP实现多线程编程
May 26 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 #PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 #PHP
ThinkPHP中U方法的使用浅析
Jun 13 #PHP
PHP实现单例模式最安全的做法
Jun 13 #PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 #PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 #PHP
PHP中多维数组的foreach遍历示例
Jun 13 #PHP
You might like
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
js获取ip和地区
2017/03/10 Javascript
vue.js父组件使用外部对象的方法示例
2017/04/25 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
Python计算字符宽度的方法
2016/06/14 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
python实现杨辉三角思路
2017/07/14 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
政法大学毕业生自荐信范文
2014/01/01 职场文书
党员组织关系介绍信
2014/02/13 职场文书
党员志愿者活动总结
2014/06/26 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
华清池导游词
2015/02/02 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
2015年营业员工作总结
2015/04/23 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript