2008-09-17 14 views
7

tengo que hacer un sitio web multilingüe, con URLs comomejor manera de manejar las URL de un sitio multilingüe en ASP.net

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

En el pasado, habría establecido dos directorios virtuales en IIS, y luego detectar la URL en global.aspx y cambiar el idioma de acuerdo con 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 truco. Estoy pensando en usar Enrutamiento para un nuevo sitio web.

¿Conoces una forma mejor o más elegante de hacerlo?

edición: La pregunta se refiere al manejo de URL, no se trata de recursos, etc.

Respuesta

7

yo decidimos ir con el nuevo ASP.net enrutamiento.
¿Por qué no urlRewriting? Porque no quiero cambiar la URL limpia que te da el enrutamiento.

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 

Entonces clase 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 

Por último uso el default.aspx en la raíz para redirigir a los valores de lang utiliza en la lista del navegador .
Quizás esto se puede hacer con la ruta.Predeterminados, pero no funcionan dentro de Visual Studio (tal vez funciona 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's blog
* Chris Cavanagh’s Blog
* MSDN

0

I personnaly uso the resources files.

Muy eficiente, muy simple.

+0

uhh? Estamos hablando de manejar las urls y mapear a un lenguaje específico. –

+0

Sí, pero con los archivos de recursos, no tiene que asignar URL a los idiomas, por lo tanto, problema resuelto. – thomasb

1
  1. Utilice urlrewriteing.net para asp.net webforms o enrutamiento con mvc. Reescriba www.site.com/en/something.aspx a url: page.aspx? Lang = en.
    UrlRewriteing.net se puede configurar fácilmente a través de regex en web.config. También puede usar el enrutamiento con formularios web ahora, probablemente sea similar ...
  2. con formularios web, deje que cada página aspx herede de la clase BasePage, que luego hereda de la clase Page.
    En la clase BasePage anula "InitializeCulture()" y establece la información cultural en el hilo, como describió en la pregunta.
    Es bueno hacerlo en este orden: 1. Verifique la URL de Lang param, 2. Revise la cookie, 3. Establezca lang predeterminado
  3. Para contenido estático (texto, fotos url) en páginas use LocalResources, o Global if content se repite en el sitio. Puedes ver videoscast usando res globales/locales. en www.asp.net
  4. Prepare db para varios idiomas. Pero esa es otra historia.
0

Tipo de una tangente, pero De hecho, evitaría hacer esto con diferentes caminos, a menos que los diferentes idiomas estén completamente separados entre sí.

Para la clasificación de Google, o para los usuarios que comparten URL (una de las grandes ventajas de las URL 'limpias'), desea que la dirección se mantenga lo más constante posible.

Puede encontrar las preferencias de idioma de los usuarios respecto de la configuración del navegador:

CultureInfo.CurrentUICulture 

Luego, su dirección URL de Inglés o Español:

www.domain.com/products/newproduct

La misma dirección para cualquier idioma, pero el usuario obtiene la página en el idioma elegido.

Utilizamos esto en Canadá para proporcionar sistemas en inglés y francés al mismo tiempo.

+0

No estoy de acuerdo. 1. Su contenido nunca será spidered en ambos idiomas. 2. No puede compartir una url en un idioma específico. –

+0

Entonces, ¿en su ejemplo inicial debería ser www.dominio.com/es/casa.aspx para español? – Keith

+0

No, el nombre de la url será el mismo (de hecho, es el mismo archivo) pero el contenido y las metaetiquetas estarán en español para que las personas puedan encontrar la búsqueda de contenido en español o en inglés. Por cierto, Home será más como Inicio que Casa :) –

0

También, ten cuidado nueva IIS 7.0 - Reescritura de URL. Excelente artículo aquí http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

Me gustó esta pieza ¿Qué opción usar?

  1. Si está desarrollando una nueva aplicación Web ASP.NET que utiliza tecnologías ya sea ASP.NET MVC o datos dinámicos de ASP.NET, ASP.NET utilizar enrutamiento. Su aplicación se beneficiará del soporte nativo para URL limpias, incluida la generación de URL limpias para los enlaces en sus páginas web. Tenga en cuenta que el enrutamiento ASP.NET aún no es compatible con las aplicaciones estándar de formularios web, aunque existen planes para respaldarlo en el futuro.

  2. Si ya tiene una aplicación web ASP.NET heredada y no desea cambiarla, utilice el módulo de reescritura de URL. El módulo de reescritura de URL le permite traducir URL de motor de búsqueda en un formato que su aplicación utiliza actualmente. Además, le permite crear reglas de redirección que pueden usarse para redirigir a los rastreadores del motor de búsqueda para limpiar las URL. http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

Gracias, Maulik.

Cuestiones relacionadas