MVC多語言應用


最近發現資源文件是個好東西, 用的好了可以給開發人員節約不少的時間. 例如做一個多語言的網站, 資源文件就有不小的用處.

這里以一個MVC4的項目為例, 簡單說一下過程:

1.資源文件的處理

首先准備資源文件, 即語言包. 為WebSite項目添加兩個resx文件, 如圖:

 

接着分別為這兩個文件添加內容(名稱/值),如圖:

 

資源文件第三步, 用命令行工具ResGen.exe將這兩個resx文件生成同名的resources文件, 如zh-CN.resourcesen-US.resources, 生成后將這兩個resources文件放到Resource目錄下.

關於ResGen.exe工具的詳細用法, 這里只給出命令行腳本, 不做介紹, 有興趣的可以去找相關資料.

resgen D:\Code\XNFans\XNWeb\App_LocalResources\zh-CN.resx D:\Code\XNFans\Resources\zh-CN.resources
resgen D:\Code\XNFans\XNWeb\App_LocalResources\en-US.resx D:\Code\XNFans\Resources\en-US.resources

至此,資源文件(語言包)就做好啦,下面就是在項目中的使用了。

2.后端代碼

為實現動態切換語言, 要在Global.asax文件中添加Application_AcquireRequestState事件, 如下:

 

protected void Application_AcquireRequestState(object sender,EventArgs e)
        {
            if (HttpContext.Current.Session != null)
            {
                CultureInfo ci = (CultureInfo)this.Session["CurrentLanguage"];
                if (ci == null)
                {
                    ci = new CultureInfo("zh-CN");
                    this.Session["CurrentLanguage"] = ci;
                }
                Thread.CurrentThread.CurrentUICulture = ci;
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
            }
        }

 

要應用的控制器中添加ChangeLanguage方法, 如下:

/// <summary>
        /// 切換語言
        /// </summary>
        /// <param name="lang"></param>
        /// <returns></returns>
        public JsonpResult ChangeLanguage(string lang)
        {
            int data = 1;
            try
            {
                Session["CurrentLanguage"] = new CultureInfo(lang);
            }
            catch (Exception ex)
            {
                data = 0;
            }

            JsonpResult result = new JsonpResult()
            {
                Data = data,
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };

            return result;

        }

切換語言時調用ChangeLanguage方法, 傳入對應的語言版本標識就可以了.

3.前端應用

<div id="head-text">
    <h1 class="general-font">@Html.Lang("首頁標題文本1")<span class="japan blue f80 settings-text">@Html.Lang("首頁標題文本1特殊部分")</span></h1>
    <h3>@Html.Lang("首頁標題文本2")</h3>
</div>

4.彩蛋

public static class LocalizationHelper
    {
        public static string Lang(this HtmlHelper html, string key)
        {
            return GetLang(key);
        }

        public static string GetLang(string key)
        {
            var filePath = HttpContext.Current.Server.MapPath("~/Resource");
            string language = HttpContext.Current.Session["CurrentLanguage"] == null ? "zh-CN" : HttpContext.Current.Session["CurrentLanguage"].ToString();
            string resxPath = string.Format(@"{0}\{1}.resources", filePath, language);
            ResourceReader reader = new ResourceReader(resxPath);
            var entry = reader.Cast<DictionaryEntry>().FirstOrDefault<DictionaryEntry>(x => x.Key.ToString() == key);
            reader.Close();

            return entry.Value == null ? "" : entry.Value.ToString();
        }
    }

5.總結

資源文件用下來, 總體感覺還可以, 如果做多語言網站的話, 代碼邏輯上幾乎不用考慮語言的事情. 唯一比較繁瑣的就是要分辨名稱對應的位置, 配置起來內容太多也比較煩人. 不過或許這些工作不用程序員的我們來做^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM