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+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
Cygwin中安装PHP方法步骤
Jul 04 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
Jul 01 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
tp5.1 框架查询表达式用法详解
May 25 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防盗链的常用方法小结
2010/07/02 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP异常处理Exception类
2015/12/11 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
js 单引号 传递方法
2009/06/22 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
小程序点击图片实现png转jpg
2019/10/22 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python字符串排序方法
2014/08/29 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
浅谈Python peewee 使用经验
2017/10/20 Python
Python 读写文件的操作代码
2018/09/20 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
日语翻译个人求职的自我评价
2013/10/14 职场文书
给老婆的保证书
2015/01/16 职场文书