使用gettext来支持PHP的多语言

一、基于windows

1.在php.ini中打开扩展php_gettext.dll,重启php. 2.下载关于gettext的工具, 链接:https://git.oschina.net/tanjiajun/php_gettext/raw/master/gettext-0.14.4-bin.zip GetText 所需相关的 Library 安裝

上述套件下载使用后, 会提示缺少 Library: libexpat.dll libiconv2.dll 直接下载 : gettext-dll.tgz, 链接:https://git.oschina.net/tanjiajun/php_gettext/raw/master/gettext-dll.tgz 把两个文件放到 C:\gettext\bin\目录即可.(具体目录因个人而异)

3.新建一个测试的php模板文件,保存为home.php,内容如下:

<?php
//home.php:
$str = 'home';
print <<<HTML
<a href="#">{$str}</a>
HTML;
?>

4.创建pot文件,pot是Portable Object Template的首字母缩写,与po对应的是mo,mo是Machine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:

把home.php复制到工具gettext的bin目录下,我这边的是:D:\gettext\gettext-0.14.4-bin\bin这个目录。 dos窗口来到这个目录下,运行命令: 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: 2016-12-29 14:49+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:3
msgid "home"
msgstr ""

接着,根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件: msginit -l zh_CN.gb2312 -i home.pot

运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.po的文件,打开,把文件中的编码charset设置为UTF-8,翻译对应的字符串为中文,最后如下:

# Chinese translations for PACKAGE package.
# Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# tjj <EMAIL@ADDRESS>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-12-29 14:49+0800\n"
"PO-Revision-Date: 2016-12-29 14:50+0800\n"
"Last-Translator: tjj <EMAIL@ADDRESS>\n"
"Language-Team: Chinese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: home.php:3
msgid "home"
msgstr "首页"

根据po文件生成mo文件。

msgfmt zh_CN.po -o home.mo

运行该命令后,我们发现,在当前目录下,产生了一个名home.mo的文件。它是二进制的,不能用文本编辑器打开。

复制mo文件到特定目录中:

./locale/zh_CN/LC_MESSAGES/home.mo

最后修改,home.php:

<?php
$language='zh_CN';
putenv("LANG=$language");
setlocale(LC_ALL, 'zh_CN');

// Specify location of translation tables
bindtextdomain("home", "./locale");
// Choose domain
textdomain("home");

// Translation is looking for in ./locale/zh_CN/LC_MESSAGES/home.mo now

$str = gettext('home'); //也可以使用_('home')
print <<<HTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<a href="#">{$str}</a>
HTML;
?>

运行这个脚本, 看看, 是不是输出正确的中文了呢?

添加其它语言也很容易,不需要修改程序,只需要像对待中文一样,生成一个mo文件,并复制到系统中对应的目录即可。切换不同的语言仅仅是修改当前的locale就行了。

二、基于Linux

1.安装php gettext扩展

(1)、重新编译php,加上--with-gettext (2)、动态安装

现在说下第二个动态安装

1、下载同版本的php原包,解压后进入ext目录,目录下便是模块

2、进入gettext目录下执行:

/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config

(以上两个命令的路径根据自己系统情况而定)

make
make install

3、在php.ini里添加上gettext.so extension = "gettext.so" 重启php即可

2.安装完毕后,和windonws步骤一样,生成pot,.po和.mo的文件。

转载于:https://my.oschina.net/u/2394701/blog/815883

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值