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 相关文章推荐
DISCUZ 分页代码
Jan 02 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php实现无限级分类
Dec 24 PHP
php实现的简单检验登陆类
Jun 18 PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
php 策略模式原理与应用深入理解
Sep 25 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 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
如何做到多笔资料的同步
2006/10/09 PHP
让的PHP代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
php自定文件保存session的方法
2014/12/10 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
银行学习十八大感想
2014/01/11 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
《金色的草地》教学反思
2016/02/17 职场文书