使用 MVC 路由进行本地化
一种简单高效的方法,使用路由本地化 MVC 网站。
引言
本教程将帮助你使用路由作为语言选择的基础值来本地化你的 MVC 应用程序。
基础操作
创建一个新的 MVC2 应用程序。 你将得到如下项目结构

现在要本地化你的应用程序,你只需创建特殊的App_GlobalResources文件夹,并为你的string
创建两个或更多的资源文件,然后更改值

代码
为了使本地化工作,我们需要稍微修改默认路由,在路由 URL 前添加一个语言参数,并修改默认值,以便将语言设置为用户默认的 Windows 语言
' Note: For instructions on enabling IIS6 or IIS7 classic mode,
' visit http://go.microsoft.com/?LinkId=9394802
Public Class MvcApplication
Inherits System.Web.HttpApplication
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
' MapRoute takes the following parameters, in order:
' (1) Route name
' (2) URL with parameters
' (3) Parameter defaults
routes.MapRoute("Default", "{language}/{controller}/{action}/{id}",
New With {.language = My.Application.Culture.Name,
.controller = "Home",
.action = "Index",
.id = UrlParameter.Optional})
End Sub
Sub Application_Start()
AreaRegistration.RegisterAllAreas()
RegisterRoutes(RouteTable.Routes)
End Sub
End Class
接下来,为了告诉我们的控制器读取这些路由值并根据路由值更改 Culture
和 UICulture
,我们需要创建一个从基本控制器继承并重写其 OnActionExecuting
方法的Class
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
该方法将执行与原始方法相同的功能,并读取第一个路由值以获取语言string
,例如
https://:55308/hr-HR/Home/About 将尝试读取克罗地亚资源文件,如果路由值是一个无效值,它将恢复为英语。
现在,为了使所有这些工作正常,你的所有控制器都必须继承自 GlobalController
,因此我们相应地更改 HomeController
,并通过 Resources.Strings
打印默认的欢迎消息。
<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
总而言之,这将根据你的 Windows 语言更改应用程序的 Culture
,但是手动更改呢?!
为此,我们可以添加一个组合框、一些标志或只是两个基本的链接到母版页,以切换语言路由值
<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>
结论
Culture
和 UICulture
设置不会存储在会话、存储或其他任何地方,它只是通过 URL 路由工作。菜单项和按钮没有硬编码链接,切换变得非常容易。
我希望这篇文章能帮助你以 MVC 的方式进行本地化。我也欢迎建议和改进。
历史
- 2010 年 7 月 12 日:初始发布