[转帖]利用gettext来实现PHP的国际化编程_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3324 | 回复: 0   主题: [转帖]利用gettext来实现PHP的国际化编程        下一篇 
zhongwei.wang
注册用户
等级:中校
经验:1859
发帖:60
精华:1
注册:2013-12-23
状态:离线
发送短消息息给zhongwei.wang 加好友    发送短消息息给zhongwei.wang 发消息
发表于: IP:您无权察看 2013-12-27 9:16:45 | [全部帖] [楼主帖] 楼主

通常人们写程序时都是将文字写死在程序里的,比如:echo   "Hello   World! ";   ,假如要改成它国语言,写国际化程序,就要逐个打开进行修改,程序较短时还行,若程序有上万甚至更多,改起来就不是那么容易了。近来随着i18n的逐渐标准化,我也来讲一讲在PHP中如何实现国际化支持。跟其他程序语言一样,在   PHP   也可以利用   gettext   套件写作   i18n   程序,实现   NLS(Native   Language   Support)   国际化支持,具体请参考官方文档(   http://www.gnu.org/manual/gettext/index.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档拷贝到系统目录下面   (Ex:   C:\WINNT\SYSTEM32   or   C:\WINDOWS\SYSTEM32),PHP   4.2.3   之后文件名为   libintl-1.dll,可在   php4\dlls   下获得。 
  2、打开php.ini档,查找extension=php_gettext.dll,去掉前面的“;” 
  3、保存,然后restart   server。 

  若一切顺利,就可以在   phpinfo()   中看到   gettext   字样,至此已设置完毕。 

  二、php_gettext.dll套件里有好几个函式,具体请看相关的manual。在这里我们只用记住3个函式就行了,如下: 

string   bindtextdomain   (   string   domain,   string   directory)
string   textdomain   (   string   text_domain)
string   gettext   (   string   message)


  三、写作i18n程序: 

<?php
//   常规的程序   
echo   "Hello   World! ");
?>


  下面是   i18n   程序:hello.php 

<?php
//   I18N   程序范例开始   
define( 'PACKAGE ',   'hello ');   //   定义要用的mo文件名称,常规来说,我们都把PACKAGE的名称定义和程序名称相同。   
putenv( 'LANG=zh_TW ');
setlocale(LC_ALL,   'zh_TW ');   //   指定要用的语系,如:en_US、zh_CN、zh_TW   
bindtextdomain(PACKAGE,   '/apache/htdocs/locale ');
textdomain(PACKAGE);
//   The   .mo   file   searched   is:
//   /apache/htdocs/locale/en/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_TW
/LC_MESSAGES
hello.po
hello.mo


  2、创建PO档 
  xgettext   -d   [您定义的PACKAGE名称]   [程序文件名] 
  WIN32下面的xgettext、msgfmt程序档可以从   (   http://switch.dl.sourceforge.net/so...0.10.40-bin.zip   )   下载,需要   libiconv.dll,、libintl.dll   的支持。 

  以上面hello.php档为例, 

 $   xgettext   -d   hello   hello.php


  运行后将产生一个hello.po档,内容如下: 

#   SOME   DESCRIPTIVE   TITLE.
#   Copyright   &copy;   YEAR   Free   Software   Foundation,   Inc.
#   FIRST   AUTHOR   <EMAIL@ADDRESS> ,   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   <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 "
#:   hello.php:14
msgid   "Hello   World! "
msgstr   " "


  里面列出   hello.php   档里所有调用   gettext   函式的字符串,翻译的时候只需将 
msgid   值翻译填入   msgstr   即可,如翻译成中文。 

#   SOME   DESCRIPTIVE   TITLE.
#   Copyright   &copy;   2003   Ptker   All   Right   Reserved.
#   FIRST   AUTHOR   <ptker@hotmail.com> ,   2003.
#
#,   fuzzy
msgid   " "
msgstr   " "
"Project-Id-Version:   0.1\n "
"POT-Creation-Date:   2003-04-21   22:31+0800\n "
"PO-Revision-Date:   YEAR-MO-DA   HO:MI+ZONE\n "
"Last-Translator:   Ptker   <ptker@hotmail.com> \n "
"Language-Team:   zh_TW   <ptker@hotmail.com> \n "
"MIME-Version:   1.0\n "
"Content-Type:   text/plain;   charset=BIG5\n "
"Content-Transfer-Encoding:   8bit\n "
#:   hello.php:14
msgid   "Hello   World! "


msgstr   "世界,您好! " 

  3、创建MO档 

 msgfmt   -o   hello.mo   hello.po


  运行后将产生一个hello.mo二进制档。 

  4、最后将   hello.po、hello.mo   拷贝到相关语系的目录下即可。 

  五、在IE中输入:   http://localhost/hello.php   ,现在的结果就是:“世界,您好!”




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论