Eric @ EricBess WebHome

一味思考而不行动,将在不知不觉中变得无意义

Chinese (Simplified) flagItalian flagKorean flagPortuguese flagEnglish flagGerman flagFrench flagSpanish flagJapanese flagArabic flagRussian flagGreek flagDutch flagBulgarian flagCzech flagCroat flagDanish flagFinnish flagHindi flagPolish flagRumanian flagSwedish flagNorwegian flagCatalan flagFilipino flagHebrew flagIndonesian flagLatvian flagLithuanian flagSerbian flagSlovak flagSlovenian flagUkrainian flagVietnamese flag
By N2H

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 &lt;<a href="mailto:EMAIL@ADDRESS">EMAIL@ADDRESS</a>&gt;, 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 &lt;<a href="mailto:EMAIL@ADDRESS%3E\n">EMAIL@ADDRESS&gt;\n</a>"
"Language-Team: LANGUAGE &lt;<a href="mailto:LL@li.org%3E\n">LL@li.org&gt;\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 ,现在的结果就是:“世界,您好!”

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5 out of 5)
Loading ... Loading ...
-欢迎为本文评级

相关日志

本文读者也关心以下内容:

  • N/A

02月 9th, 2008 作者: eric | Coding | Trackback ? | 1评论| Email This Post Print This Post | 840 views

Add a Comment

Leave a reply

Hide Post Comments
  1. Charles posted the following on 2008-05-20 at 9:18 pm.

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

    Reply