处理在ASP.net一个多语种的网站网址的最佳方式 [英] Best way to handle URLs in a multilingual site in ASP.net

查看:138
本文介绍了处理在ASP.net一个多语种的网站网址的最佳方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to do a multilingual website, with urls like

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

在过去,我会成立两个虚拟目录在IIS中,然后检测global.aspx URL和更改语言根据网址

In the past, I would set up two virtual directories in IIS, and then detect the URL in global.aspx and change the language according to the 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

解决方案更像是一个黑客。我在考虑使用路由的一个新网站。

The solution is more like a hack. I'm thinking about using Routing for a new website.

你知道更好的或者更优雅的方式做到这一点?

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

edit: The question is about the URL handling, not about resources, etc.

推荐答案

我决定去与新的ASP.net路由。

为什么不URL重写协作?因为我不想改变清洁网址路由给你。

I decided to go with the new ASP.net Routing.
Why not urlRewriting? Because I don't want to change the clean URL that routing gives to you.

下面是code:

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类:

Then LangRouteHandler.vb class:

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中工作(也许它工作在服务器)

Finally I use the default.aspx in the root to redirect to the default lang used in the browser list.
Maybe this can be done with the route.Defaults, but don't work inside Visual Studio (maybe it works in the server)

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

有些来源:

  * <一个href=\"http://blogs.msdn.com/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx\">Mike奥蒙德的博客

  * 克里斯·卡瓦纳的博客

  * MSDN

这篇关于处理在ASP.net一个多语种的网站网址的最佳方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆