PHP 编程 多语言本地化支持
一直认为要让PHP程序支持多语言就是模板+各种语言配置文件
简单的语言配置像这样
$conf['system']='系统系统';
$conf['user']='用户系统';
利用数组或者是定义常量的方法来管理这些条目,然后通过模板来读取这个数组做一下简单替换
最近发现php 其实是支持I18N 的,需要的模块是gettext
具体实现:
// I18N 程序范例开始
$package="hello"; // 定义要用的mo文件名称
$locale="zh_CN"; // 指定要用的语系,如:en_US、zh_CN、zh_TW
putenv('LANG=$locale');
setlocale(LC_ALL, $locale);
bindtextdomain($package, './locale');
textdomain($package);
// The .mo file searched is:
// ./locale/zh_CN/LC_MESSAGES/hello.mo
echo gettext("Hello World!");
?>;
创建PO文档
xgettext -d [您定义的PACKAGE名称] [程序文件名]
hello.po 内容如下
# Copyright © YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <<a href="mailto:EMAIL@ADDRESS">EMAIL@ADDRESS</a>>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2003-04-21 22:31+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <<a href="mailto:EMAIL@ADDRESS%3E\n">EMAIL@ADDRESS>\n</a>"
"Language-Team: LANGUAGE <<a href="mailto:LL@li.org%3E\n">LL@li.org>\n</a>"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.php:14
msgid "Hello World!"
msgstr "世界,您好!" // 这段就是添加翻译的内容
创建mo文件
将 hello.mo 文件拷贝到相关语系的目录下就可以了,这里是拷贝到
补充:
echo gettext(”Hello World!”); 这种写法可以用 echo _(’Hello World!’) 来代替 (可以少打几个字)。 _() 是 gettext 函数的别名。
php 相关gettext 函数介绍
http://cn.php.net/manual/en/book.gettext.php
messages from the DOMAIN message catalog will be returned
bindtextdomain -- Sets the path for a domain
dcgettext -- Overrides the domain for a single lookup
dcngettext -- Plural version of dcgettext
dgettext -- Override the current domain
dngettext -- Plural version of dgettext
gettext -- Lookup a message in the current domain
ngettext -- Plural version of gettext
textdomain -- Sets the default domain
建议使用utf8格式保存po文件
把
修改成
使用以下命令转换文件编码
还要注意需要在php程序中再加入
翻译po文件可以使用一些图形化工具
KBabel http://kbabel.kde.org/
gtranslator http://www.gtranslator.org
其他内容:
什么是 I18N 和 L10N ?
I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”;与之类似,L10N 是 localization 的缩写形式,意即在 l 和 n 之间有 10 个字母,本意是指软件的“本地化”。
I18N 和 L10N 从何而来?它们有何区别?
按照软件开发的惯例,最初的软件只有英文版本,根据需要,作者再把软件界面和文档翻译成不同国家、地区的语言版本。但是由于实现翻译的途径、翻译的工作效率、翻译的可重用性等因素各不相同,使翻译工作面临很大困境,也阻碍了软件的推广和应用。为了方便地将软件翻译成不同语言的版本,就需要一套翻译规范和通用工具,这就导致了“国际化”机制的出现。仅仅翻译是不够的,同一种语言在不同国家、地区可能存在多个支系,它们在表达习惯、语法结构甚至文字种类和编码上都有不同,方言更是千奇百怪,通用的翻译其质量肯定是不高的。涉及到计算机领域,还存在操作习惯上的差别,而且对某种语言提供完美的输入、显示、打印、保存、传输并非一件轻而易举的事,这就导致了“本地化”机制的出现。简而言之,“国际化”是“本地化”的一部分,主要是指国际化的实现机制和翻译工作, “本地化”包含“国际化”,是对“国际化”的补充和完善,它还包括为实现对某种特定语言良好的支持而进行的有针对性的翻译调整以及对软件进行的打补丁工作。
I18N 和 L10N 的国际组织是什么?
I18N 和 L10N 的国际组织是 Openi18n 组织,其前身是 li18nux 组织。它原来是制定 GNU/Linux 自由操作系统上软件全球化标准的国际计划,后来扩充到 GNU/Linux 之外所有开放源代码的技术领域,因而更名为 Open Internationalization Initiative,由非营利组织 Free Standards Group 赞助,并为世界各大厂商所支持,对于 GNU/Linux 系统上的多国语言文字处理技术和环境有决定性的影响。各个开源软件开发组织通常都有负责“国际化”和“本地化”工作的分支机构。
I18N 主要使用什么工具工作?
I18N 主要使用 gettext 软件包使软件实现国际化支持。事实上它是一整套 I18N 解决方案。
Gettext 用于系统的国际化(I18N)和本地化(L10N), 可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文.跟其他程序语言一样,在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档http://www.gnu.org/software/gettext/manual/gettext.html。
实现流程:程序设计者在程序码中写入所要显示的信息,在运行程序时并不会直接显示程序设计师所写的信息,而会先去找一个所设置语系的信息档。如果未找到,才会去显示程式码中的信息。
什么是 PO 和 MO 文件?它们有何区别?
PO 是 Portable Object (可移植对象)的缩写形式;MO 是 Machine Object (机器对象) 的缩写形式。PO 文件是面向翻译人员的、提取于源代码的一种资源文件。当软件升级的时候,通过使用 gettext 软件包处理 PO 文件,可以在一定程度上使翻译成果得以继承,减轻翻译人员的负担。MO 文件是面向计算机的、由 PO 文件通过 gettext 软件包编译而成的二进制文件。程序通过读取 MO 文件使自身的界面转换成用户使用的语言。
9月 20th, 2008 at 8:58 下午
[...] PHP 编程 多语言本地化支持 一直认为要让PHP程序支持多语言就是模板+各种语言配置文件 简单的语言配置像这样 $conf['title']=’xxx管理系统’;$conf['system']=’系统系统’;$conf['user']=’用户系统’; 利用数组或者是定义常量的方法来管理这些条目,然后通过模板来读取这个数组做一下简单替换 最近发.. [...]