asp.net多语言网站的完整解决方案

应用场景:通过前端切换网站使用英语、中文两种语言。

解决思路:ResourceManager会通过当前线程区域性信息,读取对应的Resource文件,从而达到切换语言的效果,其实质是是在切换当前线程的区域性信息。

具体实现:

注意:每次访问新的页面,应用程序池分配线程资源并不一定每次访问都是同一线程资源,所以每次请求都需要重新设置区域性信息。我将区域性信息设置写在了OnActionExecuting中,如果是老版本的asp.net项目也可以写在global文件的Application_BeginReuest事件方法中


下来我们按步骤来贴代码:

1、项目中创建Resource文件 后缀名为.resx

添加资源文件,配置ResourceManager(指定应用程序读取资源文件路径和文件)



Language.cs 关于配置ResourceManager的用法,以及参数的意义参照:使用Resource文件实现应用程序多语言

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 属性不是一个语言设置。

posted @ 2021-12-16 16:27  jiayouliucui  阅读(823)  评论(0编辑  收藏  举报