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

Mayo 9, 2008

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

Entry Filed under: programación. Etiquetas: , , , , , .

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


¿Qué es esto?

Este es el blog personal de César Pérez y su temática va a ser lo relacionado con el desarrollo web, ya sea usabilidad, diseño o programación. Espero que os guste. ;-)

Categorías

Archivos

Entradas recientes

Posts Más Vistos

Agradecimientos

Lo que leo

Participo en

Tags

Meta