netcore net istringlocalizer español asp and asp.net internationalization multilingual

asp.net - istringlocalizer - net core culture



La mejor forma de manejar URL en un sitio multilingüe en ASP.net (7)

  1. 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 ...
  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 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
  3. 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
  4. 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?

  1. 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.

  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.


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




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.