我是正常蛇

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  12 随笔 :: 10 文章 :: 0 评论 :: 6926 阅读

开发多语言的Web应用是一件非常困难的事,各个国家的字符集的编码方式、货币符号、日期格式、数字格式、文字表现都各不相同.

我们今天用一个简单的实例说明一下在PHP中的getText的用法(getText是一系列的工具和库函数,帮助程序员和翻译人员开发多语言软件的), 从而实现PHP的i18n.

现在, 我们假设要显示一个返回主页的link:

  1. //home.php:
  2. $str = 'home';
  3.  
  4. print <<<HTML
  5. <a href="#">{$str}</a>
  6. HTML;

下面开启我们多语言的开发之旅:

创建pot文件,pot是Portable Object Template的首字母缩写,与po对应的是mo,mo是Machine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:

xgettext -a home.php -o home.pot

运行该命令后,我们发现,在当前目录下,产生了一个名home.pot的文件,打开该文件,可以看到:

  1. # SOME DESCRIPTIVE TITLE.
  2. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
  3. # This file is distributed under the same license as the PACKAGE package.
  4. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5. #
  6. #, fuzzy
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: PACKAGE VERSION\n"
  10. "Report-Msgid-Bugs-To: \n"
  11. "POT-Creation-Date: 2009-07-23 20:56+0800\n"
  12. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  13. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14. "Language-Team: LANGUAGE <LL@li.org>\n"
  15. "MIME-Version: 1.0\n"
  16. "Content-Type: text/plain; charset=CHARSET\n"
  17. "Content-Transfer-Encoding: 8bit\n"
  18.  
  19. #: home.php:2
  20. msgid "home"
  21. msgstr ""

根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件:

export LANG=zh_CN.gb2312

msginit -l zh_CN.gb2312 -i home.pot

运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.po的文件,打开该文件,可以看到:

  1. # Chinese translations for PACKAGE package
  2. # PACKAGE 软件包的简体中文翻译.
  3. # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
  4. # This file is distributed under the same license as the PACKAGE package.
  5. # <huixinchen@localhost.localdomain>, 2009.
  6. #
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: PACKAGE VERSION\n"
  10. "Report-Msgid-Bugs-To: \n"
  11. "POT-Creation-Date: 2009-07-23 20:56+0800\n"
  12. "PO-Revision-Date: 2009-07-23 21:00+0800\n"
  13. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14. "Language-Team: Chinese\n"
  15. "MIME-Version: 1.0\n"
  16. "Content-Type: text/plain; charset=GB2312\n"
  17. "Content-Transfer-Encoding: 8bit\n"
  18.  
  19. #: test.php:2
  20. msgid "home"
  21. msgstr ""

翻译zh_CN.po里对应的字符串为中文:

  1. # Chinese translations for PACKAGE package
  2. # PACKAGE 软件包的简体中文翻译.
  3. # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
  4. # This file is distributed under the same license as the PACKAGE package.
  5. # <huixinchen@localhost.localdomain>, 2009.
  6. #
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: PACKAGE VERSION\n"
  10. "Report-Msgid-Bugs-To: \n"
  11. "POT-Creation-Date: 2009-07-23 20:56+0800\n"
  12. "PO-Revision-Date: 2009-07-23 21:00+0800\n"
  13. "Last-Translator: <huixinchen@localhost.localdomain>\n"
  14. "Language-Team: Chinese\n"
  15. "MIME-Version: 1.0\n"
  16. "Content-Type: text/plain; charset=GB2312\n"
  17. "Content-Transfer-Encoding: 8bit\n"
  18.  
  19. #: test.php:2
  20. msgid "home"
  21. msgstr "主页"

根据po文件生成mo文件。

msgfmt zh_CN.po -o zh_CN.mo

运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.mo的文件。它是二进制的,不能用文本编辑器打开。

安装mo文件到特定目录中:

cp -f zh_CN.mo .local/LC_MESSAGES/home.mo

修改程序。

  1. setlocale(LC_ALL, 'zh_CN');
  2.  
  3. // Specify location of translation tables
  4. bindtextdomain("home", ".");
  5.  
  6. // Choose domain
  7. textdomain("home");
  8.  
  9. // Translation is looking for in ./locale/zh_CN/LC_MESSAGES/home.mo now
  10.  
  11. $str = gettext('home'); //也可以使用_('home')
  12.  
  13. print <<<HTML
  14. <a href="#">{$str}</a>
  15. HTML;

运行这个脚本, 看看, 是不是输出正确的中文了呢?

添加其它语言也很容易,不需要修改程序,只需要像对待中文一样,生成一个mo文件,并安装到系统中对应的目录即可。切换不同的语言仅仅是修改当前的locale就行了。

posted on 2012-08-24 13:41  我是正常蛇  阅读(136)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示