PHP gettext 用法
Gettext 用于系统的国际化(I18N)和本地化(L10N),可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文.跟其他程序语言一样,在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持,具体请参考官方文档http://www.gnu.org/software/gettext/manual/gettext.html。
实现流程:程序设计者在程序码中写入所要显示的信息,在运行程序时并不会直接显示程序设计师所写的信息,而会先去找一个所设置语系的信息档。如果未找到,才会去显示程式码中的信息。
一、安装设置gettext套件:
1) *NIX系统:
1、从 http://www.gnu.org/software/gettext/gettext.html 下载 gettext package,进行安装
2、编译PHP的时候加上“--with-gettext[=DIR]”,其中DIR为gettext安装的目录,缺省为:/usr/local
3、保存,然后 restart server。
2) WIN32系统:
1、需要将gnu_gettext.dll档拷贝到系统目录下面 (C:\WINDOWS\SYSTEM32),PHP 4.2.3 之后文件名为 libintl-1.dll,可在 php4\dlls 下获得。
2、打开php.ini档,查找extension=php_gettext.dll,去掉前面的“;”
3、保存,然后restart server。
若一切顺利,就可以在 phpinfo() 中看到 gettext 字样,至此已设置完毕。
二、写作i18n程序:
1 2 3 4 | <?php // 常规的程序 echo "Hello World!"); ?>; |
下面是 i18n 程序:hello.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php // I18N 程序范例开始 $package="hello"; // 定义要用的mo文件名称,常规来说,我们都把PACKAGE的名称定义和程序名称相同。 $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!"); ?>; |
在IE中输入:http://localhost/hello.php,输出结果为:“Hello World!”
note:按照 GNU package 里面的习惯,可以使用 _(...) 来代替 gettext(...) ,这样就可以少打很多 gettext 了。
三、设置gettext po档:
1、创建目录结构,如下所示:
bindtextdomain's dir
/language
/LC_MESSAGES
domain.po
domain.mo
其中 bindtextdomain's dir 为 bindtextdomain() 所用的目录,language 为要用的语系,domain 为 PACKAGE 名称。
以上面为例:
/locale
/zh_CN
/LC_MESSAGES
hello.po
hello.mo
2、创建PO档
xgettext -d [您定义的PACKAGE名称] [程序文件名]
WIN32下面的xgettext、msgfmt程序档可以从 ( http://sourceforge.net/projects/gettext/ ) 下载,需要 libiconv.dll,、libintl.dll 的支持。可以用poedit来编辑。
以上面hello.php档为例,
$ xgettext -d hello hello.php
运行后将产生一个hello.po档,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # SOME DESCRIPTIVE TITLE. # 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 "世界,您好!" |
里面列出 hello.php 档里所有调用 gettext 函式的字符串,翻译的时候只需将msgid 值翻译填入 msgstr 即可,如翻译成中文。
3、创建MO档
$ msgfmt -o hello.mo hello.po
运行后将产生一个hello.mo二进制档。
4、最后将 hello.po、hello.mo 拷贝到相关语系的目录下即可。
最后:在IE中输入: http://localhost/hello.php ,现在的结果就是:“世界,您好!”
| -欢迎为本文评级 |
相关日志 |
本文读者也关心以下内容:
|















































很不错的入门,今天看你这个教程,至少让我确实得到了po文件了,但是很遗憾,距离为WP相关的产品制作语言包,还有些距离的。不管怎么说,还是帮到我了,谢谢~~~
Reply