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 属性不是一个语言设置。
asp.net多语言网站的完整解决方案的更多相关文章
- [译]MVC网站教程(一):多语言网站框架
本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...
- 利用JFreeChart绘制股票K线图完整解决方案
http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) ...
- Jenkins与网站代码上线解决方案【转】
转自 Jenkins与网站代码上线解决方案 - 惨绿少年 https://www.nmtui.com/clsn/lx524.html 1.1 前言 Jenkins是一个用Java编写的开源的持续集成工 ...
- XP局域网访问无权限、不能互相访问问题的完整解决方案
XP局域网访问无权限问题的完整解决方案: 1:用管理员账户登录系统 2:在“开始”-- “运行”里输入 GPEDIT.MSC 目的是打开组策略选项 3:依次展开”WINDOWS设置”-”本地策略”-” ...
- 手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
本文主要讲解了如何把ABP官方的在线生成解决方案运行起来,并说明了解决方案中项目间的依赖关系.然后手动实践了如何从0搭建了一个简化的解决方案.ABP官方的在线生成解决方案源码下载参考[3],手动搭 ...
- ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header
继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The ...
- ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩
网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 ...
- ASP.NET MVC 3 网站优化总结(六)压缩 HTML
压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
随机推荐
- 生成树协议(STP)的精髓知识
STP生成树协议 1.STP介绍 2.STP生成树算法 1.STP - Spanning tree protocol (生成树协议)是逻辑上断开环路,防止广播风暴的产生.当线路故障,阻塞接口 ...
- Docker的数据管理、网络通信和dockerfile
Docker的数据管理.网络通信和dockerfile 目录 Docker的数据管理.网络通信和dockerfile 一.Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 ...
- Shell之awk
Shell之awk 目录 Shell之awk 一.awk概述 1. awk的工作原理 2. 命令格式 3. awk常见的内建变量(可直接用) 二.操作实例 1. 按行输出文本 2. 按字段输出文本 3 ...
- 《PHP面试笔试真题库》——PHP面试的好帮手
你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试真题库>. 一.创作过程 <PHP 程序员面试笔试真题库>是我的第三 ...
- 37、python并发编程之协程
目录: 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本节的主题是基于单线程来 ...
- Solution -「SDOI 2016」「洛谷 P4076」墙上的句子
\(\mathcal{Description}\) Link. (概括得说不清话了还是去看原题吧 qwq. \(\mathcal{Solution}\) 首先剔除回文串--它们一定对答案产 ...
- 轩辕展览-为什么要做VR虚拟展厅设计?
沉浸感,有趣和互动体验VR虚拟展厅设计给客户带来高度的沉浸感和互动体验,给客户一种真实的感觉,让客户更愿意参与,使商家的宣传更加客观. 展示方式多样化 ,增加宣传优势在展示产品或企业时,VR全景可达到 ...
- 【测试必备】k8s基本使用(更新中。。。)
测试为什么要学习容器技术及k8s k8s不是运维的专属技术 随着互联网技术的发展,架构也已经从单体架构发展到容器云( "微服务 + k8s" 完美结合) 很多人认为,k8s只是运维 ...
- 漏洞CVE 2017-8464
概述 微软的Patch Tuesday更新发布了多达95个针对Windows.Office.Skype.IE和Edge浏览器的补丁.其中27个涉及远程代码执行,18个补丁被微软设定为严重(Critic ...
- 【C#DLR 动态编程】CallSite<T>
CallSite<T>译为"动态(调用)站点",它是DLR中的核心组件之一