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调用三种数据库的方法(3)
Oct 09 PHP
用PHP调用数据库的存贮过程!
Oct 09 PHP
文件系统基本操作类
Nov 23 PHP
关于时间计算的结总
Dec 06 PHP
php daodb插入、更新与删除数据
Mar 19 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
解析link_mysql的php版
Jun 30 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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设计模式中的工厂模式
2008/06/12 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
extjs render 用法介绍
2013/09/11 Javascript
理解Javascript闭包
2013/11/01 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
layui文件上传实现代码
2017/05/20 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
Python列表list数组array用法实例解析
2014/10/28 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
python pillow库的基础使用教程
2021/01/13 Python
教师求职推荐信范文
2013/11/20 职场文书
甲方资料员岗位职责
2013/12/13 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
办公用房租赁协议书
2014/11/29 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
银行自荐信范文
2015/03/25 职场文书