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默认安装产生系统漏洞
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
php skymvc 一款轻量、简单的php
Jun 28 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
YII使用url组件美化管理的方法
Dec 28 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
fgetcvs在linux的问题
2012/01/15 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
javascript document.execCommand() 常用解析
2009/12/14 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
Angular实现响应式表单
2017/08/04 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
Javascript通过控制类名更改样式
2019/05/24 Javascript
vue实现扫码功能
2020/01/17 Javascript
简单介绍Python中的RSS处理
2015/04/13 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
Python网络编程 Python套接字编程
2017/09/13 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
python多进程重复加载的解决方式
2019/12/13 Python
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
销售总监岗位职责
2014/01/04 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
珠宝店促销方案
2014/03/21 职场文书
节水标语大全
2014/06/11 职场文书
黄石寨导游词
2015/02/05 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
详解vue身份认证管理和租户管理
2021/05/25 Vue.js