• 使用gettext来支持PHP的多语言


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

    //如果要轉載本文請注明出處,免的出現版權紛爭,我不喜歡看到那種轉載了我的作品卻不注明出處的人 Seven{See7di#Gmail.com}

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

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

    //home.php:
    $str = 'home';

    print <<<HTML
    <a href="#">{$str}</a>
    HTML;

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

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

    xgettext -a home.php -o home.pot

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

    # 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: 2009-07-23 20:56+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"

    #: home.php:2
    msgid "home"
    msgstr ""

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

    export LANG=zh_CN.gb2312

    msginit -l zh_CN.gb2312 -i home.pot

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

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

    #: test.php:2
    msgid "home"
    msgstr ""

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

    # Chinese translations for PACKAGE package
    # PACKAGE 软件包的简体中文翻译.
    # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # <huixinchen@localhost.localdomain>, 2009.
    #
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2009-07-23 20:56+0800\n"
    "PO-Revision-Date: 2009-07-23 21:00+0800\n"
    "Last-Translator: <huixinchen@localhost.localdomain>\n"
    "Language-Team: Chinese\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=GB2312\n"
    "Content-Transfer-Encoding: 8bit\n"

    #: test.php:2
    msgid "home"
    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

    修改程序。

    setlocale(LC_ALL, 'zh_CN');

    // Specify location of translation tables
    bindtextdomain("home", ".");

    // Choose domain
    textdomain("home");

    // Translation is looking for in ./locale/zh_CN/LC_MESSAGES/home.mo now

    $str = gettext('home'); //也可以使用_('home')

    print <<<HTML
    <a href="#">{$str}</a>
    HTML;

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

    添加其它语言也很容易,不需要修改程序,只需要像对待中文一样,生成一个mo文件,并安装到系统中对应的目录即可。切换不同的语言仅仅是修改当前的locale就行了。
  • 相关阅读:
    css选择器解析规则
    swiper轮播图包含视频或图片
    css实现文字选中变色
    swiper鼠标滚轮事件
    C语言中,关于相除的问题
    输入测试字符型数据的组数,再输入字符型数据,排坑
    C语言中,字符型数字与常数型数字的加减实现
    C语言的指针用法:输入一堆字符,把非字母的删去。
    C语言中倒序输出你输入的数。
    C语言中,嵌套的if语句的一些经验...
  • 原文地址:https://www.cnblogs.com/see7di/p/2239855.html
Copyright © 2020-2023  润新知