Aplicaciones .NET Multi-lenguaje

¿Deseas crear un proyecto multi-lenguaje? ¿Quieres dar con una manera fácil, dinámica y ajustable para crear un proyecto multi-cultural?

Muchas veces por brindarle características y cierto grado de funcionalidad y compatiblidad a nuestros proyectos, nos surge la idea de que esto se puede obtener conviertiendolo en multi-lenguaje. Un Producto Software que le brinde una experiencia familiar y similar cada usuario sin importar su idioma… estás en lo correcto.

Hoy día vemos muchos contextos y situaciones en los que ésta manera de pensar se cumple. Un ejemplo está en las bandas de Rock/Metal, la mayoría del 50% tiende a componer sus canciones en Inglés! Gracias globalización.

Idioma dentro de la aplicación (mensajes, palabras, textos…):

Esta parte la centro en un archivo de texto plano con todo lo que implementará la aplicación:

[es]
#    Mensajes
item_affected = Se ha modificado/guardado el ítem exitosamente.
exit_question = ¿Desea realmente salir?
sharing_file = Se ha creado exitosamente el archivo para compartir.
new_user_request = Ingrese nuevo usuario:
clean_database_question = ¿Está seguro que desea limpiar por completo la base de datos?
items_erased_sucess = Los ítemes se han limpiado de la base de datos.
#    Errores
entity_missed = No se ha determinado el tipo de la entidad.
items_error = Ha ocurrido un error durante el guardado.
communication_failed = Ha ocurrido un error durante la comunicación.
invalid_input = Valor(es) ingresado(s) están en blanco/incorrecto/vacíos).
loading_catalog = Ha ocurrido un error durante la búsqueda de los catalogos.
#    Textos / Palabras
save = Guardar
cancel = Cancelar
new_user = Nuevo Usuario
waiting = Espere…

[en]
welcome = Welcome!
select_user = Must select a user.
items_saved = Items saved successfuly!
item_affected = The Item has been save/changed successfuly.
sharing_file = The Sharing File has been created.
#    Errores
communication_failed = An error ocurried trying the communication.
invalid_input = Fields invalids (empty, wrong format).
loading_catalog = An error has been detected in the search of catalogs.
save_method_unknown = The save method/repo is unreachable.
user_exists = User already exists.
###
#    Textos / Palabras
###
save = Save
cancel = Cancel
new_user = New User
waiting = Please wait…

Descripción del archivo:

[es] y [en] hacen referencia a dos idiomas, Español e Inglés.

Las palabras/oraciones/texto todo está separado por un cambio de linea donde le indico su tag/name y su valor.

# indica una línea que no debe ser tomada en cuenta. Van los comentarios o indicaciones extras.

Implementación:

Primero determino qué lenguaje usar, ya sea el preferido por el usuario o el idioma del sistema:

 cultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;

//En un diccionario donde guardaré el idioma determinado:

 Dictionary<string, string> messagesLibrary;

//Un mecanismo para determinar dónde está el lenguaje a buscar

string aux;
int regionStart, regionEnd;

aux = reader.ReadToEnd();
      
regionStart = aux.IndexOf(culture.Parent.Name); //Se lee siempre el pariente: es-DO = es, es-ES = es, en-UK = en, en-US = en

if (regionStart == -1)
{
throw new NotImplementedException(“Language is not implemented: ” + culture.Parent.Name);
}
//Se determina dónde inicia y termina
regionStart = aux.IndexOf(‘]’, regionStart) + 1;
regionEnd = aux.IndexOf(‘[‘, regionStart);

El string resultante va a un algoritmo que determina las palabras:

 SplitWords(aux.Substring(regionStart, regionEnd – regionStart));

 private void SplitWords(string text)
        {
            string[] words = text.Split(splitters, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < words.Length; i++)
            {
                if (words[i].StartsWith(COMMENT_TAG)) //Si inicia con el caracter de comentario, obviar
                    continue;

                messagesLibrary.Add(words[i].Trim(), words[++i].Trim());  //aquí indico que guarde su tag/name y el próximo campo que DEBE ser su valor
            }
        }

 

Adicional y como se preguntarán qué son ciertas variables no mecionadas hasta ahora, son constantes:

private const String COMMENT_TAG = “#”; //Saber cuál será el símbolo para los comentarios
private string[] splitters = new string[] { “=”, “\r\n” }; //Todo caracter que separe o divida las líneas

Para obtener los textos, declaro una propiedad:

 public Dictionary<string, string> MessagesLibrary
        {
            get
            {
                return messagesLibrary;
            }
        }

Para utilizar todo esto:

Language language = new Framework();

language.MessagesLibrary[“loading_catalog”];

y listo!

Archivo Language.cs completo.

 

Partes y Controles Visuales:

Toda esta parte resulta ser igual o más fácil. Resulta ser más aplicable a los que utilizamos el Designer de Visual Studio, the easy way.

– Primero tenemos un formulario (FrmMain). Le agregamos todos los controles visuales que contendrá.

– Luego de definido el estilo visual, procedemos a la propiedad ‘Language‘ del formulario y seleccionaremos nuestro primer idioma.

– Seleccionado el idioma -en nuestro caso Ingles- se creará un archivo recurso ‘FramMain.en.resx‘. Cuando tenemos una propiedad seleccionada en Language, no podemos arrastrar nuevos controles visuales. Llegados a éste punto se cambian los nombres de los labels, los botones y textos en el UI.

– Terminados, vamos al primer valor ‘(Default)’ y nos cambiará a la apariencia visual “estandar”.

Obviando el primero paso y repitiendo, podremos estar seleccionando distintos idiomas ilimitados. Después de compilado y ejecutado, los controles visuales ( si no se indica lo contrario) estarán mostrados en el idioma del hilo actual que se traduce como el idioma en que se encuentra el sistema.

 

No sé si en sus diferentes vertientes, este método es muy usado o si lleva a mala concepción, uso de recursos, etc. pero a mi me ha resultado. Tanto en proyectos pequeños y rápidos como intermedios me ha resultado muy factible. Ojalá y les resulte práctico y obtengan buenos resultados ^_^

 

 Happy Coding ✌
 

Actualización 20/08/2014

SyncFusion ha lanzado Localization for .NET Succintly, un e-book gratis que trata éste tópico.
Anuncios

¿Quieres agregar algo?

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