ASP.NET MVC5多语言切换快速实现方案
功能
实现动态切换语言,Demo做了三种语言库可以切换,包括资源文件的定义,实体对象属性设置,后台代码Controller,IAuthorizationFilter,HtmlHelper的实现,做法比较简单易学易用,配合我之前发布的# MVC Scaffolding SmartCode-Engine 更新 模板中新增了多语言资源文件的生成功能,发现我的这个框架和目前很流行的ABP框架是类似更有点像收费版的Asp.net Zero,只是我做的更加轻量级,更方便,更快速,可惜Asp.net Core 下的Scaffolding这块扩展不想MVC5那么容易.这块还需要研究,下一步就准备升级到asp.net core.

具体实现方法
定义实体类
通过Display属性定义Name ResourceType,需要读取的语言库资源文件

生成资源文件
通过mvc scaffolding扩展工具会自动生成对应实体对象的3个资源文件默认中文,繁体,英文
繁体需要自己翻译,英文内容根据字段名定义后已大写字母分割 DateTime 现实 Date Time

页面功能按钮语言资源文件库


前后端代码实现语言切换功能
-选择切换语言

Js代码
/* multiple lang dropdown */
$('#dropdownlang-dropdown-menu').on('click', 'a', ()=> {
const lang = this.text;
const flag = this.firstElementChild.className;
const culture = this.firstElementChild.getAttribute("culture");
$('#dropdownlang').children()[].className = flag;
$('#dropdownlang').children()[].innerHTML = lang;
localStorage.setItem('lang-text', lang);
localStorage.setItem('lang-css', flag);
localStorage.setItem('lang-culture', culture);
$.get('/Account/SetCulture?lang=' + culture).then(res => {
if (res.success) {
location.reload();
} });
});
$(()=> {
const lang = localStorage.getItem('lang-text');
const css = localStorage.getItem('lang-css');
const culture = localStorage.getItem('lang-culture');
//这段代码也多余根本没有效果
//scripttag = document.createElement("script");
//scripttag.type = "text/javascript";
//scripttag.src = src;
//document.body.appendChild(scripttag);
//$.parser.parse();
};
if (lang && css && culture) {
$('#dropdownlang').children()[].className = css;
$('#dropdownlang').children()[].innerHTML = lang; }
});
后端代码
[HttpGet]
public ActionResult SetCulture(string lang) {
//这里设置CultureInfo是多余的
switch (lang.Trim())
{
case "en":
CultureInfo.CurrentCulture = new CultureInfo("en-US");
CultureInfo.CurrentUICulture = new CultureInfo("en-US");
break;
case "cn":
CultureInfo.CurrentCulture = new CultureInfo("zh-CN");
CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
break;
case "tw":
CultureInfo.CurrentCulture = new CultureInfo("zh-TW");
CultureInfo.CurrentUICulture = new CultureInfo("zh-TW");
break;
}
//这里设置CultureInfo是多余的
var cookie = new HttpCookie("culture", lang)
{
Expires = DateTime.Now.AddYears()
};
Response.Cookies.Add(cookie);
return Json(new { success = true }, JsonRequestBehavior.AllowGet); }
CultureFilter 这是关键 这是没有使用RouteData,通过修改url来保存当前语言要改的地方很多还要修改路由规则,所以我就用Cookies来保存
public class CultureFilter : IAuthorizationFilter
{
private readonly string defaultCulture; public CultureFilter()
{
this.defaultCulture = "cn";
} public void OnAuthorization(AuthorizationContext filterContext)
{
var culture = filterContext.HttpContext.Request.Cookies["culture"];
var lang = defaultCulture;
if (culture != null && culture.Value != null)
{
lang = culture.Value;
filterContext.HttpContext.Response.Cookies.Set(culture);
}
switch (lang.Trim())
{
case "en":
CultureInfo.CurrentCulture = new CultureInfo("en-US");
CultureInfo.CurrentUICulture = new CultureInfo("en-US");
//Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
//Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
break;
case "cn":
CultureInfo.CurrentCulture = new CultureInfo("zh-CN");
CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
//Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");
//Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
break;
case "tw":
CultureInfo.CurrentCulture = new CultureInfo("zh-TW");
CultureInfo.CurrentUICulture = new CultureInfo("zh-TW");
//Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW");
//Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW");
break;
}
}
}
HtmlHelper 代码实现语言的输出
/// <summary>
/// 多语言切换
/// </summary>
/// <param name="helper"></param>
/// <param name="name"></param>
/// <returns></returns>
public static HtmlString L(this HtmlHelper helper, string name) { var resource = new System.Resources.ResourceManager(typeof(WebApp.resource.Global));
var text = resource.GetString(name);
return new HtmlString(text ?? name);
}
/// <summary>
/// 前端easyui或是其它js相关的比如提示信息也需要转换必须在这里加载不同的语言文件
/// </summary>
public static HtmlString LangScriptTag(this HtmlHelper helper,string defaultsrc) {
var src = defaultsrc;
var lang = CultureInfo.CurrentCulture.Name;
switch (lang)
{
case "en-US":
src = "/Scripts/easyui/locale/easyui-lang-en.js";
break;
case "zh-CN":
src = "/Scripts/easyui/locale/easyui-lang-zh_CN.js";
break;
case "zh-TW":
src = "/Scripts/easyui/locale/easyui-lang-zh_TW.js";
break;
default:
src = defaultsrc;
break;
}
return new HtmlString($"<script src=\"{ src }\"></script>");
} //html代码
<div class="btn-group btn-group-sm">
<button onclick="append()" class="btn btn-default"> <i class="fa fa-plus"></i> @Html.L("Add") </button>
</div>
<div class="btn-group btn-group-sm">
<button onclick="removeit()" class="btn btn-default"> <i class="fa fa-trash-o"></i> @Html.L("Delete") </button>
</div>
<div class="btn-group btn-group-sm">
<button onclick="accept()" class="btn btn-default"> <i class="fa fa-floppy-o"></i> @Html.L("Save") </button>
</div>
ASP.NET MVC5多语言切换快速实现方案的更多相关文章
- asp.net mvc5 多语言应用
需求:有些网站需要多语言显示,比如简体中文,繁体中文,英文. 1.创建一个mvc项目: 2.创建App_GlobalResources 创建了中文.英文两个语言的资源文件,中文是程序的默认语言,所以我 ...
- 在ASP.NET MVC5应用程序中快速接入QQ和新浪微博OAuth
http://www.cnblogs.com/xiaoyaojian/p/4611660.html
- ASP.NET MVC5入门2之Ajax实现数据查询
开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...
- ASP.NET MVC5快速入门--MyFirstWeb并发布到Windows Azure上
博主刚刚学习ASP.NET MVC5,看着微软的文档一点点学,就把FirstWeb的建立展示一下下啦,本次建立一个带个人身份验证的例子(即有注册登录机制的动态网页),开始,啦啦啦~~ 新建一个项目,选 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度系统界面 http: ...
- Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5
1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...
- ASP.NET MVC5入门3之登录验证
参考: HTML页面模版: http://www.ui.cn/detail/70262.html(第38个) MVC后台代码参考: http://www.oschina.net/p/nfine 开发环 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://ww ...
- ASP.NET MVC5学习笔记01
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...
随机推荐
- MYSQL必知必会学习笔记
8.1.1 百分号( %)通配符最常使用的通配符是百分号( %).在搜索串中, %表示任何字符出现任意次数.例如,为了找出所有以词jet起头的产品,可使用以下SELECT语句:SELECT prod_ ...
- vbs脚本实现自动打字祝福&搞笑
脚本祝福礼物 概述 听说抖音上流行一种用代码做程序表白的东西,,,, 当然我也不是要表白,,,, 但是好像蛮有意思的,,,, 于是,又学了一下vbs脚本,做了几个很不错的祝福脚本,不懂代码的可以直接戳 ...
- SCOPE_IDENTITY() 和 @@identity
@@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值.但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值:@@IDENTITY 不受限于 ...
- SpringBoot报错:Table 'database_name.hibernate_sequence' doesn't exist
引起条件: SpringBoot+JPA插入包含自增字段的对象 @Id @GeneratedValue private Integer id; 解决方法: 给注解添加属性 @Id @Generated ...
- 201771010126 王燕《面向对象程序设计(Java)》第十三周学习总结
实验十三 图形界面事件处理技术 实验时间 2018-11-22 1.实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: 事件源 (eventevent eventeventsource s ...
- Charles抓包软件简介
Charles简介: Charles是一款抓包神器,因为他是基于 java 开发的,所以跨平台,Mac.Linux.Window下都是可以使用的,确保安装之前已经安装了JDK.Charles官网地址: ...
- MD5加密过时方法替换
使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile进行MD5加密时,会出现已过时 /// < ...
- layui 表格内容显示更改
在cole 中使用temple 属性进行修改 例: table.render({ elem: '#messageTable' ,id: 'search_table_mId' ,height: 500 ...
- OJ002
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对. 因为,如果定义了很多register变量,可能会超过CPU的寄 ...
- css实现超出两行隐藏
overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-box-orient:vertical; -webkit-l ...