Detección de idioma

Como ya sabréis, ASP.NET es capaz de autodetectar el idioma del navegador de tu visitante. Sin embargo hay ocasiones en que querremos hacer esa detección con nuestro código.

En el ejemplo vamos a detectar todos los idiomas configurados en nuestro navegador y crearemos su CultureInfo correspondiente. Para ello, utilizaremos la propiedad Request.UserLanguages e importaremos el namespace System.Globalization:

detectaIdiomas.cs
        StringBuilder sb = new StringBuilder();

        CultureInfo culture;
        string _lng;
        foreach (string lng in Request.UserLanguages)
        {
            _lng = lng.Split(';')[0];

            try
            {
                culture = new CultureInfo(_lng);
            }
            catch (ArgumentException ae)
            {
                _lng = _lng.Split('-')[0];
                culture = new CultureInfo(_lng);
            }

            sb.Append(culture.NativeName);
            sb.Append("<br />");
        }

        Label1.Text = sb.ToString();


Como vemos el código no es tan inmediato como cabía esperar. Sería todo ideal si valiera con hacer:

    culture = new CultureInfo(lng);

Pero como cada navegador es de su padre y de su madre es necesario poner un par de parches.

El primero de ellos, marcado en rojo, se asegura de coger la información válida de lengua-CULTURA, porque cuando hay varios idiomas configurados en un mismo navegador, a partir del segundo idioma aparece un parámetro extra. Por ejemplo el listado de lenguas de un navegador con tres lenguas podría ser:

    es
    en-US;q:0,7
    fr-FR;q:0,3


El segundo de ellos, marcado en verde, se debe a que algunos navegadores se pasan los estándares por el xxxx, y ofrecen pares "lengua-CULTURA" que no están estandarizados (por ejemplo es-US). Lo único que se hace es que si da error de argumento, sólo coja la lengua y se olvide de la cultura.

Recuerdo que en el ejemplo no solo se muestran las lenguas del navegador sino que se inicia su cultura correspondiente. Esto último no es necesario, y si no lo usamos, quedaría:

muestraIdiomas.cs
        StringBuilder sb = new StringBuilder();

        string _lng;
        foreach (string lng in Request.UserLanguages)
        {
            sb.Append(
lng);
            sb.Append("<br />");
        }

        Label1.Text = sb.ToString();