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

解决思路: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 属性不是一个语言设置。

asp.net多语言网站的完整解决方案的更多相关文章

  1. [译]MVC网站教程(一):多语言网站框架

    本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...

  2. 利用JFreeChart绘制股票K线图完整解决方案

    http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) ...

  3. Jenkins与网站代码上线解决方案【转】

    转自 Jenkins与网站代码上线解决方案 - 惨绿少年 https://www.nmtui.com/clsn/lx524.html 1.1 前言 Jenkins是一个用Java编写的开源的持续集成工 ...

  4. XP局域网访问无权限、不能互相访问问题的完整解决方案

    XP局域网访问无权限问题的完整解决方案: 1:用管理员账户登录系统 2:在“开始”-- “运行”里输入 GPEDIT.MSC 目的是打开组策略选项 3:依次展开”WINDOWS设置”-”本地策略”-” ...

  5. 手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践

      本文主要讲解了如何把ABP官方的在线生成解决方案运行起来,并说明了解决方案中项目间的依赖关系.然后手动实践了如何从0搭建了一个简化的解决方案.ABP官方的在线生成解决方案源码下载参考[3],手动搭 ...

  6. ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header

    继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The ...

  7. ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩

    网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 ...

  8. ASP.NET MVC 3 网站优化总结(六)压缩 HTML

    压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完 ...

  9. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. java中将SimpleDateFormat类型转换成Date类型

    try {String dateString = "2009-08-02 13:43:00";DateFormat df = SimpleDateFormat("yyyy ...

  2. PHP实习生面试准备的建议

    你好,是我琉忆.PHP程序员面试笔试图书系列作者. 今天就跟大家聊聊作为一个PHP程序员,每年的跳槽季都应该怎么准备一番. 其实普遍的跳槽季总的就有2个. 分别是新年后的3-4月,还有9-10月份. ...

  3. 3、前端--伪元素选择器、选择器优先级、字体、背景、边框、display、盒子模型

    伪元素选择器 # 首字调整>>>:也是一种文档布局的方式 p:first-letter { font-size: 48px; /*字体大小*/ color: red; } # 在文本 ...

  4. php spl_autoload_register 实现自动加载

    spl_autoload_register (PHP 5 >= 5.1.2, PHP 7) spl_autoload_register - 注册给定的函数作为 __autoload 的实现 语法 ...

  5. for循环,stream,parallelStream的性能区别

    for循环 for循环的性能随着数据量的增加性能也越来越差. 普通的循环不涉及较大的数据量,使用for循环更好. stream(串行流) stream在数据量小的情况下性能差,在数据量中.大的时候性能 ...

  6. (反射+内省机制的运用)处理jdbc的结果集

    1.原理:反射+内省 2.反射:动态创建对象 3.内省:动态处理对象的属性值 4.结果集处理: (1)把结果集中的一行数据,封装成一个对象,专门针对结果集中只有一行数据的情况. (2)处理结果集--多 ...

  7. Iterator迭代

    今天在牛客网练题的时候,出现了Iterator的题,实在想不起来这是什么,于是去查阅了相关资料,顺便自己去IDEA试了一下.总结了一些相关知识如下: 什么是Iterator? 我们来看看菜鸟教程里的解 ...

  8. 【C# 线程】WaitHandle类

    理论 Windows的线程同步方式可分为2种,用户模式构造和内核模式构造.内核模式构造:是由Windows系统本身使用,内核对象进行调度协助的.内核对象是系统地址空间中的一个内存块,由系统创建维护. ...

  9. [HITCON 2017]SSRFme

    explode()   字符串转数组,用 ,号分隔数组 @mkdir()    创建目录 @chdir() 改变目录 这两的效果一样,如果在/home/php 目录下,执行mkdir('var') 和 ...

  10. oj教程--学习顺序

    1.数组 2.排序 3.递归 4.栈 5.队列 6.链表 7.二叉树 8.大数或高精度 9.枚举 10.搜索 11.字符串问题 12.贪心 13.最短路径 14.动态规划