Preguntaron en los grupos de noticias de asp.net, como obtener la cultura del browser del cliente.
(y como tenia en el tintero/borrador este articulo.. complete con algunos enlaces.. y a publicarlo)
El primer ejemplo:
CultureInfo.CurrentCulture.Name()
Nos devuelve la cultura actual del proceso (Thread) actual, pero no del navegador del cliente.
Posible y «tentativa» solución
Una solución de ejemplo podría ser leyendo la propiedad UserLanguages del Request:
Private Function ObtenerCultura() As String Dim culInfo As System.Globalization.CultureInfo culInfo = System.Globalization.CultureInfo.CreateSpecificCulture(HttpContext.Current.Request.UserLanguages(0)) Return culInfo.ToString End Function
Como la propiedad UserLanguages devuelve un arreglo de idiomas (cadena de caracteres) del cliente.. seleccionamos el primer item, y armamos nuestra cultura
Luego tendríamos que asignarla si queremos que sea la cultura por defecto para por ejemplo manipular fechas, presentar recursos.
En el ejemplo anterior habría que agregar esta línea:
Thread.CurrentThread.CurrentCulture = culInfo
Aquí como se dice, estamos «explicitando» la cultura a utilizar en base al lenguaje del cliente (que leímos del browser)
Solución en NET 2.0
Hace un par de meses nos comentaba esto José M. Alarcón en un articulo:
– Cambio automático de cultura en ASP.NET 2.0 (by José M. Alarcón)
Como y donde podemos cambiar?
Como lo probamos?
En el IE7 tenemos la posibilidad de cambiar el idioma de preferencia….
Tools >> Internet Options >> General >> Button Languages
Si ahora navegamos por el sitio podemos obtener, mediante el código detallado mas arriba:
- CultureInfo.CurrentCulture.Name(): es-AR
- ObtenerCultura(): fr-FR
Por si queda algo en el tintero… CurrentCulture/CurrentUICulture ??
(from MSDN…)
CurrentCulture:
La propiedad CultureInfo.CurrentCulture es una configuración de cada subproceso que determina los formatos predeterminados para la fecha, hora, moneda y números, el criterio de ordenación de texto, las comparaciones de cadenas y la distinción entre mayúsculas y minúsculas. La propiedad CurrentCulture no es una configuración de idioma. Sólo contiene datos relacionados con la configuración estándar para una región geográfica.
Nota: Aquí la palabra clave seria Internacionalización, donde se puede visualizar un dato sensible (por ejemplo la fecha) en forma correcta dependiendo de la cultura.
CurrentUICulture:
La propiedad CultureInfo.CurrentUICulture es una configuración para cada subproceso que devuelve la referencia cultural de la interfaz de usuario actual. La clase ResourceManager utiliza esta propiedad para buscar recursos específicos de la referencia cultural en tiempo de ejecución.
Nota: La palabra clave aquí es la Localización de los recursos
Casi siempre debería ser igual ambas, pero hay momentos que no poseemos por ejemplo al paquete de idioma (Language Pack) de NET 2.0 (que es un paquete de localización para el idioma español por ejemplo)
- Paquete de idioma para español de Microsoft .NET Framework versión 2.0 (x86)
- Paquete de idioma de Microsoft .NET Framework 3.5 (x86, x64)
(…)Los paquetes de idioma de .NET Framework contienen texto traducido, como mensajes de error, para otros idiomas diferentes del inglés. Si no instala un paquete de idioma, estos mensajes se mostrarán en inglés de forma predeterminada. En un único equipo se pueden instalar varios paquetes de para idiomas diferentes. (…)
Y allí la UI no queda con el idioma para por ejemplo traducir los mensajes de algunos webcontrol que definimos, porque «físicamente» no esta instalado.
No queda muy claro? y no… aquí un muy buenos articulo de
- Why we have both CurrentCulture and CurrentUICulture (by Michael S. Kaplan)
- YACVCP (Yet another CurrentCulture vs. CurrentUICulture post) (by Dennis «D.C.» Dietrich)
Enlaces
- CultureInfo.CreateSpecificCulture (Método)
Crea un CultureInfo que representa la referencia cultural específica asociada al nombre especificado. - CultureInfo.CurrentCulture (Propiedad)
Obtiene el CultureInfo que representa la referencia cultural utilizada por el subproceso actual. - HttpRequest.UserLanguages (Propiedad)
Obtiene una matriz de cadenas ordenada con las preferencias de idioma del cliente. - Utilizar la propiedad CurrentCulture
- CultureInfo.CurrentUICulture (Propiedad)
Obtiene el CultureInfo que representa la referencia cultural actual utilizada por el administrador de recursos que busca recursos específicos de la referencia cultural en tiempo de ejecución. - Elemento globalization (Esquema de configuración de ASP.NET)