在网上查阅了众多方案,觉得路过秋天的方案 解耦性比较好,可以不使用微软的Resource文件,而是将所有的词汇放入在一个txt的词典之中,便于维护。

步骤如下:

1)在整个程序的入口处global.asax.cs加入函数

 private void ReadDic(string dicFileName){var dicPath = Path.Combine(Server.MapPath("/File"), dicFileName);string dicStr;using (var fs = new StreamReader(dicPath, Encoding.UTF8)){dicStr = fs.ReadToEnd();}var englishDict = new Dictionary<string, string>();var chineseDict = new Dictionary<string, string>();var strs = dicStr.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);string[] temp;foreach (var str in strs){temp = str.Split('|');englishDict.Add(temp[0], temp[1]);chineseDict.Add(temp[0], temp[2]);}MyConst.chineseDictionary = chineseDict;MyConst.englishDictionary = englishDict;}

该函数的目的是将位于网站目录“File”下的词典文件,如dict.txt以键值对的形式读取到程序的内存之中,以便随时使用。

Dict.txt的内容形如:

Add|Add|增加
LearningInfo|Learning Info|学习资讯
NewColumn|New Column|新建栏目......

第一列为key,第二列为要显示的英文,第三列为要显示的中文。

2)通过cookie切换语言

在点击切换后,调用

switchLang(),相应的cultrueInfo分别为zh-CN和en-US.

相应的js代码为

function switchLang(cultureInfo) {deleteCookie("culture");addCookie("culture", cultureInfo, 720);//cookie持续一个月location.reload();
}
function addCookie(name, value, expiresHours) {var cookieString = name + "=" + escape(value);//判断是否设置过期时间 if (expiresHours > 0) {var date = new Date();date.setTime(date.getTime() + expiresHours * 3600 * 1000);cookieString = cookieString + "; expires=" + date.toGMTString() + ";  path=/";}document.cookie = cookieString;
}
function getCookie(name) {var strCookie = document.cookie;var arrCookie = strCookie.split("; ");for (var i = 0; i < arrCookie.length; i++) {var arr = arrCookie[i].split("=");if (arr[0] == name) return arr[1];}return "";
}function deleteCookie(name) {var date = new Date();date.setTime(date.getTime() - 10000);document.cookie = name + "=v; expires=" + date.toGMTString();
}

3)本方案的核心逻辑在于:首先获取到输出到浏览器渲染的html代码,用词典中对应的键使用正则表达式匹配html中相应的词,然后再将全部匹配到的词替换,最后再重新输出到浏览器。

于是改写Html代码

例如:本来纯中文的视图中会这么写:

<span>新建栏目</span>

现在改为:

<span>[#NewColumn#]</span>

AddColumn即为词典中对应的键。

4)设置了cookie,然后就可以在后台的Request中使用。然后,为了做到这一点,需要在输出时给控制器加一个切面——一个自定义的HtmlReplaceFilter特性。代码如下:

  public class ReplaceHtmlFilter : ActionFilterAttribute{public override void OnResultExecuted(ResultExecutedContext filterContext){if (filterContext.Result is ViewResult){string html = RenderViewToString(filterContext.Controller, ((ViewResult)filterContext.Result).View);var httpCookie = filterContext.HttpContext.Request.Cookies["culture"];if (httpCookie != null){var cookie = httpCookie.Value;html = Replace(html, cookie);}else{html = Replace(html, "zh-CN");}filterContext.HttpContext.Response.Clear();filterContext.HttpContext.Response.Write(html);}}private static string RenderViewToString(ControllerBase controller, IView view){using (var writer = new System.IO.StringWriter()){var viewContext = new ViewContext(controller.ControllerContext, view, controller.ViewData, controller.TempData, writer);viewContext.View.Render(viewContext, writer);return writer.ToString();}}/// <summary>/// 替换多语言。/// </summary>/// <param name="html"></param>/// <param name="lang"></param>/// <returns></returns>private string Replace(string html, string lang){MatchCollection matchs = Regex.Matches(html, @"\[#([\S\s]*?)#\]",RegexOptions.Compiled | RegexOptions.IgnoreCase);if (matchs != null && matchs.Count > 0){var keys = new List<string>(matchs.Count); //记录已匹配过的
Dictionary<string, string> dic = GetLanguageDic(lang);foreach (Match match in matchs){string text = match.Groups[0].Value;string key = match.Groups[1].Value.Trim();if (!keys.Contains(key)){keys.Add(key);if (dic.ContainsKey(key)){html = html.Replace(text, dic[key]);}}}keys = null;matchs = null;}return html;}private Dictionary<string, string> GetLanguageDic(string lang){if (lang == "zh-CN"){return MyConst.chineseDictionary;}else{return MyConst.englishDictionary;}}

将该Filter加在Controller上,至此,html的中英文切换即可实现。

5)Javascript中的多语言则需多做一步。

在视图文件中,加入类似如下的词典对象。

<script>var lang = {AllCourses:"[#AllCourses#]",AddCourseColumn:"[#AddCourseColumn#]",AtLeastOneRow: "[#AtLeastOneRow#]",DeleteSelected: "[#DeleteSelected#]",};</script>

注意,该词典的内容实现也需要添加在dict.txt文件中。

然后,在js代码中

原本为

alert("全部课程");

改为

alert(lang.AllCourses);

由于在输出视图时,所有形如[##]的文本都会被替换为字典里相应的语言,这样js就可以输出多语言了。

6)最后图片也是类似。

注意,图片要制作多语言版本的,即如果之前都是中文,那么要制作一套英文的图片。

然后在视图中,原本为

<img  src='btn1.png ' />

改为

<img  src='[#btn1#] ' />

字典中加入类似

btn1|cn\btn1.png|en\btn1.png    

即可起到图片的多语言切换作用。

转载于:https://www.cnblogs.com/Benjamin/p/3544886.html

asp.net mvc下的多语言方案 包含Html,Javascript和图片相关推荐

  1. ASP.NET MVC下使用AngularJs语言(一):Hello your name

    新春节后,分享第一个教程. 是教一位新朋友全新学习ASP.NET MVC下使用AngularJs语言. 一,新建一个空的Web项目.使用NuGet下载AngularJs和jQuery. 二,配置Bun ...

  2. ASP.NET MVC下使用AngularJs语言(三):ng-options

    今天使用angularjs的ng-options实现一个DropDownList下拉列表. 准备ASP.NET MVC的model: public class MobilePhone{public i ...

  3. ASP.NET MVC下的四种验证编程方式[续篇]

    ASP.NET MVC下的四种验证编程方式[续篇] 原文:ASP.NET MVC下的四种验证编程方式[续篇] 在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET ...

  4. ASP.NET MVC下基于异常处理的完整解决方案

    ASP.NET MVC下基于异常处理的完整解决方案 参考文章: (1)ASP.NET MVC下基于异常处理的完整解决方案 (2)https://www.cnblogs.com/artech/archi ...

  5. Response.End()在Webform和ASP.NET MVC下的表现差异

    前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...

  6. Pro ASP.NET MVC –第四章 语言特性精华

    C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...

  7. 在ASP.NET MVC下实现树形导航菜单

    在需要处理很多分类以及导航的时候,树形导航菜单就比较适合.例如在汽车之家上: 页面主要分两部分,左边是导航菜单,右边显示对应的内容.现在,我们就在ASP.NET MVC 4 下临摹一个,如下: 实现的 ...

  8. ASP.NET MVC下的异步Action的定义和执行原理

    Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我 ...

  9. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

最新文章

  1. Oracle12c多租户如何启动关闭CDB或PDB (PDB自动启动)
  2. jquery全选/取消全选(反选)/单选操作
  3. 混合精度训练-Pytorch
  4. 千层套路 - Vue 3.0 初始化源码探秘
  5. 会计电算化的重要物质基础计算机和,湖北工业大学工程技术学院会计电算化管理办法...
  6. 利用bladex+avue实现下拉数据源展示
  7. java学习(51):上转型对象
  8. 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
  9. valgrind 检查内存泄露
  10. 三星Galaxy S22售价曝光:国行可能4999元起
  11. 微软解释为什么 Rust 是系统编程的最佳选择
  12. pareto解是什么意思_Pareto是什么意思
  13. 前端笔记之JavaScript(十二)缓冲公式检测设备Data日期
  14. 【Hadoop环境搭建】Centos6.8搭建hadoop伪分布模式
  15. 在webconfig中写好连接后,在程序中如何调用?
  16. Python编程:从入门到实践
  17. iPhoneamp;iPad DFU及恢复模式刷机、降级教程
  18. idea 主题包下载以及改变字体大小
  19. word 大纲视图的生成
  20. 计算机切换桌面快捷方式,显示桌面快捷键,教您win10怎样快速切换到桌面

热门文章

  1. linux的共享端口,Gogs与Linux共享SSH22端口
  2. ISE中将Verilog封装为IP核的方法
  3. Setup 和Hold (建立时间和保持时间)解析
  4. CAN总线简明易懂教程(三)
  5. 将一个n元一维向量向左旋转i个位置。例如,当n = 8且i = 3时,向量abcdefgh旋转为defghabc
  6. f5 2017.09.03故障
  7. kerberos简单介绍
  8. 学习笔记-4.1用户管理命令
  9. 给SAP系统安装联机帮助(事务码SR13)
  10. the fair-sounding