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开发文件系统实例讲解
Oct 09 PHP
php的header和asp中的redirect比较
Oct 09 PHP
关于时间计算的结总
Dec 06 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
浅谈PHP封装CURL
Mar 06 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
jQuery 表格工具集
2010/04/25 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
调试Python程序代码的几种方法总结
2015/04/28 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
如何在python中判断变量的类型
2020/07/29 Python
python 绘制国旗的示例
2020/09/27 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
电气自动化自荐信
2013/10/10 职场文书
教师评优事迹材料
2014/01/10 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
红色革命电影观后感
2015/06/18 职场文书
在校学生证明格式
2015/06/24 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Redis特殊数据类型bitmap位图
2022/06/01 Redis