La mejor manera de manejar las direcciones Url de un sitio multilingüe en ASP.net
-
01-07-2019 - |
Pregunta
Necesito hacer un sitio web multilingüe, con urls como
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
En el pasado, me gustaría configurar dos directorios virtuales en IIS y, a continuación detectar la dirección URL en el mundial.aspx y cambiar el idioma de acuerdo a la 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
La solución es más como un hack.Estoy pensando en usar Enrutamiento para un nuevo sitio web.
¿Conoce usted a un mejor o de forma más elegante de hacerlo?
editar:La pregunta es sobre el manejo de URL, no se trata de recursos, etc.
Solución
Me decidí a ir con el nuevo ASP.net de Enrutamiento.
¿Por qué no urlRewriting?Porque no quiero cambiar la limpieza URL que el enrutamiento de la da.
Aquí está el código:
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
Luego LangRouteHandler.vb clase:
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
Por fin puedo usar el valor predeterminado.aspx en la raíz a la que redirigir el defecto lang utiliza en el navegador de la lista.
Tal vez esto se puede hacer con la ruta.Los valores predeterminados, pero que no funcionan dentro de Visual Studio (que tal vez se trabaja en el servidor)
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
Algunas fuentes:
* Mike Ormond del blog
* Chris Cavanagh Blog
* MSDN
Otros consejos
- Uso urlrewriteing.net para asp.net webforms, o de enrutamiento con mvc.Reescribir www.site.com/en/something.aspx url:página.aspx?lang=es.
UrlRewriteing.net se puede configurar fácilmente a través de regex en la web.config.También puede utilizar el enrutamiento con webforms ahora, es probable que sea similar... - con webforms, que cada página aspx hereda de BasePage de clase, que luego se hereda de la Página de la clase.
En BasePage clase anular "InitializeCulture()" y establecer la cultura de la información en el hilo, como se describe en la pregunta.
Es bueno hacerlo en este orden:1.compruebe la dirección url para Lang param, 2.verificación de la galleta, 3.set default lang - Para el contenido estático (texto, fotos url) de las páginas de uso LocalResources,o Global si el contenido es repetitivo a través del sitio.Usted puede ver videocast sobre el uso global/local res.en www.asp.net
- Preparar db para múltiples idiomas.Pero esa es otra historia.
Yo personnaly uso los archivos de recursos.
Muy eficiente, muy simple.
UrlRewriting es el camino a seguir.
Hay un buen artículo de MSDN sobre las mejores maneras de hacerlo.
Tipo de una tangente, pero me gustaría realmente evitar hacer esto con trayectorias diferentes, a menos que las diferentes lenguas son completamente contenido separados el uno del otro.
Para Google rank, o para los usuarios compartir una Url (una de las grandes ventajas de 'limpiar' Url), desea que la dirección a mantenerse lo más constante posible.
Usted puede encontrar los usuarios de las preferencias de idioma de la configuración de su navegador:
CultureInfo.CurrentUICulture
A continuación, la dirección URL para el inglés o el español:
www.domain.com/products/newproduct
Misma dirección para cualquier idioma, pero que el usuario llegue a la página en el idioma que elijan.
Utilizamos esta en Canadá para proporcionar sistemas de inglés y francés al mismo tiempo.
Para ello con la dirección URL de Enrutamiento, consulte este post:
También, ten cuidado con las nuevas IIS 7.0 - la Reescritura de URL.Excelente artículo aquí http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Me gustó esta parte La Opción Que Se Debe Utilizar?
Si usted está desarrollando un nuevo ASP.NET aplicación Web que utiliza ASP.NET MVC o ASP.NET Datos Dinámicos de las tecnologías, el uso de ASP.NET de enrutamiento.Su aplicación se beneficiarán de soporte nativo para URLs limpias, incluyendo la generación de URLs limpias para los enlaces en sus páginas Web.Tenga en cuenta que ASP.NET enrutamiento no admite el estándar de las aplicaciones Web Forms sin embargo, aunque existen planes para él en el futuro.
Si usted ya tiene un legado ASP.NET aplicación Web y no desea cambiar, utilice el URL rewrite module.La URL rewrite module permite traducir motor de búsqueda URLs amigables en un formato que la aplicación utiliza en la actualidad.Además, permite crear reglas de redirección que puede utilizarse para redirigir la búsqueda-rastreadores de motores de URLs limpias.http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Gracias, Maulik.