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实现WEB动态网页静态
Oct 09 PHP
如何使用脚本模仿登陆过程
Nov 22 PHP
php 页面执行时间计算代码
Dec 04 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
php中实现获取随机数组列表的自定义函数
Apr 02 PHP
php简单操作mysql数据库的类
Apr 16 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
php中使用websocket详解
Sep 23 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
PHP基于自增数据如何生成不重复的随机数示例
May 19 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
博士208HAF收音机实习报告
2021/03/02 无线电
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
Python 12306抢火车票脚本
2018/02/07 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
浅析Python四种数据类型
2018/09/26 Python
python判断完全平方数的方法
2018/11/13 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
企业项目策划书
2014/01/11 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
python中 .npy文件的读写操作实例
2022/04/14 Python