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 和 MYSQL
Oct 09 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
基于PHP选项与信息函数的使用详解
May 10 PHP
php另类上传图片的方法(PHP用Socket上传图片)
Oct 30 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
深入理解PHP内核(一)
Nov 10 PHP
php事件驱动化设计详解
Nov 10 PHP
CI框架表单验证实例详解
Nov 21 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 PHP
PHP大文件分割分片上传实现代码
Dec 09 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
中国第一家无线电行
2021/03/01 无线电
使用PHP制作新闻系统的思路
2006/10/09 PHP
example2.php
2006/10/09 PHP
PHP foreach循环使用详解与实例代码
2010/05/08 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
python测试驱动开发实例
2014/10/08 Python
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
python圣诞树编写实例详解
2020/02/13 Python
Python实现EM算法实例代码
2020/10/04 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
navabi英国:设计师大码女装
2019/06/25 全球购物
会议邀请函范文
2014/01/09 职场文书
购房意向书范本
2014/04/01 职场文书
欠款证明
2015/06/24 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
python中的装饰器该如何使用
2021/06/18 Python
python 网络编程要点总结
2021/06/18 Python
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server