Inicio > Ejemplos, Multiidioma, XE3 > Programas multiidioma con Delphi

Programas multiidioma con Delphi

jueves, 25 de octubre de 2012 Dejar un comentario Ir a comentarios
Share Button

flags-all-countries_6130Ya he hablado en otras ocasiones de cómo generar un aplicación multiidioma en Delphi y de paquetes tanto comerciales, como los componentes siComponents, como de código abierto como GNU GetText. En esta entrada hablaba de ambos y explicaba cómo acometer este proceso.

Aplicación multiidioma con GNU GetText

Hace tiempo había revisado el sistema de internacionalizar aplicaciones de Delphi (en este caso en la versión 6) y no me pareció muy intuitivo, tal vez también por falta de algo de documentación. Por lo que he visto en las versiones nuevas, pocas cosas han variado en el proceso y en las herramientas que trae el IDE.

En este caso me he visto obligado por las circunstancias a utilizarlo, y aunque a priori me ha resultado un poco “confuso”, como en su momento, una vez puesto en marcha, el sistema la verdad es que no es complejo y funciona de forma bastante sencilla. Se echa en falta que determinados aspectos sean un poco más potentes, como el editor de traducciones o el repositorio y la forma en que funcionan. Estos dos elementos realizan su función pero son bastante básicos en comparación con otros paquetes que hay en el mercado.

El sistema de traducción de Delphi, se basa en añadir todos los recursos traducidos a una DLL; Una para cada idioma que necesitamos añadir a nuestra aplicación.


EL PROYECTO

Imagen44Para ver el proceso completo de internacionalización crearemos un proyecto sencillo, con dos formularios y veremos que es relativamente rápido montar toda la estructura para que funcione en varios idiomas.

Algunas etiquetas, un memo con algunos strings, unos botones y un segundo formulario para comprobar un ejemplo con más de uno y un TComboBox que nos permitirá modificar el idioma en tiempo de ejecución.

Una vez que tenemos nuestro proyecto funcionando, comencemos el proceso para añadirle dos nuevos idiomas, en este caso el catalán y el inglés, al que ya tiene por defecto (español o castellano).


INTERNACIONALIZACIÓN

Para ello lo primero que debemos hacer es añadir los 2 nuevos idiomas desde el menú de Project.

en la imagen inferior podéis ver las pantallas del asistente, aunque no tiene ninguna complicación y lo que hacemos con él es añadir los idiomas (tantos como necesitemos) a la aplicación.

internacionalizacion

Una vez finalizado el asistente, veremos que el IDE ha generado dos proyectos más (en nuestro caso) correspondientes a los idiomas que hemos seleccionado.

Imagen45

Podemos probar a compilar y grabar todos los proyectos.

Lo siguiente es comenzar a traducir las cadenas para poder utilizar múltiples idiomas en la aplicación. El editor de cadenas es similar a muchas otros aplicaciones que hay para esta función. Se trata de una pantalla que nos muestra las cadenas actuales y donde debemos introducir las cadena introducidas.

Para acceder al “Translation Manager” podemos hacerlo desde el menú en: “Project / Languages / Update resource DLLs”.

Imagen47

En esta pantalla vemos a la izquierda la estructura del proyecto y los diferentes formularios que lo componen. A la derecha la zona que nos permite traducir las diferentes cadenas. Hay columnas que identifican el elemento (ID), la que contiene las cadenas en el lenguaje original de la aplicación y la que contendrá las cadenas traducidas, en este caso con el título de “Inglés (estados Unidos)”.

He marcado en rojo una cadena que ya aparece traducida automáticamente (&Cerrar – &Close).  Este es debido a que esta cadena ya está traducida en el repositorio.


EL REPOSITORIO

El “Transation Repository” o “Repositorio” es como un diccionario de traducciones que podemos ir ampliando a medida que traducimos aplicaciones. De esta forma, podemos reutilizar las cadenas que ya hemos traducido anteriormente (en la misma aplicación o en otras). En el ejemplo que estamos viendo, mi repositorio ya tiene incluida la traducción desde el Español (internacional) al Inglés (Estados unidos) de la palabra &Cerrar. Por eso al acceder a las traducciones, esta palabra ya aparece traducida.

Imagen48El repositorio nos permite acelerar la traducción de términos. Además posee opciones para importar y exportar traducciones, con lo que podemos compartirlos o incluso utilizar herramientas de traducción automáticas externas e importar las traducciones a él.

Una vez que las cadenas están traducidas para los formularios podemos añadirlas al repositorio desde el “Translation Manager” , para tenerlas disponibles más adelante.


EJECUCIÓN

Una vez traducidas y añadidas al repositorio todas las cadenas de los diferentes idiomas, compilamos los proyectos, tanto el original, como los de los diferentes idiomas.

Para probar la ejecución, podemos seleccionar desde el menú de “Project” cual es el idioma que queremos por defecto. Si probamos con alguno de los 2 idiomas y ejecutamos, veremos que efectivamente la aplicación, como era de esperar.

Por último, nos quedaría ver cómo modificar el idioma durante la ejecución de la aplicación. Es bastante simple y para ello hay una sección en la ayuda del propio Delphi a la que podéis acceder; Dentro de la «internacionalización de aplicaciones» hay un tema concreto llamado «Dynamic switching of resource DLLs». Allí se puede leer que basta con añadir la unit Reinit en el uses, y utilizar una línea como la siguiente para cambiar el idioma.

// Cargar los recursos y releer los forms
if (LoadNewResourceModule(lang) < > 0) then begin
  ReinitializeForms;
end;

Comentar que si en alguna versión de Delphi, no encontráis la unit ReInit, podéis buscar dentro del directorio de Demos.

Al final el código que hay más arriba va a ser el único que vamos a necesitar en la aplicación.

Para apoyar la entrada, además del código de ejemplo, he añadido en este caso un vídeo.

 

[youtube dTIo5Oh-wmw]

Como siempre podéis descargar el código del ejemplo desde este link.

<DESCARGAR CÓDIGO FUENTE>

Espero que os haya sido útil y hasta la próxima.

Vota este post
Subscribe
Notify of
guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

22 Comments
Inline Feedbacks
Ver todos los comentarios
Jose Ángel
Jose Ángel
11 years ago

Hola, muy interesante el artículo, estoy probando el XE3 y veo que lleva un componente Lang que no me ha funcionado como yo esperaba, ¿Que valoración te merece este componente? Comparado con el método que expones en el artículo.

Un saludo.

Jose Ángel
Jose Ángel
11 years ago

Hola, con el XE3 viene algún ejemplo de su uso, es el TLang

http://docwiki.embarcadero.com/Libraries/XE2/en/FMX.Types.TLang

Pero a mí no me traduce todo de forma correcta, creo que los controles deben tener el Autotranslate a true, pero ya te digo que sólo he hecho unas pruebas.

MAXIUM
MAXIUM
11 years ago

Neftalí, me perdí con tus instrucciones

[IMG]http://i49.tinypic.com/55il8x.png[/IMG]

MAXIUM
MAXIUM
11 years ago

Saludos Neftali.

En tu ejemplo no hay forma de que vuelva al español una vez cambiado al ingles.

Lo otro, es que al agregar o eliminar algún componente posterior a editar los idiomas y a pesar de actualizar, no resulta. Tengo que cerrar y volver a abrir Delphi.

MAXIUM
MAXIUM
11 years ago

¿Pero te refieres a en diseño o a ejecución?.

Mmmm… en ambos casos… pero es una cosa de lógica de código. Al reiniciar el formulario en ingles, queda seleccionado el español como primera opción, como no se detecta cambio al seleccionar español que ya esta seleccionado, sigue quedando todo en ingles… Habrá de usar un .ini o uso del registro.

¿Donde se ubica dicha DLL?, la aplicación la arranco sin ella a la vista y funciona de todos modos.

dec
dec
11 years ago

Hola,

Otro conjunto de componentes que podéis probar para internacionalizar y localizar vuestras aplicaciones hechas con Delphi es el «Paquete I18n» de Delphi Area. Se trata de un conjunto de componentes que, no solamente hacen sencilla la tarea mencionada, pero, tiene en cuenta muchas cuestiones que no son tenidas en cuenta, generalmente: calendarios, fechas, diálogos, etc. Por lo menos no dejéis de echarle un vistazo. Yo mismo uso estos componentes en dos de mis proyectos con excelentes resultados.

cabezasariel
cabezasariel
10 years ago

hola: en primer lugar muy buen post, yo trate de hacer lo que dices en el ejemplo tengo delphixe2 y componentes devexpres y todo bien pero a la hora de dar f9 me sale el siguiente error resource TcxImageResourceForm not found, y no me deja seguir, has chocado con este error alguna vez, ojala puedas ayudarme

cabezasariel
cabezasariel
10 years ago

hola, tambien me pasa con el fast report que viene con el delphixe2, me sale un error de recursos, el de los devpexpress lo solucione poniendo en comentario la linea en la unit del devexpress que me estaba lanzando el error, era una inicializacion, pero el problema con el fast report es que me da el error pero al no tener los fuentes no hay forma de arreglar, existira alguna otra solucion? saludos

Arturo
Arturo
5 years ago

Neftali, Hola.
Disculpa que te moleste pero quisiera hacerte una consulta. Tengo una aplicación hecha en Delphi XE7, con base de datos SQLite, funciona todo bien, pero cuando pongo una imagen dentro de un TText o un button y ejecuto la aplicación en el movil se cuelga la aplicacion justo cuando visualizo le Boton o el TText quito las imagenes y funciona normal.
Se tiene que configurar algo?, extesiones bmp, jgp. png y no las acepta en android.

José A.
José A.
2 years ago

Hola.
He estado buscando como trabajar con varios idiomas y me he encontrado con tu explicación. Me ha servido de mucho.
Por otro lado me pasa como en el video y como han comentado más arriba, que una vez cambiado a otro idioma no puedo volver al español. No es por lógica del ejemplo, lo he probado ‘a pelo’ cambiando en una línea y volviendo a cambiar en la siguiente y en esta la función LoadNewResourceModule() devuelve 0. Sabes si hay alguna solución?
Gracias por todo

José A.
José A.
2 years ago

@Germán Estévez
Gracias por tu respuesta. Precisamente me he encontrado con problemas de que algunas caption de los títulos de columna de dbgrid no aparecen para traducir. Sólo cambiando el contenido en el inspector de objetos aparece para traducir (Nombre lo cambié a Participante p.e.)
Ahora estoy mirando IniLang2 0.9.03 (no sé si hay otra mas reciente). Qué te parece? Necesito algo sencillo.
Buenas noches y Gracias

22
0
Would love your thoughts, please comment.x
()
x