Informática e Internet

Obtener CultureInfo a partir de la propiedad Page.Culture

Una parte importante de las aplicaciones web y que casi nunca se tiene en cuenta es la referente a la presentación de la información basándose en la configuración regional del usuario.

En ASP.NET tenemos medios y técnica que nos facilitan todas las tareas referentes a la globalización, pero el problema surge cuando no es difícil establecer la configuración regional de nuestro usuario. Veamos cómo se puede llegar a este escenario.

La inmensa mayoría de los navegadores, por no decir todos, permiten al usuario establecer los idiomas en los que prefiere ver una página en caso de que haya varios idiomas para elegir. Si el usuario ha creado una lista de estos idiomas nosotros como desarrolladores no tendremos problemas a la hora de establecer la configuración regional que emplearemos para validar los datos que el usuario nos proporcione. Para ellos basta con implementar el siguiente código

if(Request.UserLanguages != null) {
CultureInfo provider = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

}

La razón por la que empleo el método CreateSpecificCulture es que para poder validar datos con algún tipo de formato (números, fechas, etc) necesitamos una cultura de tipo específico, es decir, que indique el país y la región, como por ejemplo (es-es). Las culturas llamadas neutrales sólo hacen referencia al país omitiendo cualquier referencia a una región, que sería el caso de (es)

De esta manera ya podría usar el método TryParse a la hora de recoger el valor esperado. De esta forma permitimos al usuario que introduzca información pudiendo emplear la notación numérica o de fechas de su país. Veamos un ejemplo de uso del método TryParse:

NumberStyles estilo = NumberStyles.Number;
IFormatProvider provider = null;

if(Request.UserLanguages == null) {
provider = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

}

double valor;

bool valor_ok = Double.TryParse(this.TextBox.Text, estilo, provider, out cobertura);

Se le pasa como parámetros el string que queremos convertir, el estilo numérico que esperamos encontrar, en este caso es para números de todo tipo, la referencia cultural que debemos emplear a la hora de parsear la cadena y una variables donde dejar el resultado de la operación de parseo

Devuelve un bool que nos indica si la operación de parseo ha finalizado con éxito o si por el contrario ha habido algún error.

Pero ¿y si el usuario no ha especificado una lista de idiomas en su navegador? En este caso la solución es un poco más laboriosa.

Para empezar no podremos usar la propiedad UserLanguages de la clase HttpRequest ya que en este caso el array es nulo, y si recuperamos el valor de la propiedad Culture de la páginas ASP.NET veremos que el nombre que nos da, por ejemplo Español (España) no podemos usarlo ni en el constructor ni en ninguno de los método estáticos de la clase CultureInfo, así que, cómo podemos recuperar un objeto de la clase CultureInfo cuando sabemos que configuración emplea nuestro usuario pero a priori no tenemos nada para poder recuperarla.

Lo primero que tenemos que hacer es recuperar todas las culturas disponibles usando el método estático GetCultures de la clase CultureInfo. Una vez que tenemos esto tendremos que buscar una cuya propiedad DisplayName coincida con el valor que se encuentra en la propiedad Culture de nuestra página ASP.NET, y para ayudarnos en la labor de búsqueda nos apoyaremos en LINQ. Vamos a ver como queda todo esto junto.

public static CultureInfo ObtenerCultura(string displayName) {
CultureInfo cultura = null;
CultureInfo[] culturas = CultureInfo.GetCultures(CultureTypes.AllCultures);

try {
cultura = (from c in culturas
where c.DisplayName == displayName
select c).First<CultureInfo>();
} catch(Exception) {
cultura = CultureInfo.InvariantCulture;
}

return cultura;
}

Como vemos en caso que no encuentre la configuración regional del usuario entre las disponibles en el servidor devolveremos la InvariantCulture, disponible en todos los sistemas y que deriva de la configuración inglesa.

Anuncios

Un comentario en “Obtener CultureInfo a partir de la propiedad Page.Culture

  1. Cuando preguntas:

    if(Request.UserLanguages == null) {…}

    ¿Esta pregunta no es para saber si la lista de idiomas está vacía? En ese caso ¿No debería ser por la negativa? Algo así como:

    if(Request.UserLanguages!=null){…}

    Gracias por el aporte.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s