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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
让PHP支持页面回退的两种方法[转]
Feb 14 PHP
UCenter Home二次开发指南
May 28 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
PHP中常用的转义函数
Feb 28 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
PIGCMS 如何关闭聊天机器人
Feb 12 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
PHP fprintf()函数用法讲解
Feb 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
实现树状结构的两种方法
2006/10/09 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
用Python编写简单的微博爬虫
2016/03/04 Python
python3.7.0的安装步骤
2018/08/27 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
浅谈Python中的继承
2020/06/19 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
2014年校务公开工作总结
2014/12/18 职场文书
会议邀请函
2015/01/30 职场文书
医生个人年终总结
2015/02/28 职场文书
大学生团日活动总结
2015/05/06 职场文书
被告答辩状范文
2015/05/22 职场文书
安全伴我行主题班会
2015/08/13 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
mysql如何配置白名单访问
2021/06/30 MySQL
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫