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

时间:2020-03-05 18:58:40  来源:igfitidea点击:

我需要做一个多语言的网站,网址是

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处理,而不是资源等。

解决方案

回答

我个人使用资源文件。

非常有效,非常简单。

回答

  • 将urlrewriteing.net用于asp.net Web表单,或者使用mvc进行路由。将www.site.com/en/something.aspx重写为url:page.aspx?lang = en。 UrlRewriteing.net可以通过web.config中的regex轻松配置。我们现在也可以在Webforms中使用路由,这可能很相似...
  • 使用webforms,让每个aspx页面都继承自BasePage类,然后继承自Page类。在BasePage类中,覆盖" InitializeCulture()",并将区域性信息设置为线程,如我们所描述的那样。最好按以下顺序进行操作:1.检查lang参数的url,2.检查cookie,3.设置默认lang
  • 对于页面上的静态内容(文本,图片url),请使用LocalResources;如果内容在站点之间重复,则使用Global。我们可以使用全球/本地资源观看视频广播。在www.asp.net上
  • 为数据库准备多种语言。但这是另一个故事。

回答

UrlRewriting是必经之路。

有关MSDN的最佳方法,有一篇不错的文章。

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

回答

我决定使用新的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

最后,我在根目录中使用default.aspx重定向到浏览器列表中使用的默认lang。
也许可以使用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的博客
    *克里斯·卡瓦纳斯(Chris Cavanaghs)博客
  • MSDN

回答

有点切线,但实际上我会避免使用不同的路径来执行此操作,除非不同的语言彼此完全独立。

对于Google排名或者共享URL的用户(纯净URL的一大优势),我们希望地址尽可能保持不变。

我们可以从他们的浏览器设置中找到用户的语言首选项:

CultureInfo.CurrentUICulture

然后输入英语或者西班牙语网址:

www.domain.com/products/newproduct

任意一种语言的地址都相同,但是用户使用他们选择的语言来获取页面。

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

回答

为此,请参考这篇文章:

带有URL路由的友好URL

回答

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

我喜欢这部分
我们应该使用哪个选项?

  • 如果要开发使用ASP.NET MVC或者ASP.NET动态数据技术的新ASP.NET Web应用程序,请使用ASP.NET路由。应用程序将受益于对纯URL的本地支持,包括为网页中的链接生成纯URL。请注意,尽管将来有计划支持ASP.NET路由,但它尚不支持标准的Web窗体应用程序。
  • 如果我们已经有旧版ASP.NET Web应用程序并且不想更改它,请使用URL重写模块。 URL重写模块使我们可以将搜索引擎友好的URL转换为应用程序当前使用的格式。此外,它还允许我们创建重定向规则,该规则可用于将搜索引擎搜寻器重定向到干净的URL。 http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

谢谢,
毛利克。