65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MVC 路由进行本地化

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2010年7月12日

CPOL

2分钟阅读

viewsIcon

27335

一种简单高效的方法,使用路由本地化 MVC 网站。

引言

本教程将帮助你使用路由作为语言选择的基础值来本地化你的 MVC 应用程序。

基础操作

创建一个新的 MVC2 应用程序。 你将得到如下项目结构

Proj1

现在要本地化你的应用程序,你只需创建特殊的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 日:初始发布
© . All rights reserved.