应用场景:通过前端切换网站使用英语、中文两种语言。
解决思路: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 属性不是一个语言设置。