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中数据的批量导入(csv文件)
Oct 09 PHP
php二维数组排序详解
Nov 06 PHP
thinkphp的c方法使用示例
Feb 24 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
Laravel框架基于ajax实现二级联动功能示例
Jan 17 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
php中pcntl_fork详解
Apr 01 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
linux实现php定时执行cron任务详解
2013/12/24 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
js如何验证密码强度
2020/03/18 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
最好的商品表达自己:Cafepress
2019/09/04 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
领班岗位职责范文
2014/02/06 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
2014年协会工作总结
2014/11/22 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
小学入学感言
2015/08/01 职场文书
门卫管理制度范本
2015/08/05 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
js中Object.create实例用法详解
2021/10/05 Javascript
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python