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 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
Mar 15 PHP
写出高质量的PHP程序
Feb 04 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
php实现cookie加密的方法
Mar 10 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
YII分模块加载路由的实现方法
Oct 01 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 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面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
javascript web对话框与弹出窗口
2009/02/22 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
python实现下载文件的三种方法
2017/02/09 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python for和else语句趣谈
2019/07/02 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
python request 模块详细介绍
2020/11/10 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
2013的个人自我评价
2013/12/26 职场文书
应届毕业生自荐信
2014/05/28 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
活动新闻稿范文
2015/07/17 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS