Globalización y localización. Crea Aplicaciones muliidioma de forma sencilla con c# y .net

En estos días en los que las distancias cada vez tienen menos razón de sí y las autopistas de información crecen rápidamente, cada vez es más común tener que realizar aplicaciones multiidioma que nos permitan explotarlas en varios mercados simultáneamente.

Así pues a continuación veremos cómo realizar una aplicación multiidioma de forma (más que) sencilla con asp.net y c#, pero primero veamos algunos términos.

¿A que nos referimos con Globalización y Localización?

Hablamos de globalización cuando nos referimos a todas aquellas acciones relacionadas con el desarrollo de aplicaciones que se adapten a culturas diferentes.

Mientras que la localización hace referencia a todos aquellos procesos de traducción de los distintos recursos para una cultura especifica.

Ejemplo práctico. ¿Cómo crear una web localizada?

Para empezar vamos a tener una web que contenga un título, un par de links para cambiar el idioma y un párrafo.

El HTML necesario sería el siguiente:

<%@ Page
Language="C#"
AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="GlobalizationLocalization.Web._Default"
meta:resourcekey="Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<style type="text/css">
body { font-family:Arial; font-size:12px; }
div#languageBar { text-align:right; border-bottom:1px dotted #ccc; padding:10px; }
</style>
</head>
<body>
<form id="form1" runat="server">
<div id="header">
<h1>
<asp:Literal ID="ltrlTitle" runat="server" meta:resourcekey="ltrlTitle" />
</h1>
</div>
<div id="languageBar">
<asp:LinkButton ID="lbSpanish" runat="server" OnClick="LbSpanish_Click" meta:resourcekey="lbSpanish" />
<asp:LinkButton ID="lbEnglish" runat="server" OnClick="LbEnglish_Click" meta:resourcekey="lbEnglish" />
</div>
<div id="container">
<p>
<asp:Literal ID="ltrlParagraph" runat="server" meta:resourcekey="ltrlParagraph" />
</p>
</div>
</form>
</body>
</html>

Como podemos ver, esta web contiene dos LinkButton que levantaran un evento cuando pulsemos en ellos. En estos eventos va a ser donde vamos a cambiar la cultura.

Ademas cada control de servidor, vemos que contiene una propiedad llamada meta:resourcekey, esta propiedad es la que nos va a permitir mapear los distintos controles a una serie de literales que tendremos en unos ficheros de recursos.

En estos ficheros de recursos, vamos a poder almacenar imágenes, cadenas de texto, iconos etc… y los utilizaremos como repositorio de la información que queramos localizar.

Aspecto de un fichero de recursos

Los ficheros de recursos, los puede generar automáticamente Visual Studio o lo podemos hacer nosotros.

Cuando Visual Studio los genera, recorre la página y añade el meta:resourcekey a cada uno de los controles y su literal analogo en los ficheros de recursos. Para generar los ficheros automáticamente tendremos que ir al menu Tools -> Generate Local Resources (recuerda que esto lo podras hacer siempre y cuando estes en la vista diseño de la página, en la vista source, esta opción no aparece).

Si por el contrario decidimos generarlos nosotros mismos, tendremos que:

  1. Añadir un recurso local al proyecto
  2. Asignale el nombre de la página que quieres que localice (Default.aspx.resx para Default.aspx)
  3. Añadele la cultura al nombre del fichero (Default.aspx.es-ES.resx para Default.aspx), si no le añades la cultura, usara este archivo de recursos cuando no encuentre el especifico de la cultura actual definida en el CurrentTread

Una vez tenemos los archivos de recursos, únicamente tenemos que asignarles los literales correctos a cada una de las entradas del archivo (recuerda que se corresponde con cada uno de los controles).

Ahora veamos la implementación de los eventos que nos cambiaran la cultura:

protected void LbSpanish_Click(object sender, EventArgs e)
{
CultureInfo c = new CultureInfo("es-ES");
setCulture(c);
}
protected void LbEnglish_Click(object sender, EventArgs e)
{
CultureInfo c = new CultureInfo("en-US");
setCulture(c);
}

Y para finalizar, asegurate que la página no hace referencia a ninguna cultura y en el Web.config, añade la cultura por defecto que quieres usar en la app (aunque lo suyo sería guardarsela al usuario en su profile o en una cookie en su defecto) de esta manera:

Fácil verdad, pues esto es todo. Eso si aunque globalizar / localizar una aplicación es muy sencillo se puede complicar, supón que quieres cambiar la cultura en función de un parámetro pasado en el querystring de la página, para ello tendrías que hacer un override del evento InitializeCulture. Sería algo así:

protected override void InitializeCulture()
{
CultureInfo c = null;
string qsCulture = System.Web.HttpContext.Current.Request.QueryString["language"];
if (!string.IsNullOrEmpty(qsCulture))
{
switch (qsCulture)
{
case UIConstants.QS_ENGLISH:
c = new CultureInfo(UIConstants.CULTURE_ENGLISH_VALUE);
break;
case UIConstants.QS_SPANISH:
c = new CultureInfo(UIConstants.CULTURE_SPANISH_VALUE);
break;
case UIConstants.QS_FRANCAIS:
c = new CultureInfo(UIConstants.CULTURE_FRANCAIS_VALUE);
break;
case UIConstants.QS_PORTUGUES:
c = new CultureInfo(UIConstants.CULTURE_PORTUGUES_VALUE);
break;
}
System.Threading.Thread.CurrentThread.CurrentCulture = c;
System.Threading.Thread.CurrentThread.CurrentUICulture = c;
}
base.InitializeCulture();
}

Más adelante, hare un post donde se explica cómo hacer un UrlRewrite con un HttpHandler. Estas dos técnicas combinadas quedan muy aparentes. De momento aquí os dejo el código anteriormente usado por si le queréis echar un vistazo.

Enlaces relacionados

7 pensamientos en “Globalización y localización. Crea Aplicaciones muliidioma de forma sencilla con c# y .net

  1. Hola, muy buen articulo, en estos momentos estoy haciendo una aplicacion que no es multidioma pero el cliente lo que me dice es que los usarios finales tienen maquinas en distintos idiomas configurado, aqui en este caso que me recomiendas, solo configurar en el web config globalizacion, o algo mas???

    • Hola Fernando,

      si lo que quieres es que cuando inicien la aplicación les aparezca en un idioma determinado, puedes intentar obtener la cultura del hilo de ejecución.

      De memoria creo que es System.Threading.Thread.CurrentThread o algo así, el caso es que en el currenThread, tienes una cultura seteada que si no recuerdo mal va en función de la cultura del navegador del cliente.

      Como decía si obtienes la cultura puede hacer el override del InitializeCulture y así tendría la app localizada desde el primer momento.

      Si te sirve con tener la cultura en un idioma, y cuando cambien el idioma que cambie la cultura, mete el idioma por defecto en la configuración.

      Esto es mucho más sencillo.

      Espero que te sea de ayuda, si no es así lo vamos viendo.

      Gracias y saludos.

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