ASP.Net MVC多语言
.NET MVC 多语言网站
通过浏览器语言首选项改变MVC的语言,通过浏览器语言选项,修改脚本语言。
一、添加资源文件
1、添加App_GlobalResources文件夹。
2、添加默认的资源文件和对应的语言码资源文件。如zh-cn代表中国大陆,en-us代表美制英语。详情:http://www.lingoes.cn/zh/translator/langcode.htm
3、将资源文件设置成public。新建时默认是internal,这样不能被访问。
右键点击资源文件,在其的属性中将自定义工具(Custom Tool) 从资源代理生成器(GlobalResourceProxyGenerator) 改为 公共文件(PublicResXFileCodeGenerator),然后将生成操作从内容改为嵌入的资源。
4、在web.config中添加语言选项。这样就会根据浏览器语言首选项,判断要使用的资源。
<!--根据浏览器的语言首选项,决定语言项--> <globalization uiCulture="auto" culture="auto" enableClientBasedCulture="true" />
5、在对应的文件中添加键值对。
二、View+Control+Model的普通文字多语言
1、view
2、control
3、model
//[Required(ErrorMessage = "密码不能为空")] [Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "PasswordNotNull")]
三、DisplayName的多语言化。重写DisplayName方法
public class LocalDisplayName : DisplayNameAttribute { private string _defaultName = ""; public Type ResourceType { get; set; }
public string ResourceName { get; set; } public LocalDisplayName(string defaultName) { _defaultName = defaultName; } public override string DisplayName
{
get
{
PropertyInfo p = ResourceType.GetProperty(ResourceName);
if (p != null)
{
return p.GetValue(null, null).ToString();
}
else
{
return _defaultName;
}
}
}
}
model使用:
[LocalDisplayName("发布时间", ResourceName = "PublishDateTime", ResourceType = typeof(Resource))]
四、脚本多语言
原始方法:
我的方法是在引用一个公用的脚本文件,由该文件通过当前语言引入对应的语言资源脚本。如果当前浏览区语言没有没有对应的资源脚本,就引入默认的资源脚本。
1、通过浏览器语言引入对应的语言资源脚本。
//将所有的语言资源脚本文件名罗列再次,用&分割 var languageresources = "en-us&zh-cn" //根据当前浏览器语言验证语言脚本是否存在,如果在则加载,则加载默认的zh-cn.js var thislanguagere = navigator.language.toLowerCase(); var script = document.getElementsByTagName('HEAD').item(0); script = document.createElement("script"); script.type = "text/javascript"; var language = languageresources.split("&") var flag = false; for (var item in language) { if (thislanguagere == language[item]) { var flag = true; script.src = "/Scripts/controls/" + thislanguagere + ".js"; document.body.appendChild(script); } } if (flag == false) { script.src = "/Scripts/controls/zh-cn.js"; document.body.appendChild(script); }
2、对应资源脚本写法。设置键值对
3、具体页面脚本使用,引用。需要先引用判断语言脚本。
更新方法:
1、采用jquery.i18n.properties-1.0.9.js提供的方法:
(1)、jQuery.i18n.properties() 用法:引入对应的资源文件
jQuery.i18n.properties({ name:'strings',// 资源文件名称 path:'bundle/',// 资源文件所在目录路径 mode:'both',// 模式:变量或 Map language:'pt_PT',// 对应的语言 cache:false, encoding: 'UTF-8', callback: function() {// 回调方法 } });
(2)、jQuery.i18n.prop(key)
该方法以 map 的方式使用资源文件中的值,其中 key 指的是资源文件中的 key。当 key 指定的值含有占位符时,可以使用 jQuery.i18n.prop(key,var1,var2 … ) 的形式,其中 var1,var2 …对各占位符依次进行替换。例如资源文件中有“msg_hello= 您好 {0},今天是 {1}。”的键值对,则我们可以采用“jQuery.i18n.prop( ‘ msg_hello ’ , ’小明’ , ’星期一’ );”的形式使用 msg_hello。
(3)、jQuery.i18n.browserLang() 用于获取浏览浏览器的语言信息,这里不再单独介绍。
2、文档结构:其中strings是随便起到,后缀的en-us代表当前浏览器语言项。没有后缀代表默认语言。
声明变量写法:
3、在具体脚本内的写法:
function loadProperties() { jQuery.i18n.properties({// 加载资浏览器语言对应的资源文件 name: 'strings', // 资源文件名称 path: '/Scripts/controls/', // 资源文件路径 mode: 'map', // 用 Map 的方式使用资源文件中的值 callback: function () {//加载成功后设置显示内容 } }); } $(function () { loadProperties();//引入资源文件 //忘记密码的点击事件 $("#hex-forgotpassword").click(function () { if ($("#UserName").val() == "") { //alert("请在登陆框输入用户名,再点击找回密码!"); alert($.i18n.prop('forgotpasswordnotusername')); } else { //var msg = "您确认要找回密码吗?您的密码将发送到您的邮箱!"; var msg = $.i18n.prop('forgotpassword'); if (confirm(msg) == true) { $.ajax({ type: "Get", url: '/Account/ForgetPassword', data: "userName=" + $("#UserName").val(), success: function (msg) { alert(msg); } }); } else { return false; } } }); //用户名文本框获得焦点 $('#UserName').focus(); })
另附:可修改的多语言,即通过语言超链接修改当前语言项。
1、在Global.asax文件中:
protected void Application_AcquireRequestState(Object sender, EventArgs e) { Authentication.AttachAuthTicketByUrl<WebAuthentication>(Context); //多语言 可切换 if (HttpContext.Current.Session != null) { System.Globalization.CultureInfo ci = (System.Globalization.CultureInfo)this.Session["CurrentLanguage"]; if (ci == null) { ci = new System.Globalization.CultureInfo("zh-cn"); this.Session["CurrentLanguage"] = ci; } System.Threading.Thread.CurrentThread.CurrentUICulture = ci; System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(ci.Name); } }
2、在control中:
public ActionResult ChangeLanguage(string language) { Session["CurrentLanguage"] =new System.Globalization.CultureInfo(language); return Redirect("Login"); }
3、在页面中:
@Html.ActionLink("English", "ChangeLanguage", "Account", new { language = "en-us" }, new { @class = "hex-a" }) @Html.ActionLink("Chinese", "ChangeLanguage", "Account", new { language = "zh-cn" }, new { @class = "hex-a" })
参考资料:
.NET MVC 2 多语言网站的实现:
http://blog.163.com/xu_shuhao/blog/static/52577487201092402610920/
关于在mvc4中多语言建站的实例:
http://www.cnblogs.com/Joans/archive/2012/08/16/2640473.html
使用 jQuery.i18n.properties 实现 Web 前端的国际化:
https://www.ibm.com/developerworks/cn/web/1305_hezj_jqueryi18n/
ASP.Net MVC多语言的更多相关文章
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- ASP.NET MVC 多语言方案
前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密 ...
- ASP.NET MVC 多语言实现——URL路由
考虑实现一个完整的基于asp.net mvc的多语言解决方案,从路由到model再到view最后到数据库设计(先挖好坑,后面看能填多少). 我所见过的多语言做得最好的网站莫过于微软的msdn了,就先从 ...
- ASP.net MVC 多语言处理
MVC多语言处理主要分两部分,一部分是Razor视图中的文字标签内容切换, 另一部分是javascript文件中的文标签内容切换. 这里分这两部分来说. View视图中的比较好做, 思路是使用资源文 ...
- ASP.NET MVC多语言 仿微软网站效果(转)
本文转自: https://blog.csdn.net/Cooldiok/article/details/7831351 2017年10月22日 21:31:22 Cooldiok 微软作为ASP.N ...
- ASP.NET MVC多语言 仿微软网站效果
文章转载自:https://blog.csdn.net/cooldiok/article/details/78313513 微软作为ASP.NET的创造者,它对于官网的结构设计肯定有值得我们借鉴和参考 ...
- ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...
- 转:ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...
- ASP.NET MVC 多语言解决方案
1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...
随机推荐
- Jenkins中的邮件配置
摘自http://blog.csdn.net/fullbug/article/details/53024562 Jenkins是一个很受欢迎的CI持续集成工具,能够实现项目的自动构建.打包.测试.发布 ...
- CSS层叠样式表--找到标签
0 怎么学习CSS 1 CSS的四种引入方式 2 CSS的四种基本选择器 3 属性选择器 4 CSS伪类 5 CSS选择器优先级 6 CSS的继承性 怎么学习CSS 1.怎么找到标签(CSS选择器) ...
- linux下如何删除行首的数字?
举例如下: 1.某文件jello.txt中有以下行 1111-yes 2222-no 3333-yes-no-no 2.删除jello.txt中每行行首的数字 cat jello.txt | cut ...
- centos6配置网络常见问题
1. 启用网卡 查看网卡模块: lsmod 移除网卡:modprobe -r e1000 装载网卡: modprobe e1000 2. 配置网络 vim /etc/sysconfig/network ...
- P2057 [SHOI2007]善意的投票
思路 简单的最小割模型 最小割的模型就是选出一些边,把点集划分成S和T两个部分,使得代价最小 到这题上就是板子了 代码 #include <cstdio> #include <alg ...
- P2536 [AHOI2005]病毒检测
反思 对于*符号,明明可以让相同位置再次匹配下一个,或者跳过当前位置匹配,但是却写了个把trie的子树全部push进队列的垃圾写法,结果一直MLE 告辞 思路 模板串多且不长,可以塞到trie树里,这 ...
- GC 垃圾收集
算法: 没有使用引用计数算法.使用的是GC Roots 可达性算法. 复制算法:新生代,老年代. 标记-整理算法:一般会对对象标记几次才会清理掉.然后从新整理物理内存空间. 分代收集算法:更加对象存活 ...
- 第一章(欢迎进入node.js世界)
本章内容 1:Node.js是什么 2:服务器端javascript 3:node的异步和事件触发本质 4:node为谁而生 5:node程序示例 1.1 node.js他的首次亮相是在2009年,非 ...
- How to install Bekeley Extension Software Switch(BESS)?
参考: Github BESS How to install Bekeley Extension Software Switch(BESS)? Introduction BESS is a modul ...
- NPOI导入excel文件为DataTable,使用SqlBulkCopy添加到数据库表
public DataTable ExcelToDataTable(Stream stream, string fileName) { DataTable data = new DataTable() ...