Lazarus – Internacionalizando tus aplicaciones.

Curiosamente, la palabra «Internacionalización», se encuentra entre las palabras más largas del español y reconocidas por la Real Academia (al lado de «electroencefalografista» y «esternocleidomastoideo»), quien le asigna el siguiente significado:  «Someter a la autoridad conjunta de varias naciones, o de un organismo que las represente, territorios o asuntos que dependían de la autoridad de un solo Estado.»

La internacionalización de las aplicaciones no implica que deban someterse a la autoridad de la ONU, sino que puedan trabajar bien en otros países, en lo referente a formatos de fecha, hora, medidas y sobretodo, en el idioma, que es el punto que vamos a tratar en esta sección.

Lazarus viene con algunas opciones para escribir aplicaciones que pueden cambiar el idioma del texto (como el uso de archivos .po).

Sin embargo, quiero  proponer otro método para poder configurar el idioma de nuestro aplicativo.

Si analizamos una aplicación típica, existen diversos puntos donde se debe cambiar el idioma:

* En los formularios o diálogos.
* En los mensajes (de error o informativos) que presentamos el usuario.
* En los textos literales que asignamos a variables de tipo cadena.
* En los mensajes (de error o informativos) que presentan las librerías que usamos.

Los tres primeros puntos están a nuestro alcance, pero el cuarto probablemente sea muy difícil de salvar, por cuanto depende de cómo haya sido escrita la librería.

La solución que propongo aquí, se basa en usar la librería «MisUtils», que se puede descargar desde aquí:

https://github.com/t-edson/MisUtils

Esta librería ha sido diseñada para trabajar en entorno Lazarus, y solo la he probado en Windows, por lo que no puedo dar fe de que pueda trabajar en Linux o Mac.

El archivo que contiene a la librería es ‘MisUtils.pas’ y es una unidad que debe incluirse en todas las unidades de nuestro proyecto que desean usar internacionalización en el idioma.

Ahora cuando escribamos nuestra aplicación debemos seguir las siguientes normas:

* Todas las constantes cadena, deben indicarse usando la función dic(). Así si por ejemplo teníamos el siguiente código:

cadena := ‘Casa’;

Ahora debemos escribir:

cadena := dic(‘Casa’);

La función dic() permite traducir el mensaje usando el diccionario interno de la unidad.

* Todos los mensajes mostrados con ShowMessage(), deben ahora mostrarse con la función MsgBox(), que viene integrada en ‘MisUtils.pas’.

Si antes teníamos:

ShowMessage(‘Error aquí’);

Ahora debemos tener:

MsgBox(‘Error aquí’);

La función MsgBox(), admite traducción usando el diccionario interno de la unidad. Existen adicionalmente las funciones MsgExc() y MsgErr(), que muestran los mensajes con un ícono de Exclamación y de Error, respectivamente.

*Todos los mensajes que se creen concatenando constantes con variables, deben escribirse en la forma en que se escribiría usando la función Format().

Si por ejemplo teníamos:

ShowMessage(‘Archivo: ‘+Archivo+’ no existe’);

Debemos escribirlo en la forma:

MsgBox(‘Archivo: %s no existe’, [Archivo]);

De esta forma simplificamos la traducción del texto, porque solamente requerimos traducir la cadena ‘Archivo: %s no existe’, en lugar de tener que traducir por partes y luego concatenar.

Las funciones de ‘MisUtils.pas’: MsgBox(), MsgErr(), MsgExc() y disc(), admiten esta forma de trabajo, similar a la función Format().

* Al final de cada unidad, debe definirse la función SetLanguage() que debe tener la forma:

procedure TForm.SetLanguage(lang: string);
//Rutina de traducción
begin
case lowerCase(lang) of
‘es’: begin
    //traducción de etiquetas de menús o acciones
    acArcNuevo.Caption := ‘&Nuevo’;
    acArcAbrir.Caption := ‘&Abrir…’;
    mnArchivo.Caption := ‘&Archivo’;
    //textos
    dicClear;  //no agrega entradas porque el texto ya está en español
  end;
‘en’: begin
    //traducción de etiquetas de menús o acciones
    acArcNuevo.Caption := ‘&New’;
    acArcAbrir.Caption := ‘&Open…’;
    mnArchivo.Caption := ‘&File’;
    //traducción de textos
    dicSet(‘Casa’,’home’);
    dicSet(»Error aquí»,’Error here’);
    dicSet(‘Archivo: %s no existe’,’File %s doesn’t exist’);
  end;
end;
end;

En esta función se deben crear tantas entradas como lenguajes se deseen agregar a nuestra aplicación.

Las etiquetas de los menús o acciones se cambian de la forma esperada.

Luego para cambiar el idioma de la aplicación, se debe llamar a la función SetLanguage(), de todas las unidades que lo requieran.

No se debe olvidar poner la propiedad «TranslateMsgs» (definida en ‘MisUtils.pas’) en TRUE, al iniciar el programa.


Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*