可以不使用微软的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    

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

原文地址:http://www.cnblogs.com/Benjamin/p/3544886.html

参考:http://www.cnblogs.com/cyq1162/p/3518519.html

转:asp.net mvc下的多语言方案 包含Html,Javascript和图片的更多相关文章

  1. asp.net mvc下的多语言方案 包含Html,Javascript和图片

    在网上查阅了众多方案,觉得路过秋天的方案 解耦性比较好,可以不使用微软的Resource文件,而是将所有的词汇放入在一个txt的词典之中,便于维护. 步骤如下: 1)在整个程序的入口处global.a ...

  2. ASP.NET MVC下使用AngularJs语言(六):获取下拉列表的value和Text

    前面Insus.NET有在Angularjs实现DropDownList的下拉列表的功能.但是没有实现怎样获取下拉列表的value和text功能. 下面分别使用ng-click和ng-change来实 ...

  3. ASP.NET MVC下使用AngularJs语言(五):ng-selected

    这次学习ng-selected语法,这个是为DropDownList下拉列表显示默认选项. 演示从下面步骤开始 1,新建一个model: 上面#14行代码的property,数据类型为bool.即是存 ...

  4. ASP.NET MVC下使用AngularJs语言(二):ng-click事件

    程序用户交互,用户使用mouse点击,这是一个普通的功能. 在angularjs的铵钮点击命令是ng-click. 创建Angularjs的app使用前一篇<ASP.NET MVC下使用Angu ...

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

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

  6. ASP.NET MVC下使用AngularJs语言(八):显示html

    在Angularjs显示html文本,如果按照一般处理它.它只能页中显示没经解释文本. 在ASP.NET MVC添加一个控制器: 创建angularjs控制器: pilotApp.controller ...

  7. ASP.NET MVC下使用AngularJs语言(七):Cookie的使用

    网站开发,使用Cookie对暂存数据进行读写,可以使用C#,javascript,jQuery,也可以使用angularjs等等来读写...... 本篇实现angularjs环境之下对Cookie时行 ...

  8. ASP.NET MVC下使用AngularJs语言(四):$window.alert

    判断文本框是否有填写,没有填写使用angularjs的$window.alert来提示用户. 创建一个ASP.NET MVC控制器: 接下来是准备一个angularjs的控制器: pilotApp.c ...

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

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

随机推荐

  1. mysql常用优化参数

    修改全站搜索 修改my.ini(my.cnf) ,在 [mysqld] 后面加入一行“ft_min_word_len=1”,然后 重启Mysql,再登录网站后台(模块管理->全站搜索)重建全文索 ...

  2. maven - 使用nexus 搭建maven私服

    1, java环境 [wenbronk@localhost nexus]$ java -version java version "1.8.0_121" Java(TM) SE R ...

  3. Python中的单例模式的几种实现方式的及优化

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  4. 深入出不来nodejs源码-timer模块(JS篇)

    鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单 ...

  5. .2-浅析webpack源码之打包后文件

    先不进源码,分析一下打包后的文件,来一张图: 首先创建两个JS文件,内容如下: // config.js module.exports = { entry: './input.js', output: ...

  6. Windows7下IIS+php配置教程 http://www.jb51.net/article/113812.htm

    这篇文章主要为大家详细介绍了Windows7下IIS+php配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WINDOWS 7 IIS+php配置教程,具体内容如下 打开 开始 -> ...

  7. [日常] Go语言圣经-文本和HTML模板习题

    Go语言圣经-文本和HTML模板 练习 4.14: 创建一个web服务器,查询一次GitHub,然后生成BUG报告.里程碑和对应的用户信息. 1.查看下文档godoc net/http |grep H ...

  8. 【C#数据结构系列】排序

    一:排序 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难.同样,存储在计算机中的数据的次序,对于处理这些数 ...

  9. php面向对象精要(1)

    1.静态属性与方法 每一个类的实例拥有自己的属性和方法,每一个类也可以包含静态属性,静态属性不属于类的任何实例,可以把静态属性理解成存储在类中的全局变量,可以在任何地方通过类名引用静态属性. < ...

  10. Wampserver配置与本地建站

    ☆根目录修改问题 /.修改运行根目录 1.修改apache配置,将服务请求定位到新目录下 →左击wampserver,点击Apache打开httpd.conf文件,Ctrl+f搜索documentro ...