在ASP.net中处理多语言网站中的URL的最佳方法

时间:2008-09-17 12:08:16

标签: asp.net internationalization multilingual

我需要建立一个多语言网站,网址如

www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish

过去,我会在IIS中设置两个虚拟目录,然后在global.aspx中检测URL并根据URL更改语言

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim lang As String
    If HttpContext.Current.Request.Path.Contains("/en/") Then
        lang = "en"
    Else
        lang = "es"
    End If
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)


End Sub

解决方案更像是黑客攻击。我正在考虑将路由用于新网站。

你知道更好或更优雅的方式吗?

编辑:问题是关于URL处理,而不是关于资源等。

7 个答案:

答案 0 :(得分:7)

我决定使用新的ASP.net路由 为什么不urlRewriting?因为我不想更改路由提供给您的干净URL。

以下是代码:

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Code that runs on application startup
    RegisterRoutes(RouteTable.Routes)
End Sub


Public Sub RegisterRoutes(ByVal routes As RouteCollection)
    Dim reportRoute As Route
    Dim DefaultLang As String = "es"

    reportRoute = New Route("{lang}/{page}", New LangRouteHandler)
    '* if you want, you can contrain the values
    'reportRoute.Constraints = New RouteValueDictionary(New With {.lang = "[a-z]{2}"})
    reportRoute.Defaults = New RouteValueDictionary(New With {.lang = DefaultLang, .page = "home"})

    routes.Add(reportRoute)
End Sub

然后LangRouteHandler.vb类:

Public Class LangRouteHandler
     Implements IRouteHandler

  Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) As System.Web.IHttpHandler _
      Implements System.Web.Routing.IRouteHandler.GetHttpHandler

    'Fill the context with the route data, just in case some page needs it
    For Each value In requestContext.RouteData.Values
        HttpContext.Current.Items(value.Key) = value.Value
    Next

    Dim VirtualPath As String
    VirtualPath = "~/" + requestContext.RouteData.Values("page") + ".aspx"

    Dim redirectPage As IHttpHandler
    redirectPage = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, GetType(Page))
    Return redirectPage

  End Function
End Class

最后,我使用root中的default.aspx重定向到浏览器列表中使用的默认语言。
也许这可以通过route.Defaults来完成,但是在Visual Studio中不起作用(也许它可以在服务器中运行)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim DefaultLang As String = "es"
    Dim SupportedLangs As String() = {"en", "es"}
    Dim BrowserLang As String = Mid(Request.UserLanguages(0).ToString(), 1, 2).ToLower
    If SupportedLangs.Contains(BrowserLang) Then DefaultLang = BrowserLang

    Response.Redirect(DefaultLang + "/")
End Sub

有些消息来源:
  * Mike Ormond's blog
  * Chris Cavanagh’s Blog
  * MSDN

答案 1 :(得分:1)

  1. 将urlrewriteing.net用于asp.net webforms,或使用mvc进行路由。将www.site.com/en/something.aspx改写为url:page.aspx?lang = en。
    可以通过web.config中的regex轻松配置UrlRewriteing.net。你现在也可以使用webforms路由,它可能类似......
  2. 使用webforms,让每个aspx页继承自BasePage类,然后继承自Page类 在BasePage类中重写“InitializeCulture()”并将文化信息设置为线程,就像您所描述的那样 按顺序执行此操作是很好的:1。检查Lang param的URL,2。检查cookie,3。设置默认lang
  3. 对于页面上的静态内容(text,pics url),使用LocalResources,如果内容在网站上重复,则使用Global。您可以使用全局/本地资源观看视频广播。在www.asp.net
  4. 为多种语言准备db。但这是另一个故事。

答案 2 :(得分:0)

我个人使用the resources files。非常高效,非常简单。

答案 3 :(得分:0)

UrlRewriting是要走的路。

在MSDN上有一篇关于最佳方法的文章。

http://msdn.microsoft.com/en-us/library/ms972974.aspx

答案 4 :(得分:0)

有点切线,但我实际上避免用不同的路径做这个,除非不同的语言完全相互分离。

对于Google排名或共享网址的用户(“干净”网址的一大优势),您希望地址尽可能保持不变。

您可以从浏览器设置中找到用户的语言偏好设置:

CultureInfo.CurrentUICulture

然后是您的英语或西班牙语网址:

  

www.domain.com/products/newproduct

任何语言的地址相同,但用户以所选语言获取页面。

我们在加拿大使用此功能同时提供英语和法语系统。

答案 5 :(得分:0)

要使用URL路由执行此操作,请参阅以下文章:

Friendly URLS with URL Routing

答案 6 :(得分:0)

另外,请注意新的IIS 7.0 - URL重写。这里有优秀的文章http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

我喜欢这部分 您应该使用哪种选项?

  1. 如果您正在开发使用ASP.NET MVC或ASP.NET动态数据技术的新ASP.NET Web应用程序,请使用ASP.NET路由。您的应用程序将受益于对干净URL的本机支持,包括为网页中的链接生成干净的URL。请注意,ASP.NET路由不支持标准Web窗体应用程序,尽管计划在将来支持它。

  2. 如果您已有旧的ASP.NET Web应用程序但不想更改它,请使用URL-rewrite模块。 URL重写模块允许您将搜索引擎友好的URL转换为应用程序当前使用的格式。此外,它还允许您创建可用于将搜索引擎抓取工具重定向到干净URL的重定向规则。 http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

  3. 谢谢, Maulik。