ASP.NET MVC5+EF6+EasyUI 後臺管理系統(30)-本地化(多語言)

原文連接:http://www.javashuo.com/article/p-qdidpqda-cu.htmlhtml

系列目錄web

咱們的系統有時要擴展到其餘國家,或者地區,須要更多的語言環境,微軟提供了一些解決方案,原始咱們是用js來控制的,如今不須要了。編程

咱們只要建立簡單的資源文件,經過MVC的路由設置就能夠輕鬆的進行語言中的切換。mvc

本節受益於:Asp.net MVC3 高級編程第121頁。你們能夠自行百度這本書,這應該是國內第一本中文版的MVC3.0教程app

如今從項目入手吧(本節也適合其餘MVC程序),新建一個語言項目來放資源文件。ide

1、新建App.Lang,同時新建BaseRes.resx和BaseRes.en.resx或者其餘國語言spa

分別是中文,英文。並引用System.Web類庫i.net

2、處理通信,配置App.Admin web.config,讓這個類生效3d

在App.Admin中的Core文件夾添加CultureAwareHttpModule文件並繼承IHttpModulecode

複製代碼
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 (VS2012 版本配置如下, VS2010的MVC4版本配置同MVC3.0)

<system.webServer>
<modules>
<add name="CultureAwareHttpModule" type="App.Admin.CultureAwareHttpModule,App.Admin"/>
</modules>

</system.webServer>

紅色部分在system.web節點內,type包含的是命名空間

3、註冊路由

打開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/等

4、將要本地化的項目引用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'
相關文章
相關標籤/搜索