i18n 是国际化编程的一种设计:
国际化是指软件能用于多国语言环境的能力。在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。
::本文中的部分内容从网络获得
在php中实现程序的本地化,主要是依靠gettext函数实现,同时也会增加程序的复杂度。
首先在php.ini文件中加载php_gettext.dll模块。
例子:
index.php
<?php
define(‘PACKAGE’,’index’); //定义一个区域变量,随便取名,最好和本网页的名称一致.
bindtextdomain(PACKAGE,’./locate’); //定义该区域的路径,在这个路径中包含有语言字典文件.
textdomain(PACKAGE); //指定文件.
?>
<?php
if(isset($_REQUEST["lang"])) {
if($_REQUEST["lang"]==1) {
putenv(‘LANG=zh_CN’); //设定语言环境变量.
setlocale(LC_ALL,’zh_CN’); //设定本地语言
}
if($_REQUEST["lang"]==2) {
putenv(‘LANG=en_US’);
setlocale(LC_ALL,’en_US’);
}
} else {
putenv(‘LANG=en_US’);
setlocale(LC_ALL,’en_US’);
}
?>
define(‘PACKAGE’,’index’); //定义一个区域变量,随便取名,最好和本网页的名称一致.
bindtextdomain(PACKAGE,’./locate’); //定义该区域的路径,在这个路径中包含有语言字典文件.
textdomain(PACKAGE); //指定文件.
?>
<?php
if(isset($_REQUEST["lang"])) {
if($_REQUEST["lang"]==1) {
putenv(‘LANG=zh_CN’); //设定语言环境变量.
setlocale(LC_ALL,’zh_CN’); //设定本地语言
}
if($_REQUEST["lang"]==2) {
putenv(‘LANG=en_US’);
setlocale(LC_ALL,’en_US’);
}
} else {
putenv(‘LANG=en_US’);
setlocale(LC_ALL,’en_US’);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>L10n Text</title>
</head>
<head>
<title>L10n Text</title>
</head>
<body>
<form method="post" action="#">
<b><?php echo _("Simp.Chinese"); ?>:</b><input type=
"radio" name="lang" value="1"><br>
<b><?php echo _("English"); ?>:</b><input type=
"radio" name="lang" value="2"><br>
<input type="submit" name="ChgLang" value=
"<?php echo gettext("Change Lang"); ?>">
</form><?php
echo gettext("Hello,world!");
?>
</body>
</html>
<form method="post" action="#">
<b><?php echo _("Simp.Chinese"); ?>:</b><input type=
"radio" name="lang" value="1"><br>
<b><?php echo _("English"); ?>:</b><input type=
"radio" name="lang" value="2"><br>
<input type="submit" name="ChgLang" value=
"<?php echo gettext("Change Lang"); ?>">
</form><?php
echo gettext("Hello,world!");
?>
</body>
</html>
在代码中对于需要翻译的字符串在使用时先用gettext($string)标记。注:gettext()可以改写成 _() 这样可以少打几个字。
然后在./locate/ (就是bindtextdomain所指定的路径下建立相应的文件夹) demo中为中文和英文的切换,所以我这里就建立了 zh_CN和 en_US两个文件夹,如果还有其他的语言支持就要建其他的文件夹,并以语言代码为文件夹名,在语言文件夹中建立子目录名称为LC_MESSAGES,字典文件都存储于这个目录。
然后从网上下载gnuwin(在sourceforge上有)主要要使用软件包中的xgettext和msgfmt指令。安装好gnuwin后,在命令行输入如下指令生成po文件,
xgettext -o index.po index.php
index.po内容如下:
# 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: 2007-07-26 03:24-0700\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=GB2312\n"
"Content-Transfer-Encoding: 8bit\n"
# 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: 2007-07-26 03:24-0700\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=GB2312\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../../index.php:7
msgid "Simp.Chinese"
msgstr "简体中文"
msgid "Simp.Chinese"
msgstr "简体中文"
#: ../../../index.php:9
msgid "English"
msgstr "英文"
msgid "English"
msgstr "英文"
#: ../../../index.php:11
msgid "Change Lang"
msgstr "更改语言"
msgid "Change Lang"
msgstr "更改语言"
#: ../../../index.php:22
msgid "Hello,world!"
msgstr "你好,世界!"
msgid "Hello,world!"
msgstr "你好,世界!"
在这个文件中将msgid所对应的msgstr翻译成相应的语言,同时更改charset改成对应的字符集,中文改成gb2312,英文可以用utf-8
保存文件执行msgfmt生成mo文件
msgfmt -o index.mo index.po
依照上面的操作,在en_US或者其他语言的目录下也生成相应的字典文件。
到点一下按钮 就可以轻松实现L10n了。