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实现像JSP,ASP里Application那样的全局变量
Jan 12 PHP
深入解析PHP中逗号与点号的区别
Aug 05 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
php出现内存位置访问无效错误问题解决方法
Aug 16 PHP
初识php MVC
Sep 10 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
php bootstrap实现简单登录
Mar 08 PHP
PHP全功能无变形图片裁剪操作类与用法示例
Jan 10 PHP
PHP微商城开源代码实例
Mar 27 PHP
php+iframe 实现上传文件功能示例
Mar 04 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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+oracle 分页类
2006/10/09 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php中的ini配置原理详解
2014/10/14 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
js实现表格筛选功能
2017/01/18 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
layui表格数据重载
2019/07/27 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python简单读取json文件功能示例
2017/11/30 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python实现简单flappy bird
2018/12/24 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
大学系主任推荐信范文
2013/12/24 职场文书
家长评语大全
2014/01/22 职场文书
主题酒店策划书
2014/01/28 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
交通事故协议书
2014/04/15 职场文书
七夕情人节促销方案
2014/06/07 职场文书
公司慰问信范文
2015/03/23 职场文书
家长会开场白和结束语
2015/05/29 职场文书
生死抉择观后感
2015/06/09 职场文书