MVC应用程序的本地化实践

在全球化的今天,为应用程序提供多语言支持变得越来越重要。本文将介绍如何在MVC应用程序中实现本地化,包括项目结构的设置、代码的修改、文化和UI文化设置的动态切换等。

创建MVC2应用程序

首先,需要创建一个新的MVC2应用程序。这将为提供基本的项目结构。为了实现本地化,需要创建一个特殊的App_GlobalResources文件夹,并为字符串创建两个或更多的资源文件,然后更改这些值。

代码修改

为了让本地化工作,需要稍微修改一下默认的路由,添加一个语言参数在路由URL前面,并修改默认值,以便语言设置为用户的默认Windows语言。

Public Class MvcApplication Inherits System.Web.HttpApplication Shared Sub RegisterRoutes(ByVal routes As RouteCollection) routes.IgnoreRoute("{resource}.axd/{*pathInfo}") routes.MapRoute( "Default", "{language}/{controller}/{action}/{id}", New With {.language = My.Application.Culture.Name, .controller = "Home", .action = "Index", .id = UrlParameter.Optional} ) End Sub Shared Sub Application_Start() AreaRegistration.RegisterAllAreas() RegisterRoutes(RouteTable.Routes) End Sub End Class

注意:对于启用IIS6或IIS7经典模式的说明,请访问

控制器文化设置

为了告诉控制器读取这些路由值并根据路由值更改Culture和UICulture,需要创建一个类,该类将继承自基控制器并覆盖其OnActionExecuting方法。

Public Class GlobalController Inherits System.Web.Mvc.Controller Protected Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext) MyBase.OnActionExecuting(filterContext) If RouteData.Values.First.Value IsNot Nothing Then Try My.Application.ChangeCulture(RouteData.Values.First.Value) My.Application.ChangeUICulture(RouteData.Values.First.Value) Catch ex As Globalization.CultureNotFoundException My.Application.ChangeCulture("en-US") My.Application.ChangeUICulture("en-US") End Try End If End Sub End Class

该方法将执行与原始方法相同的操作,并读取第一个路由值的语言字符串。例如:http://localhost:55308/hr-HR/Home/About将尝试读取克罗地亚资源文件,如果路由值是无效值,它将回退到英语。

控制器的更改

现在,为了让所有控制器都继承GlobalController,需要相应地更改HomeController,并打印出默认的欢迎消息。

<HandleError()> _ Public Class HomeController Inherits GlobalController Function Index() As ActionResult ViewData("Message") = Resources.Strings.WelcomeText Return View() End Function Function About() As ActionResult ViewData("Message") = Resources.Strings.AboutText Return View() End Function End Class

手动更改语言

为了实现这一点,可以在母版页上添加一个组合框、一些旗帜或只是两个基本链接来切换语言路由值。

<ul id="menu"> <li> <%: Html.ActionLink("Hrvatski", My.Request.RequestContext.RouteData.Values.ElementAt(2).Value.ToString, New With {.language = "hr-HR"}) %> </li> <li> <%: Html.ActionLink("English", My.Request.RequestContext.RouteData.Values.ElementAt(2).Value.ToString, New With {.language = "en-US"}) %> </li> </ul>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485