论坛首页 编程语言技术论坛

关于网站多语言机制的实现的原型demo

浏览 1844 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-21  
PHP

先发个demo .....

需求 能够在前台下载 语言文件进行编辑再上传 ....

 

 

 

<?php
/**
 * 多语言翻译函数
 *
 * @return string 消息内容
 */
function __()
{
	$args = func_get_args();
	if (is_object(Core_App::$defaultMultiLanguages)){
		$msgid = array_shift($args);
	    return Core_App::$defaultMultiLanguages->translate($msgid,$args);
	}
	return call_user_func_array('sprintf', $args);
}

/**
 * Core_Helper_Translate类 提供多语言翻译支持
 * 
 * 依赖 session 支持
 *  
 * 构造函数的参数数组中必须带着键: file_dir | default
 * 
 * 所有的语言文件必须满足以下条件:
 * 1. UTF-8编码
 * 2. 标准的 ini 文件格式
 * 3. 以 .dc.ini 结尾
 * 
 * @package core.helper
 * @author 色色
 */
class Core_Helper_Translate {

	/**
	 * 当前语言指示标识
	 * 
	 * @var string
	 */
	private static $queryLangAccessor = '--c:lang:d--';
		
	/**
	 * 数据字典
	 *
	 * @var array
	 */
	private $dc = array();	
	
	function __construct(array $d){
		$this->dcDir = $d['file_dir'];
		$this->defaultLang = $d['default'];
		
		$this->currentLang = Core_App::$defaultSessionWriter->get(self::$queryLangAccessor,null);
		
		if (empty($this->currentLang)){
			$this->currentLang = $this->defaultLang;
		}
		$this->changeLanguage($this->currentLang,false);
		$this->dcNoget = true;// 数据字典是否被加载,用于懒惰加载
	}
	
	/**
	 * 导入翻译文件
	 *
	 * 对 多个翻译文件进行合并,并将结果进行缓存
	 * 如果翻译文件被修改,则自动同步缓存
	 * 
	 */
	private function dcImport(){
//		$dcFile = "{$this->dcDir}/{$this->currentLang}.dc.php";
//		if (is_file($dcFile) && is_readable($dcFile)){
//			
//			$this->dc = require($dcFile);
//			
//			if (is_array($this->dc)) return;
//			
//			throw new Core_Exception_TypeMismatch("字典文件{$dcFile}返回的数据",'array',gettype($this->dc));
//		}
//		throw new Core_Exception_ExpectedFile($dcFile);
	}
	
	/**
	 * 获取 字典文件信息列表
	 *
	 * @return array
	 */
	function getDcFiles(){
		return glob("{$this->dcDir}/{$this->currentLang}/*.dc.ini");
	}
	
	/**
	 * 检测语言支持情况
	 *
	 * @param string $lang
	 * @param bool $throw
	 * 
	 * @return bool
	 */
	private function checkSupport($lang,$throw=false){
		
		$lang_dir = "{$this->dcDir}/{$lang}";
		if (is_dir($lang_dir) && is_readable($lang_dir)){
			return true;
		}
		if ($throw){
			throw new Core_Helper_Translate_Exception("指定语言'{$lang}'并不被支持: ($lang_dir) 非有效目录");
		}
		return false;
	}
	
	/**
	 * 翻译消息
	 *
	 * @param string $msgid
	 * @param array $args
	 * 
	 * @return string 消息内容
	 */
	function translate($msgid,array $args){
		if ($this->dcNoget) $this->dcImport();
		
		if (isset($this->dc[$msgid]))
	    {
	        $msgid = $this->dc[$msgid];
	    }
	    array_unshift($args, $msgid);
    	return call_user_func_array('sprintf', $args);
	}
	
	/**
	 * 切换访问者语言环境设置
	 *
	 * @param string $lang 要切换的语言
	 * @param bool $reload 是否立即重新加载语言文件
	 */
	function changeLanguage($lang, $reload=false){
		if ($this->checkSupport($lang,true)){
			
			$this->currentLang = $lang;
			Core_App::$defaultSessionWriter->set(self::$queryLangAccessor,$lang);
			
			if ($reload){
				$this->dcImport();
			}
			
		}
	}
	
}

class Core_Helper_Translate_Exception extends Exception {}
 
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics