PHP 实现i18n

i18n 是国际化编程的一种设计:
国际化是指软件能用于多国语言环境的能力。在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。
::本文中的部分内容从网络获得
在php中实现程序的本地化,主要是依靠gettext函数实现,同时也会增加程序的复杂度。
首先在php.ini文件中加载php_gettext.dll模块。
例子:
index.php
<?php
      define(‘PACKAGE’,’index’);                     //定义一个区域变量,随便取名,最好和本网页的名称一致.
      bindtextdomain(PACKAGE,’./locate’);      //定义该区域的路径,在这个路径中包含有语言字典文件.
      textdomain(PACKAGE);                        //指定文件.
?>
<?php
    if(isset($_REQUEST["lang"])) {
        if($_REQUEST["lang"]==1) {
              putenv(‘LANG=zh_CN’);              //设定语言环境变量.
              setlocale(LC_ALL,’zh_CN’);         //设定本地语言
          }
          if($_REQUEST["lang"]==2) {
            putenv(‘LANG=en_US’);
            setlocale(LC_ALL,’en_US’);
          }
    } else {
        putenv(‘LANG=en_US’);
        setlocale(LC_ALL,’en_US’);
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
  <title>L10n Text</title>
</head>
<body>
  <form method="post" action="#">
    <b><?php echo _("Simp.Chinese"); ?>:</b><input type=
    "radio" name="lang" value="1"><br>
    <b><?php echo _("English"); ?>:</b><input type=
    "radio" name="lang" value="2"><br>
    <input type="submit" name="ChgLang" value=
    "<?php echo gettext("Change Lang"); ?>">
  </form><?php
    
      echo gettext("Hello,world!");
 ?>
</body>
</html>
 
在代码中对于需要翻译的字符串在使用时先用gettext($string)标记。注:gettext()可以改写成 _() 这样可以少打几个字。
然后在./locate/ (就是bindtextdomain所指定的路径下建立相应的文件夹) demo中为中文和英文的切换,所以我这里就建立了 zh_CN和 en_US两个文件夹,如果还有其他的语言支持就要建其他的文件夹,并以语言代码为文件夹名,在语言文件夹中建立子目录名称为LC_MESSAGES,字典文件都存储于这个目录。
然后从网上下载gnuwin(在sourceforge上有)主要要使用软件包中的xgettext和msgfmt指令。安装好gnuwin后,在命令行输入如下指令生成po文件,
xgettext -o index.po index.php  
 
index.po内容如下:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <
EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-07-26 03:24-0700\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=GB2312\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../../index.php:7
msgid "Simp.Chinese"
msgstr "简体中文"
#: ../../../index.php:9
msgid "English"
msgstr "英文"
#: ../../../index.php:11
msgid "Change Lang"
msgstr "更改语言"
#: ../../../index.php:22
msgid "Hello,world!"
msgstr "你好,世界!"
 
在这个文件中将msgid所对应的msgstr翻译成相应的语言,同时更改charset改成对应的字符集,中文改成gb2312,英文可以用utf-8
保存文件执行msgfmt生成mo文件
msgfmt -o index.mo index.po
 
依照上面的操作,在en_US或者其他语言的目录下也生成相应的字典文件。
到点一下按钮 就可以轻松实现L10n了。

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据