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 daodb插入、更新与删除数据
Mar 19 PHP
处理php自动反斜杠的函数代码
Jan 05 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
zend framework重定向方法小结
May 28 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
PHP精确计算功能示例
Nov 29 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
yii2多图上传组件的使用教程
May 10 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 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
世界上第一台立体声收音机
2021/03/01 无线电
php实现将数组转换为XML的方法
2015/03/09 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
css3 transform属性详解
2014/09/30 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
运动会广播稿50字
2014/01/26 职场文书
银行优秀员工事迹
2014/02/06 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
致800米运动员广播稿
2014/02/16 职场文书
安全生产计划书
2014/05/04 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
财务工作检讨书
2014/10/29 职场文书
后勤工作个人总结
2015/02/28 职场文书
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技