一起谈.NET技术,MVC2.0本地化(另类解决方案)<上>

  前不久看见一篇文章:在asp.net中使用Response.Filter 过滤网站敏感字符的解决方案。于是我借题发挥用Response.Filter 为MVC2.0 进行多国语言本地化。如果存在不足的地方,希望您指出。

  本文主要给出具体思路,希望能给读者带来一定的启发:日常开发中不是所有的方案要中规中矩用常用方法解决问题。比如本文的本地化就不用resource文件来处理。

  具体步骤:

  一、建立自定义的LocalizationHandler类

  LocalizationHandler 继承System.IO.Stream类 ,LocalizationHandler实例化后赋值给Response.Filter。这里主要通过Response.Filter来本地化MVC2.0程序。具体的Response.Filter 用法请参看MSDN.代码如下:

 public class LocalizationHandler : Stream
    {
        private Stream responseStream;
        public LocalizationHandler(Stream inputStream)
        {
            responseStream = inputStream;
        }
        public override bool CanRead
        {
            get { return true; }
        }
        public override bool CanSeek
        {
            get { return true; }
        }
        public override bool CanWrite
        {
            get { return true; }
        }
        public override void Flush()
        {
            responseStream.Flush();
        }
        public override long Length
        {
            get { return 0; }
        }
        long postion;
        public override long Position
        {
            get
            {
                return postion;
            }
            set
            {
                postion = value;
            }
        }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return responseStream.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return responseStream.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            responseStream.SetLength(value);
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            string sBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
            string pattern = @"(|)=(.*?)(|)";//正则替换类似页面格式为这样的字符串如:=OtherContent
            sBuffer = Regex.Replace(sBuffer, pattern, delegate(Match c)
            {
                return ReadLocalizationResource().FirstOrDefault(d = d.Key == c.Groups[2].Value).Value;
            });
            ReadLocalizationResource();
            byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(sBuffer);
            responseStream.Write(data, 0, data.Length);
        }
        ObjectCache cache = MemoryCache.Default;
        private Dictionarystring, string ReadLocalizationResource()
        {
            string _XMLPath = "";
            Dictionarystring, string cacheData = null;
            if (cacheData != null)
            {
                return cacheData;
            }
            Dictionarystring, string cachedData = new Dictionarystring, string();
            string serverPath = System.Web.HttpContext.Current.Server.MapPath("~");
            _XMLPath = Path.Combine(serverPath, "LocalizationResource.xml");
            //建立缓存(使用.net4.0最新缓存机制:System.Runtime.Caching;)
            if (cache["myCache"] == null)
            {
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.SlidingExpiration = TimeSpan.FromMinutes(60);
                policy.ChangeMonitors.Add(new HostFileChangeMonitor(new Liststring { _XMLPath }));
                var items = XElement.Load(_XMLPath).Elements("Module").Elements("item");
                foreach (var item in items)
                {
                    string key = item.Attribute("name").Value;
                    string value = item.Value;
                    cachedData.Add(key, value);
                }
                cache.Set("myCache", cachedData, policy);
                return cachedData;
            }
            return (Dictionarystring, string)cache["myCache"];
        }
    }

  代码中的65行开始,是本地化核心代码,在这里我们用正则匹配文本。用.NET4.0 System.Runtime.Caching;(尝鲜)缓存机制提高程序执行效率。

  二、修改global.asax文件

  在global.asax中加入以下代码:

protected void Application_BeginRequest(Object sender, EventArgs e)
        {
            Response.Filter = new LocalizationHandler(Response.Filter);
        }

  三、建立自定义的XML本地化资源文件

  截图如下:

  OK,一切准备就绪,我们在不用Response.Filter 过滤的情况下,运行截图如下:

  使用上文中Response.Filter过滤后:

  结果将第三点中的XML作为传统的资源文件后本地化了MVC View 页面。

  四、小结

  本文用另外一套方案解决了MVC2.0程序的本地化问题,也适用于asp.net webform。同时本文还存在很多不足的地方,比如后台异步的JSON格式本地化、用户自定义本地化语言等将会在MVC2.0本地化(另类解决方案)下 文中得到完善。

  希望本篇文章可以给您带来帮助,如有不足之处欢迎指出,谢谢!

  相关文章:MVC2.0本地化(另类解决方案)<下>

时间: 2024-07-30 01:16:06

一起谈.NET技术,MVC2.0本地化(另类解决方案)<上>的相关文章

一起谈.NET技术,MVC2.0本地化(另类解决方案)<下>

本文是对MVC2.0本地化(另类解决方案)上这篇文章内介绍的MVC2.0本地化功能进行加强.细化的结尾篇.如果存在不足的地方,希望您指出. 如何对上篇文章进行加强以及细化呢?主要从以下三点开始. 1.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言. 2.多语言加入,类似resource文件,可以有多个语言资源库. 3.全局本地化,可以本地化非页面内容,比如为台异步到前台的json数据本地化等. 主要步骤如下: 一.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言 这个实现思路为

MVC2.0本地化(另类解决方案)&“.NET研究”lt;下>

本文是对MVC2.0本地化(另类解决方案)上这篇文章内介绍的MVC2.0本地化功能进行加强.细化的结尾篇.如果存在不足的地方,希望您指出. 如何对上篇文章进行加强以及细化呢?主要从以下三点开始. 1.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言. 2.多语言加入,类似resource文件,可以有多个语言资源库. 3.全局本地化,可以本地化非页面内容,比如为台异步到前台的json数据本地化等. 主要步骤如下: 一.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言 这个实现思路为

MVC2.0本地化(另类解决方案)

本文是对MVC2.0本地化(另类解决方案)上这篇文章内介绍的MVC2.0本地化功能进行加强.细化的结尾篇.如果存在不足的地方,希望您指出. 如何对上篇文章进行加强以及细化呢?主要从以下三点开始. 1.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言. 2.多语言加入,类似resource文件,可以有多个语言资源库. 3.全局本地化,可以本地化非页面内容,比如为台异步到前台的json数据本地化等. 主要步骤如下: 一.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言 这个实现思路为

一起谈.NET技术,Silverlight的多线程能力(上)

对于多线程其实一直以来都存在很多误区:比如多任务与多线程就很容易被混为一谈,而多线程也常被理所应当的认为是并行等等.而事实却是:多任务≠多线程.单任务≠单线程.多线程不一定并行,多线程与性能不成线性关系等等,其中道理在这里不再详述.笔者认为Silverlight多线程主要作用不是在于提高性能,而是在于用户体验,其根本目的是解决用户体验中的响应速度,减少单线程带来的阻塞问题.用一个贴切的例子来形容单线程和多线程的区别:单线程就好像只有一个服务窗口卖票的车站,人们排队买票时都是单线程处理的,而且不能

一起谈.NET技术,.NET企业级架构解决方案:业务层

引言 Martin Fowler说过:"任何人都可以写出计算机才能理解的代码,只有写出人能理解的代码的程序员才是好程序员." 每一个复杂的软件都应该按层来组织.每一层代表系统的一个逻辑部件.尤其是,业务层的模块包括了所有使得系统运行的时候和其它层交互所需要的功能算法和计算,其他层包括数据访问层DAL和表现层. 业务层是任何分层系统的神经中心,包含了大部分的核心逻辑.因为这个原因,它也经常被叫做:业务逻辑层BLL. 正文 1.业务逻辑层是什么 抽象的讲,业务逻辑层是系统的一部分,用来处理

一起谈.NET技术,ASP.NET MVC 入门介绍 (上)

参考文章 ASP.NET MVC Overview. 1. MVC模式 MVC模式是一种软件架构模式.它把软件系统分为三个部分:模型(Model),视图(View)和控制器(Controller).MVC模式最早由Trygve Reenskaug在1974年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式.MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,

一起谈.NET技术,WPF/Silverlight深度解决方案:目录

介于目前WPF/Silverlight技术资料在国内相当稀缺,仅有的也是一些很基础的教程.为了更深度的剖析WPF/Silverlight的技术内涵,解决开发过程中的疑难杂症,分解实际应用案例的特色细节,"WPF/Silverlight深度解决方案"系列由此孕育而生.整个系列的所有文章均为原创,由本人的个人开发经验结合相关资料编写而成,过程中难免有错漏或不妥当的地方还望各位读者友善的指出.我们的目标只有一个:WPF/Silverlight技术深度挖掘.如果您有符合本系列主题的内容想要与大

一起谈.NET技术,参数编码 完全解决方案

参数编码规范 一.摘要 我们经常要在页面传递中文数据,但是往往被文字编码所困惑.有时不了解到底是浏览器编码问题还是服务器编码问题.本文分析了互联网传递数据的编码原理, 并且提出了完善易用的解决方案. 二.原则 避免在get或者post参数时直接传递中文字符.中文参数需要经过编码后再传递.服务器端要使用相同的编码格式进行解码 三.错误观点 1.很多程序员认为url中可以传递中文.  url中并不能携带中文参数.如果我们在浏览器中输入"http://localhost/?a=中文",感觉上

一起谈.NET技术,Flex 数据访问 WebService (上)

Flex 支持格式设置为 SOAP 消息且通过 HTTP 传输的 Web 服务请求和结果.SOAP 提供基于 XML 格式的定义,用于在 Web 服务客户端(如使用 Flex 构建的应用程序)和 Web 服务之间交换结构化和类型化信息. 在.NET和Flex的数据交互可以通过Web Services访问string,object,datatable,List<>,ArrayList等. .NET和Flex的数据示例: 1.返回对象 定义返回对象的Web Method: [WebMethod]p