2009-10-27 15 views
28

Estoy empezando a localizar una aplicación ASP.Net MVC. La mayoría de las cadenas se definirán en los archivos de recursos y se recuperarán a través del Matt's Localization Helpers. Otras cadenas se deben almacenar en una base de datos.ASP.NET MVC: ¿Cuándo configurar Thread.CurrentThread.CurrentUICulture?

Mi Pregunta: ¿Debo establecer CurrentUICulture temprano en la canalización de solicitud y el uso que en toda la aplicación, o utilizar directamente Request.UserLanguages[0] cuando sea necesario?

En este momento Estoy pensando que debo configurar CurrentUICulture en Application_BeginRequest. La implementación sería algo como esto:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    var cultureName = HttpContext.Current.Request.UserLanguages[0]; 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName); 
} 

Es este el mejor lugar para establecer CurrentUICulture y es Request.UserLanguages[0] el mejor lugar para obtener esa información?


Actualización:

Ariel's después me di cuenta de que esto puede ser definido sin código, usando web.config

<system.web> 
    <!--If enableClientBasedCulture is true, ASP.NET can set the UI culture and culture for a Web page automatically, based on the values that are sent by a browser.--> 
    <globalization enableClientBasedCulture="true" culture="auto:en-US" uiCulture="auto:en"/> 

Respuesta

13

Aquí está una muestra utilizando un HttpModule:

http://weblogs.manas.com.ar/smedina/2008/12/17/internationalization-in-aspnet-mvc/

Otras opciones, crear una clase de controlador base e implementar allí la lógica de localización. O use un atributo de filtro de acción, pero deberá recordar agregarlo en cada controlador o combinar este enfoque con la clase de controlador base.

+1

great link! Gracias. –

+0

¿Este método sigue siendo válido con la llegada de AsyncController en la versión más reciente de ASP.NET MVC? Debido a que técnicamente podrían no funcionar bajo el mismo hilo que 'Thread.CurrentThread'. –

+0

No fuera de la caja. Ver http: // stackoverflow.com/questions/20601578/async-webapi-thread-currentculture –

6

Request.UserLanguages ​​[0] solo puede ser una sugerencia del idioma que los usuarios desean ver. La mayoría de los usuarios no saben dónde cambiar el idioma del navegador.

Otro punto: no se asegure de que Request.UserLanguages ​​[0] es un lenguaje válido. Incluso puede ser nulo. (No estoy seguro de qué bots tienen)

Por lo general, tiene un selector de idioma en la página. Una vez que un usuario ha seleccionado un idioma allí, se almacena en una cookie, sesión o url. Me gusta usar url porque creo que se ve bonito.

Si un usuario ve su página sin haber configurado un idioma en su página, debe verificar si Request.UserLanguages ​​[0] es un idioma que admite y establecer Thread.CurrentThread.CurrentUICulture.

Uso un filtro para configurar Thread.CurrentThread.CurrentUICulture. Eso está bien siempre que ningún otro filtro esté usando Thread.CurrentThread.CurrentUICulture. De lo contrario, necesitaría establecer el orden de ejecución correcto para los filtros.

También uso Matts helper y funcionó muy bien hasta ahora.

Cuestiones relacionadas