在全球化的今天,为应用程序提供多语言支持变得越来越重要。本文将介绍如何在MVC应用程序中实现本地化,包括项目结构的设置、代码的修改、文化和UI文化设置的动态切换等。
首先,需要创建一个新的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>