web實現多語言切換的完整解決方案
阿新 • • 發佈:2021-12-16
應用場景:通過前端切換網站使用英語、中文兩種語言。
解決思路:ResourceManager會通過當前執行緒區域性資訊,讀取對應的Resource檔案,從而達到切換語言的效果,其實質是是在切換當前執行緒的區域性資訊。
具體實現:
目錄注意:每訪問一次頁面,應用程式重新開啟一個執行緒,所以每次請求都需要重新設定區域性資訊。我將區域性資訊設定寫在了OnActionExecuting中,如果是老版本的asp.net專案也可以寫在global檔案的Application_BeginReuest事件方法中
下來我們按步驟來貼程式碼:
1、專案中建立Resource檔案 字尾名為.resx
新增資原始檔,配置ResourceManager(指定應用程式讀取資原始檔路徑和檔案)
Language.cs
using System.Resources; namespace MutilLanguage { public class Language { public static ResourceManager lanRM { get { return new ResourceManager("MutilLanguage.ResourceLan", typeof(MutilLanguage.Language).Assembly); } } } }
2、js 設定cookie,作用是儲存當前的區域性資訊 en-US,zh-CN
點選html切換語言,js 設定cookie
html程式碼
<a class="lang nav-link" data-val="en-US">english</a>
<a class="lang nav-link" data-val="zh-CN">中文</a>
設定cookie兩種方案:js設定cookie;ajax後臺設定cookie
js 設定cookie,path=/ 作用域為當前站點
$(".lang").click(function () { console.log($(this).attr("data-val")); let code = $(this).attr("data-val"); //document.cookie = `lang=${code};path=/`; //window.location.reload(true); });
ajax後端設定cookie:
c#程式碼
[HttpGet]
public IActionResult ChangeCultrue(string nativeCode)
{
HttpContext.Response.Cookies.Append("lang", nativeCode);
return Json(new { msg="ok"});
}
js呼叫
$(".lang").click(function () {
console.log($(this).attr("data-val"));
let code = $(this).attr("data-val");
$.ajax({
url: "../home/ChangeCultrue",
data: {
nativeCode: code
},
success: function () {
window.location.reload(true);
}
});
});
3、設定當前執行緒的區域性資訊(每次載入頁面)
通過重寫OnActionExecuting方法,在每次執行Action程式碼塊方法之前為當前執行緒設定區域作用域。
public override void OnActionExecuting(ActionExecutingContext context)
{
string cookielang = "";
context.HttpContext.Request.Cookies.TryGetValue("lang",out cookielang);
if (string.IsNullOrEmpty(cookielang))
cookielang = "zh-CN";
Thread.CurrentThread.CurrentCulture = new CultureInfo(cookielang);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
base.OnActionExecuting(context);
}
4、程式碼讀取資源,根據設定的區域資訊不同顯示的語言類別不同
//@MutilLanguage.Language.lanRM.GetString("home")
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">@MutilLanguage.Language.lanRM.GetString("home")</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">@MutilLanguage.Language.lanRM.GetString("privacy")</a>
C#程式碼
MutilLanguage.Language.lanRM.GetString("home")
CultureInfo.CurrentCulture 屬性是每個執行緒的設定,可確定日期、時間、貨幣和數字的預設格式、文字排序順序、字串比較以及大小寫轉換。CurrentCulture 屬性不是一個語言設定。
本文來自部落格園,作者:jiayouliucui,轉載請註明原文連結:https://www.cnblogs.com/cheery-go/p/15698799.html