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 什么是PEAR?(第二篇)
Mar 19 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php tp验证表单与自动填充函数代码
Feb 22 PHP
php自动加载机制的深入分析
Jun 08 PHP
PHP中exec与system用法区别分析
Sep 22 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
php生成无限栏目树
Mar 16 PHP
php 浮点数比较方法详解
May 05 PHP
PHP实现类似题库抽题效果
Aug 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
PHP如何将XML转成数组
2016/04/04 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
python入门之井字棋小游戏
2020/03/05 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
个人求职简历中英文自我评价
2013/12/16 职场文书
经营目标管理责任书
2014/07/25 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
小学师德师风整改措施
2014/10/27 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android