Cómo implementar multiidioma en 5 pasos

24 Jun

Antes de conocer como funcionaba el multiidioma de un navegador, no es que ahora lo conozca en profundidad pero ya hemos roto el hielo, creía que se definía una vez, que lo mismo se puede, y te olvidabas. Tras investigar sobre el tema, la manera más utilizada, hay que recargarla en cada “Response”, así que comparto aquí cómo lo he implementado, espero que te sirva.

Pruebas realizadas con Microsoft Visual Studio Express 2013 for web, C#.

Archivos utilizados:

  1. Page.cs: Clase que heredara de System.Web.UI.Page en la que incluyo la funcionalidad para manipular los idiomas.
  2. Global.asax.cs: Utilizado para definir e inicializar la clase encargada de guardar el idioma elegido por el usuario.
  3. Ficheros de recursos: Dentro del directorio App_GlobalResources he creado un fichero de recursos “Global.resx” en el que he añadido los literales que utiliza mi aplicación en el idioma por defecto, una vez hecho lo he copiado, pegado en el mismo directorio y renombrado a “Global.en.resx”, hecho esto he cambiado los valores traduciéndolos al inglés.
  4. Default.aspx: Página simple con un botón para cambiar el idioma.
  5. Contact.aspx: Página simple con etiqueta para comprobar que al cambiar de página el idioma sigue estando vigente el seleccionado por el usuario.

Una vez que tenemos los ingredientes, vamos a cocinar:

Estas pruebas las he realizado con una aplicación ASP.NET Web Application C# generada por Visual Studio, esto crea un montón de archivos y directorios, pero esto mismo lo puedes implementar en cualquiera de tus aplicaciones.

  1. Page.cs: He creado un entidad Page en la que voy a gestionar los idiomas de mi aplicación, para esto he tenido que incluir dos referencias:
using System.Globalization; //Para trabajar con idiomas.
using System.Threading; //Para trabajar con hilos.

Esta partial class hereda de System.Web.UI.Page, que es de la que heredan las páginas aspx. Tiene dos constructores uno sin parámetros, al que le asignará el idioma por defecto o el seleccionado si es distinto al que tiene definido y otro con parámetro de idioma, al que asignará el idioma seleccionado en el caso de no tenerlo ya asignado. Además he creado la función ChangeLanguage para que el usuario pueda cambiar el idioma desde el botón. Por último aunque no menos importante InitializaCulture que se encargará de asignar el nuevo idioma al hilo actual.

A continuación te dejo el código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Globalization; // Para tratar el multiidioma.
using System.Threading; // Para trabajar con hilos.

namespace AppIdiomas.Models
{
   public partial class Page : System.Web.UI.Page
   {
       public bool isInitialized;
       public Utilidades.Enumerados.multiidioma _idioma;
       public string _estado;
       //Constructor por defecto
       public Page()
       {
           try
           {
               if (GetLanguage() != Global.ConfiguradorPagina.GetLanguage())
               {
                 isInitialized = ChangeLanguage(Global.ConfiguradorPagina.GetLanguage());               }
           }
           catch (Exception exErr)
           {
               _estado = exErr.Message;
           }
       }
       public Page(Utilidades.Enumerados.multiidioma pIdioma)
       {
           try {
               if (GetLanguage() == pIdioma)
               {
                   isInitialized = ChangeLanguage(pIdioma);
               }
           }catch (Exception exErr){
               _estado = exErr.Message;
           }
       }
       // Método llamado para el cambio de idioma en la presentación.
       public Boolean ChangeLanguage(Utilidades.Enumerados.multiidioma pNewLanguage)
       {
           Boolean CorrectExecution;
           try{
               _estado = "";
               if (GetLanguage() != pNewLanguage)
               {
                   _idioma = pNewLanguage;
                   InitializeCulture();
               }
               CorrectExecution = true;
           } catch (Exception exc) {
               _estado = exc.Message;
               CorrectExecution = false;
           }
           return CorrectExecution;
       }
       // Método para recuperar el idioma actual.
       private Utilidades.Enumerados.multiidioma GetLanguage()
       {
           return _idioma;
       }
       // Método para asignar el idioma elegido al hilo actual.
       protected override void InitializeCulture()
       {
           Utilidades.Diccionarios m = new Utilidades.Diccionarios();
           string j = m.ObtenerIdioma(_idioma);
           Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(j);
           Thread.CurrentThread.CurrentUICulture = new CultureInfo(j);
           base.InitializeCulture();
       }
   }
}

2.-Global.asax.cs: Dentro del fichero he añadido una variable del tipo de la clase Page que he creado en el paso 1.

public static AppIdiomas.Models.Page ConfiguradorPagina;

y dentro del método Application_Start, si no lo tenéis, lo podéis definir así:

void Application_Start(object sender, EventArgs e)        { }

Inicio el configurador de mis páginas:

ConfiguradorPagina = new AppIdiomas.Models.Page();

3.-Ficheros de recursos: Si no estáis relacionados con el uso de ficheros de recursos os recomiendo que leais el artículo que publique al respecto llamado ¿Qué es y cómo usar un fichero de recursos?.

Sabiendo ya qué es un fichero de recursos:

Global.resx:

Name prueba Value “Cambia idioma”
Name soporte Value “Soporte:”
Name venta Value “Venta:”

Global.en.resx:

Name prueba Value “Change Language”
Name soporte Value “Support:”
Name venta Value “Marketing:”

4.-Default.aspx: Página en la que he creado un botón para cambiar el idioma. En lugar de un botón podéis dejar volar la imaginación y añadir tantos idiomas como necesitéis.

Modificaciones sobre la página:

La herencia de la página será sobre nuestra clase Page.cs, que a su vez hereda de la clase System.Web.UI.Page.

En el evento Load de la página, aunque se puede hacer directamente en la parte de diseño, le asigno el texto del fichero de recursos para el botón.

En el evento Click del botón compruebo el idioma actual configurado y se lo cambio al otro definido. En un caso real, asignaría el valor seleccionado pero al hacerlo así, en las pruebas siempre hay cambio.

Invoco a la función ChangeLenguage que definí en ConfiguradorPagina en el Global.asax.cs

Refrescamos los controles para que actualicen sus literales.

A continuación te dejo el código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AppIdiomas
{
   public partial class _Default : AppIdiomas.Models.Page
   {
       protected void Page_Load(object sender, EventArgs e)
       {
           //Asigno aquí el texto del botón aunque se podría hacer desde el diseño.
           Button1.Text = (string)GetGlobalResourceObject("Global", "botonTexto");
       }
       protected void Button1_Click(object sender, EventArgs e)
       {
           Utilidades.Enumerados.multiidioma cambioIdioma;
           if (AppIdiomas.Global.ConfiguradorPagina._idioma == Utilidades.Enumerados.multiidioma.esp ||
               AppIdiomas.Global.ConfiguradorPagina._idioma == Utilidades.Enumerados.multiidioma.def)
           {
               cambioIdioma = Utilidades.Enumerados.multiidioma.ing;
           } else {
               cambioIdioma = Utilidades.Enumerados.multiidioma.def;
           }
           AppIdiomas.Global.ConfiguradorPagina.ChangeLanguage(cambioIdioma);
           Button1.Text = (string)GetGlobalResourceObject("Global", "botonTexto");
       }
   }
}

5.-Contact.aspx: Página elegida para mostrar los literales en los distintos idiomas.

Modificación en la página:

<%= Resources.Global.soporte %>   Support@example.com
<%= Resources.Global.venta %> Marketing@example.com

En lugar de un texto fijo lo sustituyo por el literal del fichero de recursos, en negrita, y que sea el configurador el que sepa de qué recurso tirar.

Con estos 5 pasos tendrías un ejemplo completo, ahora solo te queda completar los ficheros de recursos y poner una selección de idiomas mas elegante. Este ejemplo desarrollado en C#, cambiando la sintaxis funciona igual en VB.Net.

Diviértete desarrollando.

Anuncios

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

La que has liado

Fotografiar con palabras, nuestro momento, nuestra época. Del 1.1 al 2.0

TERZERO

Pio Baroja

El árbol inútil

Blog de cuentos, libros y mala poesía

tu.deinflexión

somos dueños de nuestro destino, inventores de nuestro futuro y nuestra felicidad...

Frikstation

Pasión por el mundo de la televisión, el cine, los videojuegos y su merchandising.

A %d blogueros les gusta esto: