asp.net - istringlocalizer - net core culture
La mejor forma de manejar URL en un sitio multilingüe en ASP.net (7)
- Use urlrewriteing.net para webforms asp.net, o enrute 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 ... - 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 describiste en la pregunta.
Es bueno hacerlo en este orden: 1. Verifique la URL de Lang param, 2. Revise la cookie, 3. Establezca lang predeterminado - Para el contenido estático (texto, URL de las imágenes) en las páginas, use LocalResources, o Global si el contenido se repite en el sitio. Puedes ver videoscast usando res globales / locales. en www.asp.net
- Prepare db para múltiples idiomas. Pero esa es otra historia.
Necesito hacer un sitio web multilingüe, con direcciones URL como
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
En el pasado, configuraba dos directorios virtuales en IIS, y luego detectaba la URL en global.aspx y cambiaba 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?
editar: la pregunta es sobre el manejo de URL, no sobre recursos, etc.
Además, tenga cuidado con el nuevo 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 parte ¿Qué opción debería usar?
Si está desarrollando una nueva aplicación web ASP.NET que utiliza tecnologías ASP.NET MVC o ASP.NET Dynamic Data, utilice el enrutamiento ASP.NET. 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.
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.
Decidí ir con el nuevo enrutamiento ASP.net.
¿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
Luego 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
Finalmente utilizo default.aspx en la raíz para redirigirme al lang predeterminado utilizado en la lista del navegador.
Tal vez esto se puede hacer con la ruta. Por defecto, 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:
* Blog de Mike Ormond
* Blog de Chris Cavanagh
* MSDN
Para hacer esto con enrutamiento de URL, consulte esta publicación:
Personalmente uso los archivos de recursos .
Muy eficiente, muy simple.
Una especie de tangente, pero en realidad evitaría hacer esto con diferentes caminos, a menos que los diferentes idiomas estén completamente separados unos de otros.
Para el rango 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 desde la configuración de su navegador:
CultureInfo.CurrentUICulture
Luego tu URL para 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.
Usamos esto en Canadá para proporcionar sistemas en inglés y francés al mismo tiempo.
UrlRewriting es el camino a seguir.
Hay un buen artículo en MSDN sobre las mejores formas de hacerlo.