php gettext 实现多语言

作者: jaclon 分类: PHP 发布时间: 2011-01-28 10:01 ė 6没有评论

1.安装gettext

windows用户直接修改php.ini,开启php_gettext.dll扩展

ubuntu用户使用命令:sudo apt-get install php-gettext

centos用户如果编译安装php的时候没有使用–with-gettext参数,则有需要使用phpize编译安装gettext
进入php源码包,如 cd /usr/local/src/php/ext/gettext
执行phpize //运行后此目录下多出了一此configure文件
执行make && make install
按提示将生成的getext.so文件写入到php.ini中。如 extension=gettext.so;
重启apache,/etc/init.d/apache restart

2.配置语言环境

如果是debian系列的linux用户,注意查看本地语言支持,具体查看 /usr/share/i18n/SUPPORTED
例如:中文zh_CN.UTF-8
中文繁体zh_TW.UTF-8
英文en_US.UTF-8
如果没有相应语言,则安装它:suso apt-get locale-gen zh_CN.UTF-8

3.在php项目中使用gettext

在项目中创建语言包目录,例如:
简体中文:Locale/zh_CN/LC_MESSAGES
英文:Locale/en_US/LC_MESSAGES

语言包类:Locale.php

<?php
/**
 * Locale 语言包类
 * 系统语言包采用的是php-getext模块
 * # 如果模板使用的是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
 *  2.1 如果没有相应语言则相应安装之。方法:sudo apt-get locale-gen zh_CN.UTF-8
 *  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文件夹下面
 * @author administrator
 *
 */
class Locale
{
	/**
	 * _options 设置语言包的选项
	 * $this->_options['lang'] 应用程序使用什么语言包.php-gettext支持的所有语言都可以.
	 * 在ubuntu下使用sudo vim /usr/share/il8n/SUPPORTED 主要是utf8编码
	 * $this->_options['domain'] 生成的.mo文件的名字.一般是应用程序名
	 * @var array
	 * @access protected
	 */
	protected $_options;

	/**
	 * 构造函数
	 * 对象初始化是设置语言包的参数
	 * @param string $lang
	 * @access public
	 * @return void
	 */
	public function __construct($lang=null) {
		switch ( strtolower($lang) ) {
			case 'zh_tw':
				$this->_options = array('lang' => 'zh_TW.UTF8', 'domain' => 'test');
				break;
			case 'zh_cn':
				$this->_options = array('lang' => 'zh_TW.UTF8', 'domain' => 'test');
				break;
			case 'en':
				$this->_options = array('lang' => 'en_US.UTF8', 'domain' => 'test');
				break;
			case 'en_us':
				$this->_options = array('lang' => 'en_US.UTF8', 'domain' => 'test');
				break;
			case 'en_gb':
				$this->_options = array('lang' => 'en_US.UTF8', 'domain' => 'test');
				break;
			default:
				$this->_options = array('lang' => 'zh_TW.UTF8', 'domain' => 'test');
			break;
		}

		$this->setApplicationLocale();
	}

	/**
	 * 设置应用程序语言包的参数,放在$this->_options中
	 * @param mixed $options
	 * @return void
	 */
	public function setOptions($options) {
		if (!empty($options)) {
			foreach ($options as $key => $option) {
				$this->_options[$key] = $option;
			}
		}
	}

	/**
	 * 设置应用程序语言包
	 * @access public
	 * @return void
	 */
	public function setApplicationLocale() {
		putenv('LANG='.$this->_options['lang']);
		putenv('LANGUAGE='.$this->_options['lang']);
		setlocale(LC_ALL, $this->_options['lang']);
		bindtextdomain($this->_options['domain'], PROJECTDIR.'/locale/');
		textdomain($this->_options['domain']);
		bind_textdomain_codeset($this->_options['domain'], 'UTF-8');
	}

}

?>

使用方法:

$lang = 'zh_TW';
$locale = new Locale($lang);

本文出自 肥蕉博客@IT技术,热门话题,生活随笔,美图欣赏,转载时请注明出处及相应链接。

本文永久链接: http://www.bananawolf.com/html/2011/01/314.html

发表评论

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

*

Ɣ回顶部