【问题标题】:Best way to handle URLs in a multilingual site in ASP.net在 ASP.net 中处理多语言站点中 URL 的最佳方法
【发布时间】:2008-09-17 12:08:16
【问题描述】:

我需要做一个多语种网站,网址如

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

解决方案更像是一种 hack。我正在考虑将路由用于新网站。

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

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

【问题讨论】:

    标签: asp.net internationalization multilingual


    【解决方案1】:

    我决定使用新的 ASP.net 路由。
    为什么不url重写?因为我不想更改路由提供给您的干净 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
    

    最后我使用根目录中的 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

    【讨论】:

      【解决方案2】:
      1. 将 urlrewriteing.net 用于 asp.net 网络表单,或使用 mvc 进行路由。将 www.site.com/en/something.aspx 改写为 url: page.aspx?lang=en.
        UrlRewriteing.net 可以通过 web.config 中的正则表达式轻松配置。你现在也可以在 webforms 中使用路由,可能类似...
      2. 使用 webforms,让每个 aspx 页面都继承自 BasePage 类,然后继承自 Page 类。
        在 BasePage 类中覆盖“InitializeCulture()”并将文化信息设置为线程,就像您在问题中描述的那样。
        最好按以下顺序执行此操作:1. 检查 url 以获取 Lang 参数,2. 检查 cookie,3. 设置默认语言
      3. 对于页面上的静态内容(文本、图片 url),使用 LocalResources,如果内容跨站点重复,则使用 Global。您可以观看有关使用全局/本地资源的视频广播。在 www.asp.net 上
      4. 为多种语言准备数据库。但那是另一回事了。

      【讨论】:

        【解决方案3】:

        我个人使用the resources files。

        非常高效,非常简单。

        【讨论】:

        • 呃?我们正在讨论处理 url 并映射到特定语言。
        • 是的,但是使用资源文件,您不必将 url 映射到语言,因此,问题解决了。
        【解决方案4】:

        UrlRewriting 是要走的路。

        MSDN 上有一篇很好的文章,介绍了最好的方法。

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

        【讨论】:

        • 我不喜欢 UrlRewriting,因为它会更改 URL
        【解决方案5】:

        有点切线,但我实际上会避免使用不同的路径来执行此操作,除非不同语言的内容完全相互分离。

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

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

        CultureInfo.CurrentUICulture
        

        然后你的英文或西班牙文网址:

        www.domain.com/products/newproduct

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

        我们在加拿大使用它来同时提供英语和法语的系统。

        【讨论】:

        • 我不同意。 1. 您的内容永远不会被两种语言抓取。 2. 不能分享指定语言的url。
        • 那么在您的初始示例中,西班牙语应该是 www.domain.com/es/casa.aspx 吗?
        • 不,url 的名称将是相同的(实际上是同一个文件),但内容和元标记将是西班牙文,因此人们可以找到搜索西班牙文内容或英文内容。顺便说一句,Home 将更像 Inicio 而不是 Casa :)
        • 您正在剥夺用户的控制权。坏的。看看苹果做了什么。国家和语言的子目录。 Apple 的产品在各个国家/地区都尽可能保持一致。以用户的语言动态显示内容听起来不错,但在实际意义上呢?
        • 这是如何从他们手中夺走控制权的?如果他们愿意,只需点击几下即可更改他们的语言设置,而正确的语言是毫不费力的。
        【解决方案6】:

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

        Friendly URLS with URL Routing

        【讨论】:

          【解决方案7】:

          另外,请注意新的 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 重写模块。 URL-rewrite 模块允许您将搜索引擎友好的 URL 转换为您的应用程序当前使用的格式。此外,它还允许您创建可用于将搜索引擎爬虫重定向到清理 URL 的重定向规则。 http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

          谢谢, 毛利克。

          【讨论】:

            猜你喜欢
            • 2021-10-30
            • 1970-01-01
            • 1970-01-01
            • 2010-09-16
            • 2011-08-10
            • 1970-01-01
            • 1970-01-01
            • 2012-03-12
            • 1970-01-01
            相关资源
            最近更新 更多