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 相关文章推荐
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
PHP strip_tags保留多个HTML标签的方法
May 22 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
php实现映射操作实例详解
Oct 02 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 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 mysql数据库备份实现代码
2009/03/10 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python aiohttp的使用详解
2019/06/20 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
简单了解python元组tuple相关原理
2019/12/02 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Python tkinter三种布局实例详解
2020/01/06 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
python实现发送邮件
2021/03/02 Python
numpy实现RNN原理实现
2021/03/02 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
opencv实现图像平移效果
2021/03/24 Python
环境科学专业研究生求职信
2013/10/02 职场文书
即兴演讲稿
2014/01/04 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
副总经理岗位职责
2014/03/16 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
感谢师恩主题班会
2015/08/17 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript