ASP.NET MVC 多語言解決方案

來源:互聯網
上載者:User

    現在ASP.NET MVC 已經出了第四版了,現在多了很多特性,但是如何在 ASP.NET MVC 下方便的實現多語言特性呢?

就一個網站的多語言特性來說,我認為分為兩個方面:

1、HTML介面上顯示的文字需要多語言

2、HTML介面上JS輸出的文字需要多語言

原來在HTML部分直接寫的文字都不能直接寫要輸出的文字,而是要採用標記的方法來替換。JS也是同理。

那麼在MVC下怎麼能透明的實現多語言呢?所謂透明的實現是指,程式員在開發程式當中,不需要過多的考慮多語言的問題,直接調用一個方法就能實現多語言,而且所要用到的語言檔案每個語言一個檔案就夠了,集中翻譯這個語言就完成了多語言的功能。

例如
<html>

<head>

</head>

<body>

   多語言輸出的文字  //這裡就不能直接寫中文了,一個好方法是 直接用 <%= Html.Lang("string1") %> 來進行輸出

</body>

</html>

這裡<%= Html.Lang("clickme") %> 是對 HTMLHelper 進行了擴充,增加了一個 Lang 的方法,參數是需要翻譯的資源字串的Name。

 怎麼為 HTMLHelper 進行擴充?下面這個類就是增加了的擴充類

 

 

Code
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Globalization;

using System.Web.Compilation;
using System.Web.Mvc;
using System.Web.Routing;

namespace System.Web.Mvc {
    public static class LocalizationHelpers {
        /// <summary>
        /// 在外邊的 Html 中直接使用
        /// </summary>
        /// <param name="htmlhelper"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string Lang(this HtmlHelper htmlhelper, string key) {
            string FilePath = htmlhelper.ViewContext.HttpContext.Server.MapPath("/") + "Resource\\";
            return GetLangString(htmlhelper.ViewContext.HttpContext, key, FilePath);
        }
        /// <summary>
        /// 在外邊的 Html 中直接使用,對 JS 進行輸出字串
        /// </summary>
        /// <param name="htmlhelper"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string LangOutJsVar(this HtmlHelper htmlhelper, string key) {
            string FilePath = htmlhelper.ViewContext.HttpContext.Server.MapPath("/") + "Resource\\";
            string langstr = GetLangString(htmlhelper.ViewContext.HttpContext, key, FilePath);
            return string.Format("var {0} = '{1}'", key,langstr);
        }
        /// <summary>
        /// 在 C# 中使用
        /// </summary>
        /// <param name="httpContext"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string InnerLang(HttpContextBase httpContext, string key) {
            string FilePath = httpContext.Server.MapPath("/") + "Resource\\";
            return GetLangString(httpContext, key, FilePath);
        }

        private static string GetLangString(HttpContextBase httpContext, string key, string FilePath) {
            LangType langtype = LangType.cn;
            if (httpContext.Session["Lang"] != null) {
                langtype = (LangType)httpContext.Session["Lang"];
            }
            return LangResourceFileProvider.GetLangString(key, langtype, FilePath);
        }
    }

    public static class LangResourceFileProvider {
        public static string GetLangString(string Key, LangType langtype, string FilePath) {
            string filename;
            switch (langtype) {
                case LangType.cn: filename = "zh-cn.resources"; break;
                case LangType.en: filename = "en-us.resources"; break;
                default: filename = "zh-cn.resources"; break;
            }

            System.Resources.ResourceReader reader = new System.Resources.ResourceReader(FilePath + filename);

            string resourcetype;
            byte[] resourcedata;
            string result = string.Empty;

            try {
                reader.GetResourceData(Key, out resourcetype, out resourcedata);
                //去掉第一個位元組,無用
                byte[] arr = new byte[resourcedata.Length - 1];
                for (int i = 0; i < arr.Length; i++) {
                    arr[i] = resourcedata[i + 1];
                }
                result = System.Text.Encoding.UTF8.GetString(arr);

            }
            catch (Exception ex) {

            }
            finally {
                reader.Close();
            }

            return result;
        }
    }

    public enum LangType {
            cn,
            en
        }
}

 這個類叫 LocalizationHelpers ,公開了 Lang,LangOutJsVar,InnerLang 三個方法,其中 Lang,LangOutJsVar 可以在 Html 介面中直接調用,InnerLang 可以在C#後台使用。

這裡使用了 .resx 資源檔,注意這裡這個檔案需要被編譯後才能使用,否則找不到已經增加的項。編譯這個可以使用.NET 內建的 ResGen.exe。

上面這個類很簡單,就是根據傳入的 Session["Lang"] 中的語言類型來做判斷,該讀那個資源檔(資源檔必須在 Resource 目錄下),然後讀取所需要的NAME,返回對應的字串VALUE,VALUE中就是最後要輸出的文字了。

 

在前台的 .aspx 中就可以直接用  <%= Html.Lang("String1") %>來輸出了。至於JS的輸出,看下面例子

    <script language="javascript" type="text/javascript">
    <%= Html.LangOutJsVar("msg")%>
        function show()
        {
            alert(msg);
        }
    </script>

這樣就OK了。

如果有的需要在C#中取資源字串,那麼可以使用           

ViewData["Message"] = LocalizationHelpers.InnerLang(this.ControllerContext.HttpContext, "Welcome");來輸出。

我根據ASP.NET MVC 4做了個DEMO,如下


具體代碼點擊下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.