我們的系統有時要擴展到其他國家,或者地區,需要更多的語言環境,微軟提供了一些解決方案,原始我們是用js來控制的,現在不需要了。
我們只要創建簡單的資源文件,通過MVC的路由設置就可以輕松的進行語言中的切換。
本節受益於:Asp.net MVC3 高級編程第121頁。大家可以自行百度這本書,這應該是國內第一本中文版的MVC3.0教程
現在從項目入手吧(本節也適合其他MVC程序),新建一個語言項目來放資源文件。
一、新建App.Lang,同時新建BaseRes.resx和BaseRes.en.resx或者其他國語言
分別是中文,英文。並引用System.Web類庫i
二、處理通訊,配置App.Admin web.config,讓這個類生效
在App.Admin中的Core文件夾添加CultureAwareHttpModule文件並繼承IHttpModule

using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web; using System.Web.Routing; namespace App.Admin { public class CultureAwareHttpModule : IHttpModule { private CultureInfo currentCulture; private CultureInfo currentUICulture; public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += SetCurrentCulture; context.EndRequest += RecoverCulture; } private void SetCurrentCulture(object sender, EventArgs args) { currentCulture = Thread.CurrentThread.CurrentCulture; currentUICulture = Thread.CurrentThread.CurrentUICulture; HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current); RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper); if (routeData == null) { return; } object culture; if (routeData.Values.TryGetValue("lang", out culture)) { try { Thread.CurrentThread.CurrentCulture = new CultureInfo(culture.ToString()); Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture.ToString()); } catch { } } } private void RecoverCulture(object sender, EventArgs args) { Thread.CurrentThread.CurrentCulture = currentCulture; Thread.CurrentThread.CurrentUICulture = currentUICulture; } } }
這里必須做個聲明:下面2段第一段支持MVC3,第二段支持MVC4
-----------------------老版本MVC3.0
<system.web>
<httpModules>
<add name="CultureAwareHttpModule" type=" App.Admin.CultureAwareHttpModule,App.Admin"/>
</httpModules>
</system.web>
-----------------------MVC4.0 以上
<system.webServer>
<modules>
<add name="CultureAwareHttpModule" type="App.Admin.CultureAwareHttpModule,App.Admin"/>
</modules>
</system.webServer>
紅色部分在system.web節點內,type包含的是命名空間
三、注冊路由
打開RouteConfig.cs,注冊為
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Globalization", // 路由名稱 "{lang}/{controller}/{action}/{id}", // 帶有參數的 URL new { lang = "zh", controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數默認值 new { lang = "^[a-zA-Z]{2}(-[a-zA-Z]{2})?$" } //參數約束 ); routes.MapRoute( "Default", // 路由名稱 "{controller}/{action}/{id}", // 帶有參數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值 ); }
路由執行有先后大家都懂的。可以看出最后我們的訪問會是這樣的
http://localhost:1201/(http://localhost:1201/zh),http://localhost:1201/等
四、將要本地化的項目引用App.Lang
回到Resx文件,打開Resx設置代碼為的訪問修飾符為public,並添加如下屬性,可以看出是鍵值對應
這里我們以SysSample的index視圖為例,回到index上修改如下代碼
先引入@using App.Lang;然后修改以下代碼
<div class="mvctool"> <input id="txtQuery" type="text" class="searchText" /> @Html.ToolButton("btnQuery", "icon-search",BaseRes.Query, perm, "Query", true) @Html.ToolButton("btnCreate", "icon-add", BaseRes.Create, perm, "Create", true) @Html.ToolButton("btnEdit", "icon-edit", BaseRes.Edit, perm, "Edit", true) @Html.ToolButton("btnDetails", "icon-details", BaseRes.Details, perm, "Details", true) @Html.ToolButton("btnDelete", "icon-remove", BaseRes.Delete, perm, "Delete", true) @Html.ToolButton("btnExport", "icon-export", BaseRes.Export, perm, "Export", true) </div>
其中的BaseRes.Query就是國際化屬性了
預覽一下例子(請注意我的URL地址變化)
現在你可以本地化您的項目了。最后一個聲明,如果你要獲取當然選中的是什么語言你必須在頁面引用
CultureInfo info = Thread.CurrentThread.CurrentCulture;
通過info.Name可以獲取到URL上選擇的zh或en
例:
src='/@info.Name/SysSample/Create'
結果
src='/en/SysSample/Create'