手机版

ASP.NET MVC的本地化和本地化多语言支持

时间:2021-11-03 来源:互联网 编辑:宝哥软件园 浏览:

1.MVC在ASP.NET的本地化支持。

ASP。NET是基于ASP.NET的,所以ASP.NET提供的所有功能都可以在MVC中使用,比如缓存、会话状态和本地化。在传统的ASP.NET网络表单时代,我们使用资源文件来存储不同语言的内容,并使用Visual Studio自动生成的ResourceManager类来检索它们。他们和ASP.NET的MVC一样有效。

让我创建一个标准的ASP.NET MVC示例应用程序。网站是中文的,我们可以看到所有的内容都写在视图类和控制器类中。

我使用的框架是基于Razor模板的mvc3的网站。

使用Visual Studio 2010创建MVC3的Web应用程序,并从后续选项中选择互联网应用程序。视图引擎是Razor。

MVC本地化

可以看到现在的网站是中文的,我们可以看到所有的内容都是硬编码在视图和控制器里面的。

我现在需要做的是将所有内容从页面和控制器中分离出来。Asp.Net给了我们一个名为App_GlobalResources的文件,其中包含了各种语言的全局资源文件。我们只需要在解决方案管理器中右键单击该Web项目,然后添加到Asp.Net文件夹-App_GlobalResources。

App_GlobalResources

我用中文和英文创建了资源文件,中文是程序的默认语言,所以我先创建了Global.resx文件,然后是Global.en.resx,中间的“en”是英语文化名。如果需要法语,只需要创建Global.fr.resx文件,Visual Studio会自动生成相应的类。

App_GlobalResources

现在让我在资源文件中添加一些内容。我们需要替换主页上的三个项目:标题、消息和描述,所以我们在这两个资源文件中添加了三个项目。

Global.Resx

标题和描述是在视图页面中定义的,所以我将更改视图。

复制代码如下: @ { view bag . title=resources . global . home _ index _ title;}h2@ViewBag.Message/h2p@Resources.Global.Home_Index_Desca。global . Home _ Index _ desc link ' http://ASP . net/MVC/a ./p

复制代码如下:公共动作结果索引(){ view bag . message=resources . global . home _ index _ message;返回视图();}

第二,通过URL指定语言。

我们已经将内容转移到资源文件中,但是我们的程序不支持本地化,因为没有可以设置指定语言的地方。为简单起见,我们将使用url来表示我们选择使用的语言(就像微软网站一样),这意味着如果我的URL是http://localhost/en-us/home/index,则网站将体现为英文;而http://localhost/zh-cn/home/index则是简体中文。用户可以在任何停留页面上更改语言,当他想要共享网站时,他会保留语言设置。

为了达到效果,我更改了程序的路由,并在前面添加了一个名为“lang”的路由规则:

复制代码如下:公共静态无效注册路由(路由集合路由){routes。ignoreroute ('{resource})。axd/{ * path info } ');Routes.maproute ('localization ',//路由名称' { lang }/{ controller }/{ action }/{ id } ',//带参数的new { controller=' home ',action=' index ',id=URL parameter . optional }//参数默认值);路线。MapRoute('Default ',//路由名称' {controller}/{action}/{id} ',//带有参数的URL new { controller=' home ',action=' index ',id=URL parameter . optional }//参数默认值);}

请注意,代码中没有设置lang的默认值,也没有删除默认路由。这是为了防止程序无法解析地址,如http://localhost/和http://localhost/home/index。

因为我们需要URL设置语言,所以我们需要在执行每个动作之前编写逻辑。ActionFilter将是一个很好的解决方案。

复制代码代码如下:使用系统;使用系统。集合。通用;使用系统Linq .使用系统网络.使用系统网络。手动音量调节使用系统。穿线;使用系统。全球化;命名空间肖恩许.mvclocialization { public class localization attribute : ActionFilterAttribute { public override void on action executing(action executing context filterContext){ if(filterContext .路由数据。值[' lang ']!=null!字符串isnullorhitespace(filterContext .路由数据。值['郎'].ToString())) { ///从路由数据(网址)里设置语言var lang=filterContext .路由数据。值['郎'].ToString();线程CurrentThread .CurrentUICulture=文化信息.createsspecificculture(lang);} else { ///从甜饼干里读取语言设置var cookie=filterContext .http上下文。请求。饼干[Shaun Xu ].mv时钟化。currentui culture '];var langHeader=字符串。空的;if (cookie!=null) { ///根据甜饼干设置语言langHeader=cookie .价值;线程CurrentThread .CurrentUICulture=文化信息.createsspecificculture(langHeader);} else { ///如果读取甜饼干失败则设置默认语言langHeader=filterContext .请求用户语言[0];线程CurrentThread .CurrentUICulture=文化信息.createsspecificculture(langHeader);} ///把语言值设置到路由值里filterContext .路由数据。values[' lang ']=langHeader;} ///把设置保存进cookie Httpcookie _ cookie=new Httpcookie(' Shaunxu .线程CurrentThread .当前文化。姓名);_cookie .过期时间=日期时间.现在。添加年份(1);filterContext .HttpContext。回应。setcookie(_ cookie);基地。操作执行(过滤器上下文);} }}

我创建了一个继承自滤器的"本地化属性"并重写了操作执行方法的属性,首先检查路由里的值,如果包含了语言设置,则设置当前进程的当前区域值,它指示资源管理器(Visual Studio根据资源文件自动生成)获取相关的值。如果找不到路由里的语言值,则读取甜饼干值来设置,否则使用默认语言。最后把值放进路由,并保存到甜饼干里。

我在家控制器里使用这个属性这样所有行为都可以执行我的本地化逻辑。

复制代码代码如下:使用系统;使用系统。集合。通用;使用系统Linq .使用系统网络.使用系统网络。手动音量调节使用ShowLocal .模型;命名空间ShowLocal .控制器{[本地化]公共类家庭控制器:控制器{公共操作结果索引(){视图包。消息=资源。全局。主页_索引_消息返回视图();}公共操作结果关于(){返回视图();} }}

选择我们可以启动网站然后添加语言在统一资源定位器上看看结果

运行结果

版权声明:ASP.NET MVC的本地化和本地化多语言支持是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。