MVC项目中英文转换
我们在做网站开发时,不可避免会遇到网站需要中英双语言的情况,下面我讲大致写一下常规的处理办法。
1. 双语言时,我们需要自己去注册一个语言处理的组件,这里用的是IhttpModule,先贴上自定义的CultureAwareHttpModule 语言处理组件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class CultureAwareHttpModule : IHttpModule 2 { 3 private CultureInfo currentCulture; 4 private CultureInfo currentUICulture; 5 List<string> langs = new List<string>(); 6 7 public void Dispose() { } 8 9 /// <summary> 10 /// 初始化 11 /// </summary> 12 /// <param name="context"></param> 13 public void Init(HttpApplication context) 14 { 15 context.BeginRequest += context_BeginRequest; 16 context.EndRequest += RecoverCulture; 17 18 langs.Add("zh"); 19 langs.Add("zh-cn"); 20 langs.Add("en"); 21 langs.Add("en-us"); 22 } 23 24 /// <summary> 25 /// 开始请求事件 26 /// </summary> 27 /// <param name="sender"></param> 28 /// <param name="e"></param> 29 void context_BeginRequest(object sender, EventArgs e) 30 { 31 currentCulture = Thread.CurrentThread.CurrentCulture; 32 currentUICulture = Thread.CurrentThread.CurrentUICulture; 33 34 HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current); 35 RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper); 36 object culture; 37 38 if (routeData != null) 39 { 40 if (routeData.Values.TryGetValue("culture", out culture)) 41 { 42 if (string.IsNullOrEmpty(culture.ToString())) 43 return; 44 try 45 { 46 Thread.CurrentThread.CurrentCulture = new CultureInfo(culture.ToString()); 47 Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture.ToString()); 48 } 49 catch 50 { 51 52 } 53 } 54 } 55 } 56 57 /// <summary> 58 /// 59 /// </summary> 60 /// <param name="sender"></param> 61 /// <param name="args"></param> 62 private void RecoverCulture(object sender, EventArgs args) 63 { 64 Thread.CurrentThread.CurrentCulture = currentCulture ?? new CultureInfo("zh-cn"); 65 Thread.CurrentThread.CurrentUICulture = currentUICulture ?? new CultureInfo("zh-cn"); 66 } 67 }
自定义组件封装完毕后,我们要把注册的组件注入Asp.Net的生命周期中,在web.config中 的<system.webServer> 节点内配置即可(此处要注意,Modules节点只能有一个,不能重复定义)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <modules> 2 <add name="CultureAwareHttpModule" type="Simple.Core.HttpMoudle.CultureAwareHttpModule"/> 3 </modules>
如此,自定义的语言处理组件注册完毕。
2. 修改路由,使路由能够匹配到语言类型(culture 可捕获到当前的语言类型,en-us/zh-cn)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 routes.MapUrl( 2 name: "Default", 3 url: "{culture}/{controller}/{action}/{id}", 4 defaults: new {culture="zh-cn", controller = "Home", action = "Index", id = UrlParameter.Optional } 5 );
3. 准备工作完成后,添加 资源文件(*.resx)类型的,这里我们重命名为 Lang.resx, Lang.en-US.resx两个文件。这里面可以填写中英文对照的键值对信息(两个文件键必须一一对应),添加如下图所示
在视图中,我们可以进行测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // C#代码: 获取当前的controller和Action 2 var controllName = Request.RequestContext.RouteData.Values["controller"].ToString(); 3 var actionName = Request.RequestContext.RouteData.Values["action"].ToString(); 4 5 //改变语言选择 6 <div style="text-align: right;"> 7 <a href="@Url.Action(actionName, controllName, new { culture ="en-us"})">English</a> 8 <a href="@Url.Action(actionName, controllName, new { culture ="zh-cn"})">中文简体</a> 9 </div>
如此,大功告成,快点将项目转换成中英双语言的吧。
PS: 如此只能将html中显示的内容进行中英文切换,但是js中怎么办呢?后边我会更新js中中英文的解决方案。
加油!加油!