ASP.NET MVC5多語言切換快速實現方案
小編:啊南 47閱讀 2020.11.09
實現動態切換語言,Demo 做了三種語言庫可以切換,包括資源文件的定義,實體對象屬性設置,后臺代碼Controller,IAuthorizationFilter,HtmlHelper的實現,做法比較簡單易學易用,模板中新增了多語言資源文件的生成功能,發現我的這個框架和目前很流行的ABP框架是類似更有點像收費版的Asp.net Zero,只是我做的更加輕量級,更方便,更快速,可惜Asp.net Core 下的Scaffolding這塊擴展不想MVC5那么容易.這塊還需要研究,下一步就準備升級到asp.net core.

定義實體類 通過Display屬性定義Name ResourceType,需要讀取的語言庫資源文件

生成資源文件 通過mvc scaffolding擴展工具會自動生成對應實體對象的3個資源文件默認中文,繁體,英文 繁體需要自己翻譯,英文內容根據字段名定義后已大寫字母分割 DateTime 現實 Date Time

頁面功能按鈕語言資源文件庫


前后端代碼實現語言切換功能
-選擇切換語言

Js代碼
/* multiple lang dropdown */ $('#dropdownlang-dropdown-menu').on('click', 'a', ()=> { const lang = this.text; const flag = this.firstElementChild.className; const culture = this.firstElementChild.getAttribute("culture"); $('#dropdownlang').children()[0].className = flag; $('#dropdownlang').children()[1].innerHTML = lang; localStorage.setItem('lang-text', lang); localStorage.setItem('lang-css', flag); localStorage.setItem('lang-culture', culture); $.get('/Account/SetCulture?lang=' + culture).then(res => { if (res.success) { location.reload(); } }); }); $(()=> { const lang = localStorage.getItem('lang-text'); const css = localStorage.getItem('lang-css'); const culture = localStorage.getItem('lang-culture'); //這段代碼也多余根本沒有效果 //scripttag = document.createElement("script"); //scripttag.type = "text/javascript"; //scripttag.src = src; //document.body.appendChild(scripttag); //$.parser.parse(); }; if (lang && css && culture) { $('#dropdownlang').children()[0].className = css; $('#dropdownlang').children()[1].innerHTML = lang; } });
后端代碼
[HttpGet] public ActionResult SetCulture(string lang) { //這里設置CultureInfo是多余的 switch (lang.Trim()) { case "en": CultureInfo.CurrentCulture = new CultureInfo("en-US"); CultureInfo.CurrentUICulture = new CultureInfo("en-US"); break; case "cn": CultureInfo.CurrentCulture = new CultureInfo("zh-CN"); CultureInfo.CurrentUICulture = new CultureInfo("zh-CN"); break; case "tw": CultureInfo.CurrentCulture = new CultureInfo("zh-TW"); CultureInfo.CurrentUICulture = new CultureInfo("zh-TW"); break; } //這里設置CultureInfo是多余的 var cookie = new HttpCookie("culture", lang) { Expires = DateTime.Now.AddYears(1) }; Response.Cookies.Add(cookie); return Json(new { success = true }, JsonRequestBehavior.AllowGet); }
CultureFilter 這是關鍵 這是沒有使用RouteData,通過修改url來保存當前語言要改的地方很多還要修改路由規則,所以我就用Cookies來保存
public class CultureFilter : IAuthorizationFilter { private readonly string defaultCulture; public CultureFilter() { this.defaultCulture = "cn"; } public void OnAuthorization(AuthorizationContext filterContext) { var culture = filterContext.HttpContext.Request.Cookies["culture"]; var lang = defaultCulture; if (culture != null && culture.Value != null) { lang = culture.Value; filterContext.HttpContext.Response.Cookies.Set(culture); } switch (lang.Trim()) { case "en": CultureInfo.CurrentCulture = new CultureInfo("en-US"); CultureInfo.CurrentUICulture = new CultureInfo("en-US"); //Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); //Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); break; case "cn": CultureInfo.CurrentCulture = new CultureInfo("zh-CN"); CultureInfo.CurrentUICulture = new CultureInfo("zh-CN"); //Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN"); //Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN"); break; case "tw": CultureInfo.CurrentCulture = new CultureInfo("zh-TW"); CultureInfo.CurrentUICulture = new CultureInfo("zh-TW"); //Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW"); //Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW"); break; } } }
HtmlHelper 代碼實現語言的輸出
/// <summary> /// 多語言切換 /// </summary> /// <param name="helper"></param> /// <param name="name"></param> /// <returns></returns> public static HtmlString L(this HtmlHelper helper, string name) { var resource = new System.Resources.ResourceManager(typeof(WebApp.resource.Global)); var text = resource.GetString(name); return new HtmlString(text ?? name); } /// <summary> /// 前端easyui或是其它js相關的比如提示信息也需要轉換必須在這里加載不同的語言文件 /// </summary> public static HtmlString LangScriptTag(this HtmlHelper helper,string defaultsrc) { var src = defaultsrc; var lang = CultureInfo.CurrentCulture.Name; switch (lang) { case "en-US": src = "/Scripts/easyui/locale/easyui-lang-en.js"; break; case "zh-CN": src = "/Scripts/easyui/locale/easyui-lang-zh_CN.js"; break; case "zh-TW": src = "/Scripts/easyui/locale/easyui-lang-zh_TW.js"; break; default: src = defaultsrc; break; } return new HtmlString($"<script src=\"{ src }\"></script>"); } //html代碼 <div class="btn-group btn-group-sm"> <button onclick="append()" class="btn btn-default"> <i class="fa fa-plus"></i> @Html.L("Add") </button> </div> <div class="btn-group btn-group-sm"> <button onclick="removeit()" class="btn btn-default"> <i class="fa fa-trash-o"></i> @Html.L("Delete") </button> </div> <div class="btn-group btn-group-sm"> <button onclick="accept()" class="btn btn-default"> <i class="fa fa-floppy-o"></i> @Html.L("Save") </button> </div>
相關推薦
- ASP.Net Web Page深入探討 一、服務器腳本基礎介紹首先,我們先復習一下Web服務器頁面的基本執行方式:1、 客戶端通過在瀏覽器的地址欄敲入地址來發送請求到服務器端2、 服務器接收到請求之后,發給相應的服務器端頁面(也就是腳本)來執行,腳本產生客戶端的響應,發送回客戶端3、 客戶…
- 支付寶小程序:自定義SDK,alipay.offline.material.image.upload(上傳門店照片和視頻接口)的封裝 在對接會員卡模板創建時,有一條logo_id和background_id必須通過接口(alipay.offline.material.image.upload)上傳圖片來進行展示。由于我使用的是go語言作為后端的開發語言,恰巧官方又沒有封裝,所以只能自己動手。僅供其他沒有SDK語言的小伙伴參考!首先和…