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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
Dec 29 PHP
PHP中数组的三种排序方法分享
May 07 PHP
php之Memcache学习笔记
Jun 17 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
smarty模板判断数组为空的方法
Jun 10 PHP
PHP程序员不应该忽略的3点
Oct 09 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
javascript折半查找详解
2015/01/26 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
python3实现弹弹球小游戏
2019/11/25 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
护士实习自我鉴定
2013/10/22 职场文书
学校十一活动方案
2014/02/01 职场文书
培训楼经理岗位责任制
2014/02/10 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
婚前保证书
2014/04/29 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
python开发人人对战的五子棋小游戏
2022/05/02 Python