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操作MongoDB的技术总结
Jun 02 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
PHP文件缓存smarty模板应用实例分析
Feb 26 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
May 23 PHP
详解json在php中的应用
Sep 30 PHP
通过代码实例解析PHP session工作原理
Dec 11 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随机生成信用卡卡号的方法
2015/03/23 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
初学python数组的处理代码
2011/01/04 Python
Python 数据结构之旋转链表
2017/02/25 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
delegate与普通函数的区别
2014/01/22 面试题
工厂保洁员岗位职责
2013/12/04 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
团支部书记竞选稿
2015/11/21 职场文书