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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
php xml 入门学习资料
Jan 01 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
PHP基本语法总结
Sep 06 PHP
php 使用array函数实现分页
Feb 13 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
Oct 18 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
PHP的mysqli_rollback()函数讲解
Jan 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
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
Smarty保留变量用法分析
2016/05/23 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
JScript中的undefined和&quot;undefined&quot;的区别
2007/03/08 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
vue组件间通信解析
2017/03/01 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python collections模块使用方法详解
2019/08/28 Python
Python 复平面绘图实例
2019/11/21 Python
python如何基于redis实现ip代理池
2020/01/17 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
营销总经理岗位职责
2014/02/02 职场文书
学生期末评语大全
2014/04/30 职场文书
教学督导岗位职责
2015/04/10 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python