`
hudeyong926
  • 浏览: 2032848 次
  • 来自: 武汉
社区版块
存档分类
最新评论

gettext库 多语言国际化2

阅读更多

通常人们写程序时都是将文字写死在程序里的,比如:echo "Hello World!"; ,假如要改成它国语言,写国际化程序,就要逐个打开进行修改,程序较短时还行,若程序有上万甚至更多,改起来就不是那么容易了。近来随着i18n的逐渐标准化,我也来讲一讲在PHP中如何实现国际化支持。跟其他程序语言一样,在 PHP 也可以利用 gettext 套件写作 i18n 程序,实现 NLS(Native Language Support) 国际化支持。

 

实现流程:程序设计者在程序码中写入所要显示的信息,在运行程序时并不会直接显示程序设计师所写的信息,而会先去找一个所设置语系的信息档。如果未找到,才会去显示程式码中的信息。

一、安装设置gettext 套件:
windows系统:
1、打开php.ini档,查找extension=php_gettext.dll,去掉前面的“;”
2、保存,然后restart server。

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

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

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

 

2,php-gettext的使用.以一个具体的例子说明

如果debian系列的linux用户,注意查看本地语言支持。 vim /usr/share/i18n/SUPPORTED

中文:zh_CN.UTF-8

英文:en_US.UTF-8

德文:de_DE.UTF-8

法文:fr_FR.UTF-8

如果没有,则相应的安装之。方法:sudo apt-get locale-gen zh_CN.UTF-8 

在php程序中,可以使用gettext()来标记需要翻译的语言包,gettext()函数常用_()代替;

2.1 建立文件目录

mkdir gettext

cd gettext

touch Locale.php

touch test.php

//中文mo文件的地方.

mkdir -p Locale/zh_CN/LC_MESSAGES 

//英文文mo文件的地方.

mkdir -p Locale/en_US/LC_MESSAGES

 

至于编辑工具,由于 po 文件本身就是一个文本文件,所以任何文本编辑器都可以使用。除了专门编辑 po 文件的 poEdit ,还推荐使用 poEdit EditPlus UltraEdit 或者你喜欢的 vivim
汉化mo文件需要的工具叫gettext,去http://gnuwin32.sourceforge.net/packages/gettext.htm 下载一个回来安装,然后运行:
msgunfmt.exe d:\english.mo -o d:\english.po
对english.po进行编辑、翻译,完成后再运行:
msgfmt.exe -o d:\chinese.mo d:\english.po
然后就编译完成了chinese.mo文件。 

 

AccountSections.php

_('Could not retrieve the requested section please try again.');

mo文件中对应:

#: AccountSections.php:187
msgid "Could not retrieve the requested section please try again." //对应页面调用的key
msgstr "不能取回要求的类别, 请重试"  //显示文字

 

2.2 Locale.php文件代码

<?php 
/**
 * Dh_Locale 语言包类
 *
 * 系统语言包采用的是php-gettext模块.
 * 如果模板使用的是smarty.使用了smarty-gettext插件.插件地址http://sourceforge.net/projects/smarty-gettext/
 *  php-gettext的安装和使用(ubuntu平台下)
 *  1 Installation of gettext package: sudo apt-get install php-gettext
 *  2 Install locales: see all locales in the file vim /usr/share/i18n/SUPPORTED
 *  3 设置文件目录结构;如: Locale/zh_CN/LC_MESSAGES 或者 Locale/en_US/LC_MESSAGES
 *  4 如果是smarty模板(使用{t}你好{/t}标记)。生成.c格式的文件;如:php -q tsmarty2c.php  $file > text.c
 *  5 生成.po格式的文件;xgettext -o Dh.po --join-existing --omit-header --no-location text.c 
 *  6 生成.mo格式的文件;msgfmt Dh.po -o Dh.mo
 *  7 移动mo文件到相应的Locale/en_US/LC_MESSAGES文件夹下面
 *
 * @package 
 * @version $id$
 * @copyright 1997-2005 The PHP Group
 * @author erhuok <erhu.ok@gmail.com> 
 * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt}
 */
class Dh_Locale {
    /**
     * _options 设置语言包的选项 
     *
     * $this->_options['lang'] 应用程序使用什么语言包.php-gettext支持的所有语言都可以.
     * 在ubuntu下使用sudo vim /usr/share/i18n/SUPPORTED 主要是utf8编码
     * $this->_options['domain'] 生成的.mo文件的名字.一般是应用程序名
     *
     * @var array
     * @access protected
     */
    protected $_options; 
    /**
     * __construct 构造函数 对象初始化时设置语言包的参数 
     * 
     * @access public
     * @return void
     */
    public function __construct($lang=null) {
        switch ( $lang ) {
            case 'cn':
                $this->_options = array('lang' => 'zh_CN.utf8','domain'=>'Dh');
                break;
            case 'en':
            case 'us':
            case 'eu':
                $this->_options = array('lang' => 'en_US.utf8','domain'=>'Dh');
                break;
            case 'de':
                $this->_options = array('lang' => 'de_DE.utf8','domain'=>'Dh');
                break;
            case 'fr':
                $this->_options = array('lang' => 'fr_FR.utf8','domain'=>'Dh');
            default:
                $this->_options = array('lang' => 'zh_CN.utf8','domain'=>'Dh');
                break;
        }
        $this->setApplicationLocale();
    }
    /**
     * setOptions 设置应用程序语言包的参数 放在在数组$this->_options中 
     * 
     * @param mixed $options 
     * @access public
     * @return void
     */
    public function setOptions($options) {
        if(!empty($options)) {
            foreach ($options as $key => $option) {
                $this->_options[$key] = $option;
            }
        }
    }
    /**
     * setApplicationLocale  设置应用程序语言包 
     * 
     * @access public
     * @return void
     */
    public function setApplicationLocale() {
        putenv('LANG='.$this->_options['lang']);
        setlocale(LC_ALL,$this->_options['lang']);
        bindtextdomain($this->_options['domain'],dirname(__FILE__).'/Locale/');
        textdomain($this->_options['domain']);
        bind_textdomain_codeset($this->_options['domain'],'UTF-8');
    }
}
?>

2.3 测试用例

<?php
require_once dirname(__FILE__).'/Locale.php';
//cn or en
$Lang = 'cn';
$Locale = new Dh_Locale($Lang);
$Checkout['AddressFields'] = array
(
    'Email' => array
    (
        'Type' => 'text',
        'Label' => _('邮箱'),
        'Title' => _('请填写邮箱'),
        'Class' => 'required',
        'Filter' => 'string',
    ),
    'PostCode' => array
    (
        'Type' => 'text',
        'Label' => _('邮政编码'),
        'Title' => _('请填写邮政编码'),
        'Class' => 'required',
        'Filter' => 'int',
    ),
);
echo '<pre>';print_r($Checkout);echo '</pre>';
?>
分享到:
评论
1 楼 dewei 2011-03-26  
还有进一步说明吗?
好像没说完啊。

相关推荐

    gettext 0.17 django国际化工具

    在IT行业中,`gettext`是一个广泛使用的工具,用于软件的多语言化,即国际化(Internationalization)和本地化(Localization)。这个工具集主要是为Unix-like系统设计的,但也能在其他平台,包括Python的Django框架...

    PHP Smarty_gettext下载

    而`gettext`则是Linux/Unix环境中广泛使用的国际化(i18n)和本地化(l10n)工具,用于处理多语言支持。将Smarty与gettext结合,可以方便地在PHP应用中实现多语言功能。 Smarty_gettext是Smarty模板引擎的一个扩展...

    Java Web Application 另类的国际化方式gettext - commons for Java

    然而,标题提到的“另类的国际化方式gettext”提供了一种不同的方法,特别是在处理多语言环境时,可能更为高效和灵活。 gettext是一个在开源世界广泛使用的工具,主要用于软件的本地化。它最初是为C和C++设计的,但...

    PHP 国际化 多语言

    例如,可以创建自定义的翻译函数来适应特定的项目需求,或者使用第三方库如GetText、Laravel的Lang包来简化多语言管理。 总结,PHP的国际化和多语言支持是构建全球化网站或应用的关键部分。通过使用PHP的Intl扩展和...

    gettext源码

    `gettext`是一个在开源软件开发中广泛使用的工具集,主要用于多语言环境下的文本翻译。...通过这个过程,我们可以确保我们的Linux系统具备了处理多语言文本的能力,从而支持各种国际化的应用和工具。

    DELPHI GETTEXT源代码

    GETTEXT是一个广泛用于C和C++等编程语言的国际化(i18n)和本地化(l10n)工具,但同样可以被引入到Delphi项目中,以实现更灵活的多语言功能。在Delphi开发环境中,GETTEXT的使用可以帮助程序员轻松地处理不同语言...

    前端开源库-angular-gettext-tools

    总结起来,`angular-gettext-tools`是前端开发中处理国际化问题的重要工具,它简化了多语言应用的开发流程,使得开发者可以专注于代码逻辑,而将翻译工作交给专业人员处理。通过使用这个库,可以确保前端应用的本地...

    GNU Gettext Delphi Demo

    这个小型应用的目的是为了验证Gettext是否能够在Delphi环境下正常工作,帮助开发者理解如何集成这一强大的国际化(i18n)和本地化(l10n)解决方案。 GNU Gettext 是一个广泛使用的开源工具集,它为软件提供了处理...

    Laravel开发-gettext

    在Laravel框架中,`gettext`是一个非常有用的工具,...通过使用`gettext`,开发者可以更加高效地管理翻译文件,提升项目的国际化体验。无论是小型项目还是大型企业级应用,`gettext`都能帮助我们更好地应对多语言需求。

    PHP多语言翻译 和php的gettext函数类似

    `gettext`是一个强大的国际化(i18n)和本地化(l10n)工具,它允许开发者将应用的文本字符串与特定的语言版本关联起来,从而实现多语言环境下的内容展示。 标题中提到的“PHP多语言翻译”是指使用PHP的`gettext`...

    Laravel开发-laravel-gettext

    总之,`laravel-gettext`为Laravel开发者提供了一种高效、灵活的多语言解决方案,通过结合Gettext的强大功能和Laravel的优雅设计,使得国际化的实现更加顺畅。在开发多语言应用时,它是值得考虑的一个优秀选择。

    gettext-runtime-0.13.1

    1. **bin**:这个目录通常包含可执行文件或脚本,这些文件可以在命令行环境中直接运行,用于执行与gettext-runtime相关的功能,如国际化工具或者帮助开发者进行翻译工作的实用程序。 2. **README.gettext-runtime**...

    源码gettext-0.19.3.tar

    总的来说,`gettext` 是一个强大的国际化和本地化工具,它简化了软件本地化的过程,使得开发者能够更容易地为全球用户提供多语言支持。对于任何希望使其软件面向国际市场的开发者来说,理解和使用 `gettext` 都是...

    gettext-0.21.tar.gz

    gettext提供了一个帮助产生多语言 message的框架:包括一组关于程序改如何编写以支持 message种类的约定, message种类相关的一个目录和文件命名组织,一个支持获取已翻译 message的运行时库,一些独立的程序(可以...

    gun gettext for delphi2010 demo project

    GNU Gettext 是一个广泛使用的开源工具集,主要用于多语言环境下的软件国际化(i18n)和本地化(l10n)。它提供了一种方便的方式来管理和翻译软件中的字符串,使得开发者可以轻松地将他们的应用移植到不同的语言环境...

    gettext-static-0.19.8.1

    `gettext`工具提供了一套完整的解决方案,使得开发者能够方便地管理和更新软件的多语言版本。以下将详细介绍`gettext`工具的主要功能和使用方法: 1. **资源字符串提取**:`xgettext`是`gettext`工具的一部分,它...

    C语言程序的国际化:策略、工具与实践

    本文详细介绍了C语言程序国际化的策略、工具和实践,并通过示例代码展示了如何使用gettext库进行消息翻译和处理文化习俗。通过这些方法,开发者可以构建出能够支持多语言和文化差异的C语言程序,满足全球用户的需求...

Global site tag (gtag.js) - Google Analytics