1. 程式人生 > 其它 >web實現多語言切換的完整解決方案

web實現多語言切換的完整解決方案

應用場景:通過前端切換網站使用英語、中文兩種語言。

解決思路: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