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 相关文章推荐
spl_autoload_register与autoload的区别详解
Jun 03 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
Jun 20 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
php对文件进行hash运算的方法
Apr 03 PHP
php实现上传图片文件代码
Jul 19 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
PHP session 会话处理函数
Jun 06 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 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
php中截取字符串支持utf-8
2007/01/18 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
php如何连接sql server
2015/10/16 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
jquery $.each() 使用小探
2013/08/23 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
Python中unittest用法实例
2014/09/25 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
python机器人行走步数问题的解决
2018/01/29 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
python给list排序的简单方法
2020/12/10 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
护士长竞聘书
2014/03/31 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
自主招生自荐信范文
2015/03/04 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android