使用gettext来支持PHP的多语言

1、基于windowsphp

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 安裝html

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

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

<?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来产生的:dom

把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,翻译对应的字符串为中文,最后以下:ui

# 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就好了。

2、基于Linux

1.安装php gettext扩展

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

如今说下第二个动态安装

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

二、进入gettext目录下执行:

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

(以上两个命令的路径根据本身系统状况而定)

make
make install

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

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

相关文章
相关标签/搜索