A la hora de hacer aplicaciones multi-idioma hay muchas cosas a tener en cuenta. Entre ellas la fundamental es averiguar cuál es el idioma que desea emplear el usuario y adaptar tanto la interfaz de usuario como las otras características culturales (números, fechas, etc) al idioma elegido.
Si no disponemos de una lista desplegable, unas banderitas, o algo similar para que los usuarios elijan el idioma, lo que debemos hacer es adaptarnos automáticamente al idioma elgido por éstos en su navegador (Herramientas·Opciones de Internet·General·Idioma).
La lista de idiomas allí presente se envía de manera automática y transparente por el navegador (no sólo IE, sino en todos los navegadores) al servidor en forma de cabeceras HTTP con el nombre "Accept-Language". Estas cabeceras se pueden capturar en el servidor muy fácilmente, y en ASP.NET más todavía con la propiedad UserLanguages, y con ellas trabajamos para conseguir la adaptación automática al idioma.
El código sería básicamente este (dentro de Global.asax):
void Application_BeginRequest (Object sender, EventArgs e)
{
try
{
if (Request.UserLanguages.Length > 0)
{
CultureInfo ci = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
}
catch (ArgumentException)
{
}
}
Como vemos lo que se hace es determinar los idiomas que le interesan al usuario y asignar el primero de ellos al hilo de ejecución actual a través de una clase CultureInfo. Se le asigna esta clase tanto a CurrentCulture como la interfaz de usuario.
Con esto lo que conseguimos es que, luego en las paginas, se considere esta cultura para dar formato a fechas, números y monedas, y que se tengan en cuenta a la hora de hacer ciertas cosas en la interfaz que están relacionadas ya no sólo con el idioma (traducir) sino con las propias características particulares del idioma (es la diferencia entre traducir y localizar).
Si por ejemplo colocamos un calendario en nuestra página y una etiqueta que muestre la fecha seleccionada en el idioma actual, tendríamos estas dos capturas en función de si entramos con una navegador en castellano o uno en inglés de Estados Unidos:
Es interesante fijarse en como, no sólo se han traducido los nombres de los días de la semana o los meses en el calendario o en la fecha mostrada, sino que además se ha cambiado el día en el que se considera que comienza la semana (el domingo en el caso de los EEUU) y la forma de escribir y separar las diferentes partes de la fecha. Lo mismo pasaría con las monedas (algunas van delante otras detrás de la cantidad), los separadores decimales y de miles, y muchos detalles más.
Obviamente todavía nos quedaría traducir los recursos de texto de la aplicación, pero ya estamos ganado bastante.
ASP.NET 2.0: más fácil aún
Lo anterior es bastante fácil pero nos obliga de todos modos a escribir código. En ASP.NET 2.0 se ha simplificado más todavía este asunto presentando una característica denominada cambio automático de cultura. Existe un nuevo atributo de las páginas que sirve para indicar que se gestione de manera automática el idioma del usuario. Basta con poner en la delcaración de una página lo siguiente:
<%@ Page Language="C#" AutoEventWireup="true" Culture="Auto" UICulture="Auto" CodeFile="Cultura.aspx.cs" Inherits="Cultura" %>
Con esto conseguimos exactamente el mismo efecto que el código anterior en una página, y sin tener que escribir código de ningún tipo.
Por supuesto podemos conseguir el efecto automático para toda la aplicación al mismo tiempo introduciendo el sigueinte nodo en web.config:
<globalization culture="auto" uiCulture="auto" />
Es cómodo ¿verdad?