`

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

php 
阅读更多

先发个demo .....

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

 

配置选项如下:

'i18n_multi_languages' => array(
		'enabled' => true , // 指示是否启用多语言支持	
		'writer' => 'Core_Helper_Translate',
		
		'Core_Helper_Translate' => array(
			'file_dir' => APPPATH . '/lang',
			'default' => 'zh_cn',
		),
	),
 

 

 

<?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 支持
 * 
 * 开发者不应直接构造此类的实例对象,应该使用 Core_App::$defaultMultiLanguages 来引用此对象
 *  
 * 构造函数的参数数组中必须带着键: file_dir | default
 * 
 * 所有的语言文件必须满足以下条件:
 * 1. UTF-8编码
 * 2. 标准的 ini 文件格式
 * 3. 以 .dc.ini 结尾
 * 4. 内容按如下标记
 * 
 * <code> 
 * [meta]
 * description = 文件说明
 *	
 * [trans]
 * 
 * </code>
 * 
 * @package core.helper
 * @author 色色
 */
class Core_Helper_Translate {

	/**
	 * 当前语言指示标识
	 * 
	 * @var string
	 */
	private static $queryLangAccessor = '--core:lang:d--';
	
	private static $hasConstruct = false;
		
	/**
	 * 数据字典
	 *
	 * @var array
	 */
	private $dc = array();	
	
	function __construct(array $d){
		
		if (self::$hasConstruct){
			throw new Core_Helper_Translate_Exception("系统中仅允许 一个 Core_Helper_Translate 实例对象");
		}
		self::$hasConstruct = true;
		
		$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(){
		$this->dcNoget = false;
		
		$cache_id = self::$queryLangAccessor;
		$cache_vcid = self::$queryLangAccessor . 'vc';
		
		$dcFiles = $this->getDcFiles();
		if (empty($dcFiles)) {
			Core_App::$defaultCacheWriter->remove($cache_id);
			Core_App::$defaultCacheWriter->remove($cache_vcid);
			return;
		}
		
		$last_vc = Core_App::$defaultCacheWriter->get($cache_vcid);
		
		$new_vc = Core_App::$currentTimeStamp;		
		foreach ($dcFiles as $file){
			$new_vc .= filemtime($file);
		}
		
		if ($last_vc == $new_vc){
			$data = Core_App::$defaultCacheWriter->get($cache_id);
			if (!empty($data)){
				$this->dc = json_decode($data,true);
			} 
			unset($data);
			return ;
		}
		
		$data = array();
		foreach ($dcFiles as $file){
			$d = parse_ini_file($file,true);
			if (is_array($d) && isset($d['trans']) && is_array($d['trans'])){
				$data = array_merge($data,$d['trans']);
			}
			unset($d);
		}
		
		$this->dc = $data;
		
		Core_App::$defaultCacheWriter->set($cache_vcid,$new_vc);
		Core_App::$defaultCacheWriter->set($cache_id,json_encode($data));
	}
	
	/**
	 * 获取 字典文件列表
	 *
	 * @return array
	 */
	function getDcFiles(){
		return glob("{$this->dcDir}/{$this->currentLang}/*.dc.ini");
	}
	
	/**
	 * 获取 字典文件信息列表
	 * 
	 * array(
	 * 		'文件路径' => '文件描述'
	 * )
	 *
	 * @return array
	 */
	function getDcFilesInfo(){
		$dcFiles = $this->getDcFiles();
		$data = array();
		
		foreach ($dcFiles as $file){
			$d = parse_ini_file($file,true);
			$meta = Core_AppUtils::val($d,'meta',array());
			
			$data[$file] = Core_AppUtils::val($meta,'description','');
			
			unset($meta);
			unset($d);
		}
		
		unset($dcFiles);
		
		return $data;
	}
	
	/**
	 * 检测语言支持情况
	 *
	 * @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);
	}
	
	/**
	 * 切换访问者语言环境
	 * 
	 * 如果指定的语言不被支持 将抛出 Core_Helper_Translate_Exception 异常
	 *
	 * @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 {}
 
分享到:
评论

相关推荐

    html多语言切换demo 多语言翻译 js多语言插件

    在前端开发中,实现网页的多语言支持...它适合快速原型开发和小型项目,让开发者可以快速为网站添加多语言支持。同时,这个例子也展示了如何手动管理语言资源和响应用户语言选择,对于学习前端多语言处理是很有帮助的。

    web前端demo

    【web前端demo】是一个关于前端开发的示例项目,它主要展示了如何构建一个简单的博客网站。这个demo旨在帮助初学者理解和实践Web前端开发的基本技术,同时也适用于有一定经验的开发者进行快速原型设计。在这个项目中...

    app demo

    下面我们将深入探讨与“app demo”相关的多个知识点。 一、应用程序开发 1. 开发环境:创建app demo需要集成开发环境(IDE),如Android Studio或Xcode,它们提供了编写代码、调试和测试应用的平台。 2. 编程语言:...

    demo-源码.rar

    综上所述,"demo-源码.rar"(或"demo-源码.zip")是一个潜在的学习资源,包含了关于源代码管理、编程语言、软件架构和开发流程等多个方面的知识。无论是对新手还是经验丰富的开发者,都能从中受益。不过,要充分利用...

    meituan-website-demo-master.rar

    【标题】"meituan-website-demo-master.rar"是一个压缩包文件,其中包含了仿照美团网站设计的源代码。这个项目可能是某位开发者或学生在期末时完成的,现在他愿意分享出来帮助其他有需要的人。 【描述】描述中提到...

    blog_demo

    博客演示(Blog Demo)是一个常见的在线平台,用于展示博客文章、功能和技术实现。在这个特定的“blog_demo”项目中,我们可以假设它是一个用于测试、学习或教学目的的博客系统实例。这个压缩包可能包含了实现这样一...

    Django_SNS:基于Django框架的内容社区类网站原型,实现多用户,内容的发布、评论、喜欢,消息传递,Feed流,标签分类等内容社区类网站通用功能

    Django SNS的灵感来自于,OSF是一个的开放、自由、分享的内容社区类网站原型。拥有绝大多数的社交类网站、内容分享类、社区类、兴趣垂直类网站共同的特性,如多用户,内容的发布、评论、喜欢,消息传递,Feed流,...

    8个静态网页模版

    在IT行业中,静态网页模板是开发人员常用的工具,尤其对于快速构建原型或小型Web应用程序非常有用。本资源提供了8个不同的静态网页模板,涵盖了后台和前台设计,适用于创建普通的Web演示项目。这些模板通常包括HTML...

    Website-Demo-:演示网站

    HTML(HyperText Markup Language)是构建网页的标准标记语言,它定义了网页的结构和内容。...这样的项目对于初学者来说是学习网页开发的好起点,而对于有经验的开发者来说,也是一个快速创建原型或演示功能的工具。

    网站后台管理

    了解需求分析、原型设计、编码、测试、部署和后期维护整个过程对于成为一个全面的网站开发者非常重要。 7. **学习资源**:“网站学习论坛-从学习计划开始,逐步深入,适合初学者的学习论坛.url”可能是提供学习资料...

    网站网页源码模板 (14).zip

    总的来说,这个压缩包提供了一套完整的网站模板,涵盖了网页设计的基础和进阶元素,适用于初学者学习网页开发,或者专业人士快速构建原型或网站。通过深入理解和修改这些源码,我们可以了解到网页开发的实际流程,...

    web 输入搜索提示

    - **多语言支持**:对于多语言网站,需要处理不同语言的自动补全。 7. **注意事项**: - 安全性:防止XSS攻击,对用户输入进行过滤和转义。 - 可访问性:确保自动补全功能对屏幕阅读器和其他辅助技术友好。 ...

    2023年最新WordPress主题:arangi_V2.0.2.zip

    7. **多语言支持** - 支持WPML,便于创建多语言网站,拓展全球市场。 8. **自定义选项** - 丰富的自定义选项允许用户根据品牌风格调整配色、字体等元素。 **文档与许可** “documentation”文件夹中包含了Arangi...

    网页模板(3个完整的)!!

    网页模板是用于快速构建网站页面的设计框架,它们通常包含了HTML、CSS和JavaScript代码,以便开发者可以轻松地定制和实现自己的网站设计。在这个压缩包中,提供了三个完整的网页模板,这将极大地节省开发者的时间和...

    demo:即将推出 foodween.com 模板

    JavaScript 是一种解释型的、基于原型的、多范式的编程语言,它允许开发者在客户端实现复杂的网页交互逻辑。在 foodween.com 模板中,JavaScript 可能被用于以下几个方面: 1. **DOM 操作**:通过 Document Object ...

    Investor-demo:GITHUB上的演示运动

    【标题】"Investor-demo:GITHUB上的演示运动"揭示了一个与投资相关的项目,它可能是一个Web应用或网站的示例,旨在展示投资理念、策略或工具。在GITHUB上,这样的项目通常由开发者分享,以吸引潜在投资者、合作伙伴...

    crud-php-demo:非常简单的php crud应用程序,可以对PostgreSQL数据库执行最常见的操作

    PHP是一种广泛使用的开源脚本语言,特别适合于Web开发,并可嵌入到HTML中,常用于构建动态网站和服务器端的数据处理。 【文件结构分析】: 由于仅给出了压缩包的一个主要文件夹名"crud-php-demo-main",我们可以...

    大气宽屏html5响应式旅游定制服务平台

    3. JavaScript: 作为客户端的主要脚本语言,JavaScript负责实现动态效果、表单验证、以及在无后台的情况下处理用户交互。 4. 响应式设计原理: 包括流式布局、弹性图片、媒体查询等技术,确保网站在不同设备上都能...

    fengmiDemo.zip

    "Demo"通常指的是演示版本,意味着这个压缩包可能包含了一个软件的试用版、一个应用的原型或者是一组用于展示特定功能的代码或数据。 【标签】由于没有给出具体的标签,我们无法确定此压缩包的具体内容。标签通常...

    Web:前端入门到进阶,个人完整的前端学习笔记。详细的图文和代码,完整的Demo演示。持续更新.....

    在当今数字化的世界中,Web前端开发扮演着至关重要的角色,它连接了用户与网站之间的桥梁。本文将深入探讨前端开发的基础概念,关键技术,以及如何通过个人学习笔记和实际项目来提升技能。我们将重点关注Node.js、...

Global site tag (gtag.js) - Google Analytics