MVC多语言应用
MVC多语言应用
最近发现资源文件是个好东西, 用的好了可以给开发人员借阅不少的时间. 例如做一个多语言的网站, 资源文件就有不小的用处.
这里以MVC4模版项目的登录页为例, 简单说一下过程:
1.资源文件的处理
首先准备资源文件, 即语言包. 为WebSite项目添加两个resx文件, 如图:

接着分别为这两个文件添加内容(名称/值),如图:


资源文件第三步, 用命令行工具ResGen.exe将这两个resx文件生成同名的resources文件, 如zh-CN.resources、en-US.resources, 生成后将这两个resources文件放到Resource目录下.
关于ResGen.exe工具的详细用法, 这里只给出命令行脚本, 不做介绍, 有兴趣的可以去找相关资料.
|
1
2
|
resgen D:\Code\XNFans\XNWeb\App_LocalResources\zh-CN.resx D:\Code\XNFans\Resources\zh-CN.resourcesresgen D:\Code\XNFans\XNWeb\App_LocalResources\en-US.resx D:\Code\XNFans\Resources\en-US.resources |
至此,资源文件(语言包)就做好啦,下面就是在项目中的使用了。
2.后端代码
为实现动态切换语言, 要在Global.asax文件中添加Application_AcquireRequestState事件, 如下:

protected void Application_AcquireRequestState(object sender,EventArgs e)
{
if (HttpContext.Current.Session != null)
{
CultureInfo ci = (CultureInfo)this.Session["CurrentLanguage"];
if (ci == null)
{
ci = new CultureInfo("zh-CN");
this.Session["CurrentLanguage"] = ci;
}
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
}
}

在要应用的控制器中添加ChangeLanguage方法, 如下:

/// <summary>
/// 切换语言
/// </summary>
/// <param name="lang"></param>
/// <returns></returns>
public JsonpResult ChangeLanguage(string lang)
{
int data = 1;
try
{
Session["CurrentLanguage"] = new CultureInfo(lang);
}
catch (Exception ex)
{
data = 0;
} JsonpResult result = new JsonpResult()
{
Data = data,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
}; return result; }

切换语言时调用ChangeLanguage方法, 传入对应的语言版本标识就可以了.
3.前端应用
<div id="head-text">
<h1 class="general-font">@Html.Lang("首页标题文本1")<span class="japan blue f80 settings-text">@Html.Lang("首页标题文本1特殊部分")</span></h1>
<h3>@Html.Lang("首页标题文本2")</h3>
</div>
4.彩蛋

public static class LocalizationHelper
{
public static string Lang(this HtmlHelper html, string key)
{
return GetLang(key);
} public static string GetLang(string key)
{
var filePath = HttpContext.Current.Server.MapPath("~/Resource");
string language = HttpContext.Current.Session["CurrentLanguage"] == null ? "zh-CN" : HttpContext.Current.Session["CurrentLanguage"].ToString();
string resxPath = string.Format(@"{0}\{1}.resources", filePath, language);
ResourceReader reader = new ResourceReader(resxPath);
var entry = reader.Cast<DictionaryEntry>().FirstOrDefault<DictionaryEntry>(x => x.Key.ToString() == key);
reader.Close(); return entry.Value == null ? "" : entry.Value.ToString();
}
}

5.总结
资源文件用下来, 总体感觉还可以, 如果做多语言网站的话, 代码逻辑上几乎不用考虑语言的事情. 唯一比较繁琐的就是要分辨名称对应的位置, 配置起来内容太多也比较烦人. 不过或许这些工作不用程序员的我们来做^_^
MVC多语言应用的更多相关文章
- ASP.net MVC 多语言处理
MVC多语言处理主要分两部分,一部分是Razor视图中的文字标签内容切换, 另一部分是javascript文件中的文标签内容切换. 这里分这两部分来说. View视图中的比较好做, 思路是使用资源文 ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- ASP.Net MVC多语言
.NET MVC 多语言网站 通过浏览器语言首选项改变MVC的语言,通过浏览器语言选项,修改脚本语言. 一.添加资源文件 1.添加App_GlobalResources文件夹. 2.添加默认的资源文件 ...
- ASP.NET MVC 多语言方案
前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密 ...
- ASP.NET MVC 多语言实现——URL路由
考虑实现一个完整的基于asp.net mvc的多语言解决方案,从路由到model再到view最后到数据库设计(先挖好坑,后面看能填多少). 我所见过的多语言做得最好的网站莫过于微软的msdn了,就先从 ...
- ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...
- MVC 多语言
最近项目需要用到多语言. 研究了一下,也参考了很多技术文章. 这里贴一下参考地址:http://www.cnblogs.com/unintersky/p/3969612.html 主要步骤我这里简述一 ...
- ASP.NET MVC多语言 仿微软网站效果(转)
本文转自: https://blog.csdn.net/Cooldiok/article/details/7831351 2017年10月22日 21:31:22 Cooldiok 微软作为ASP.N ...
- 转:ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...
随机推荐
- linux head命令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...
- 深入理解 Spring 事务原理【转】
本文转自码农网 – 吴极心原创 连接地址:http://www.codeceo.com/article/spring-transactions.html 一.事务的基本原理 Spring事务的本质其 ...
- NodeJS会是昙花一现吗?
在用了一年以后,我感觉node.js有一点不正确劲.它非常有意思,可是我认为我应该用另外一个视角去审视它. 网络编程真的能够更easy吗? node.js无疑有一些设计很好的地方.前段时间我写了一个性 ...
- Response.AppendCookie
//写入 protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie=new HttpCookie(&qu ...
- ViewState的用法
学习标签: ViewState 本文导读:在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有 ...
- Python脚本:获取股票信息
在水木上看到有人在问到想用python去获取股票的信息,sina finance上面的那些数据的是通过js控制的,会根据股票代码去获取实时信息然后根据用户友好的方式展示出来.首先,新浪的一个url让我 ...
- Primefaces的fileUpload组件使用
最近在学习Primefaces(当然也是项目中需要用的).在使用其fileUpload遇到了不小的困难,现总结一下供大家及我自己今后参考使用. 1.首先是使用环境配置:正常的Primefaces开发环 ...
- <转载>CSS解决图片过大撑破DIV的方法
DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...
- JSP的学习(5)——语法知识三之include指令
本篇继续来对JSP语法中的JSP指令进行学习,在<JSP的学习(3)——语法知识二之page指令>中,已经介绍了JSP指令的书写格式和page指令的详细信息,所以在这一篇中我们会对JSP指 ...
- HDU-1039-Easier Done Than Said?(Java && 没用正則表達式是我的遗憾.....)
Easier Done Than Said? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...