浏览 1844 次
锁定老帖子 主题:关于网站多语言机制的实现的原型demo
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-21
先发个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 {} 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |