當前位置:
首頁 > 知識 > ASP.NET MVC5多語言切換快速實現方案

ASP.NET MVC5多語言切換快速實現方案

功能

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

ASP.NET MVC5多語言切換快速實現方案

Github download Demo

具體實現方法

定義實體類

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

ASP.NET MVC5多語言切換快速實現方案

生成資源文件

通過mvc scaffolding擴展工具會自動生成對應實體對象的3個資源文件默認中文,繁體,英文

繁體需要自己翻譯,英文內容根據欄位名定義後已大寫字母分割 DateTime 現實 Date Time

ASP.NET MVC5多語言切換快速實現方案

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

ASP.NET MVC5多語言切換快速實現方案

ASP.NET MVC5多語言切換快速實現方案

前後端代碼實現語言切換功能

-選擇切換語言

ASP.NET MVC5多語言切換快速實現方案

Js代碼

ASP.NET MVC5多語言切換快速實現方案

/* 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;
}
});

ASP.NET MVC5多語言切換快速實現方案

後端代碼

ASP.NET MVC5多語言切換快速實現方案

[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);
}

ASP.NET MVC5多語言切換快速實現方案

CultureFilter 這是關鍵 這是沒有使用RouteData,通過修改url來保存當前語言要改的地方很多還要修改路由規則,所以我就用Cookies來保存

ASP.NET MVC5多語言切換快速實現方案

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;
}
}
}

ASP.NET MVC5多語言切換快速實現方案

HtmlHelper 代碼實現語言的輸出

ASP.NET MVC5多語言切換快速實現方案

/// <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>

作者:阿新

原文:https://www.cnblogs.com/neozhu/p/10285874.html

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

默認終端 + iTerm2 + agnoster theme +……打造macOS終端
Qt的線程(兩種QThread類的詳細使用方式)

TAG:程序員小新人學習 |