PHP中使用gettext来支持多语言的方法


Posted in PHP onMay 02, 2011

我们今天用一个简单的实例说明一下在PHP中的getText的用法(getText是一系列的工具和库函数,帮助程序员和翻译人员开发多语言软件的), 从而实现PHP的i18n.
现在, 我们假设要显示一个返回主页的link:

//home.php: 
$str = 'home'; 
print <<<HTML 
<a href="#">{$str}</a> 
HTML;

下面开启我们多语言的开发之旅:
创建pot文件,pot是Portable Object Template的首字母缩写,与po对应的是mo,mo是Machine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:
xgettext -a home.php -o home.pot
运行该命令后,我们发现,在当前目录下,产生了一个名home.pot的文件,打开该文件,可以看到:
# SOME DESCRIPTIVE TITLE. 
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 
# This file is distributed under the same license as the PACKAGE package. 
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. 
# 
#, fuzzy 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2009-07-23 20:56+0800\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 
"Language-Team: LANGUAGE <LL@li.org>\n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=CHARSET\n" 
"Content-Transfer-Encoding: 8bit\n" 
#: home.php:2 
msgid "home" 
msgstr "

根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件:
export LANG=zh_CN.gb2312
msginit -l zh_CN.gb2312 -i home.pot
运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.po的文件,打开该文件,可以看到:
# Chinese translations for PACKAGE package 
# PACKAGE 软件包的简体中文翻译. 
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER 
# This file is distributed under the same license as the PACKAGE package. 
# <huixinchen@localhost.localdomain>, 2009. 
# 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2009-07-23 20:56+0800\n" 
"PO-Revision-Date: 2009-07-23 21:00+0800\n" 
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 
"Language-Team: Chinese\n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=GB2312\n" 
"Content-Transfer-Encoding: 8bit\n" 
#: test.php:2 
msgid "home" 
msgstr "

翻译zh_CN.po里对应的字符串为中文:
# Chinese translations for PACKAGE package 
# PACKAGE 软件包的简体中文翻译. 
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER 
# This file is distributed under the same license as the PACKAGE package. 
# <huixinchen@localhost.localdomain>, 2009. 
# 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2009-07-23 20:56+0800\n" 
"PO-Revision-Date: 2009-07-23 21:00+0800\n" 
"Last-Translator: <huixinchen@localhost.localdomain>\n" 
"Language-Team: Chinese\n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=GB2312\n" 
"Content-Transfer-Encoding: 8bit\n" 
#: test.php:2 
msgid "home" 
msgstr "主页

根据po文件生成mo文件。
msgfmt zh_CN.po -o zh_CN.mo
运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.mo的文件。它是二进制的,不能用文本编辑器打开。
安装mo文件到特定目录中:
cp -f zh_CN.mo .local/LC_MESSAGES/home.mo
修改程序。
setlocale(LC_ALL, 'zh_CN'); 
// Specify location of translation tables 
bindtextdomain("home", "."); 
// Choose domain 
textdomain("home"); 
// Translation is looking for in ./locale/zh_CN/LC_MESSAGES/home.mo now 
$str = gettext('home'); //也可以使用_('home') 
print <<<HTML 
<a href="#">{$str}</a> 
HTML;

运行这个脚本, 看看, 是不是输出正确的中文了呢?
添加其它语言也很容易,不需要修改程序,只需要像对待中文一样,生成一个mo文件,并安装到系统中对应的目录即可。切换不同的语言仅仅是修改当前的locale就行了。
PHP 相关文章推荐
php&amp;java(一)
Oct 09 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
利用PHP实现智能文件类型检测的实现代码
Aug 02 PHP
php提示undefined index的几种解决方法
May 21 PHP
php多文件上传下载示例分享
Feb 20 PHP
php url路由入门实例
Apr 23 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
php按单词截取字符串的方法
Apr 07 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
PHP number_format函数原理及实例解析
Jul 14 PHP
php中神奇的fastcgi_finish_request
May 02 #PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 #PHP
PHP 调试工具Debug Tools
Apr 30 #PHP
php debug 安装技巧
Apr 30 #PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 #PHP
php获取mysql数据库中的所有表名的代码
Apr 23 #PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 #PHP
You might like
php eval函数用法总结
2012/10/31 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
JSONP 跨域共享信息
2012/08/16 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
JS实现的二叉树算法完整实例
2017/04/06 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python多线程和队列操作实例
2015/06/21 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python 实现绘制整齐的表格
2019/11/18 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
资深地理教师自我评价
2013/09/21 职场文书
业务内勤岗位职责
2014/04/30 职场文书
无毒社区工作方案
2014/05/23 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
高中政治教师教学反思
2016/02/23 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
Python中itertools库的四个函数介绍
2022/04/06 Python