MVC项目中英文转换

  我们在做网站开发时,不可避免会遇到网站需要中英双语言的情况,下面我讲大致写一下常规的处理办法。

  1. 双语言时,我们需要自己去注册一个语言处理的组件,这里用的是IhttpModule,先贴上自定义的CultureAwareHttpModule 语言处理组件。

    
 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     }
View Code

    自定义组件封装完毕后,我们要把注册的组件注入Asp.Net的生命周期中,在web.config中 的<system.webServer> 节点内配置即可(此处要注意,Modules节点只能有一个,不能重复定义)。

    
1 <modules>
2       <add name="CultureAwareHttpModule" type="Simple.Core.HttpMoudle.CultureAwareHttpModule"/>
3     </modules>
View Code

       如此,自定义的语言处理组件注册完毕。

  2. 修改路由,使路由能够匹配到语言类型(culture 可捕获到当前的语言类型,en-us/zh-cn)

    
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             );
View Code

  3. 准备工作完成后,添加 资源文件(*.resx)类型的,这里我们重命名为 Lang.resx, Lang.en-US.resx两个文件。这里面可以填写中英文对照的键值对信息(两个文件键必须一一对应),添加如下图所示

     

    在视图中,我们可以进行测试:

    
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>
View Code

  如此,大功告成,快点将项目转换成中英双语言的吧。

  PS: 如此只能将html中显示的内容进行中英文切换,但是js中怎么办呢?后边我会更新js中中英文的解决方案。

  加油!加油!

 

 

 

 

   

  

posted @ 2015-05-19 00:07  ToBeStrong  阅读(758)  评论(1编辑  收藏  举报