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下使用无限生命期Session的方法
Mar 16 PHP
PHP 输出缓存详解
Jun 20 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
php中动态调用函数的方法
Mar 16 PHP
PHP数组函数知识汇总
May 12 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
一个非常实用的php文件上传类
Jul 04 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
基于laravel缓冲cache的用法详解
Oct 23 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
十大“创意”战术!
2020/03/04 星际争霸
php foreach 参数强制类型转换的问题
2010/12/10 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
php根据年月获取季度的方法
2014/03/31 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
解读python logging模块的使用方法
2018/04/17 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
Python构建图像分类识别器的方法
2019/01/12 Python
python enumerate内置函数用法总结
2020/01/07 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
Django中template for如何使用方法
2021/01/31 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
自行车广告词大全
2014/03/21 职场文书
食品销售计划书
2014/04/26 职场文书
国庆宣传标语
2014/06/30 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
微信小程序基础教程之echart的使用
2021/06/01 Javascript
netty 实现tomcat的示例代码
2022/06/05 Servers