PDA

Ver la Versión Completa : Utilizar el traductor de delphi


Hugorr
01-09-2005, 12:14:23
Buenas señores/as


Os comento:

Quiero hacer una aplicación multilingüe y queria utilizar la heramienta que trai delphi. El problema que tengo esq no se muy bien el funcionamiento.Al utilizar el asistente selecciono el/los idoma/s y sigo hasta finalizar. Una vez finalizado se crea una carpeta por idioma seleccionado con varios archivos y tambien me hace guargar un archivo de proyectos de grupo y lo que quiero es que me digan es que significan o que funciones tiene dichos archivos y cuando cre mi ejecutable para cambiar de idioma que archivos son necesarios que lo acompañen.

He intentado búscar por la red pero no consigo aclararme con la información que he encontrado(la verdad casino no lo explican, por no decir que no lo explican).

Bueno si alguien puede orientarme un poco y explicarme como hacerlo pues le deseo lo mejor en la vida (a los que no puedan ayudarme tambien les deseo lo mejor).

Esperando respuestas.... salad@s :p

jmariano
01-09-2005, 16:48:31
Yo hace tiempo que no uso la herramienta de traducción pero te puedo decir que los archivos que se crean son todos .dll que contienen los recursos traducidos (mas bien, la traducción que les damos) y lo único que tienes que hacer es distribuir tu aplicación con estos archivos .dll (te aconsejo ponerlos en la misma carpteta donde esté el ejecutable). Cuando ejecutes la aplicación, de forma automática y basándose en el idioma seleccionado en Windows, cargará un archivo u otro para mostrar la traducción correcta. (Por lo que recuerdo, se genera un archivo de proyecto, .dll, por cada idioma añadido).

Espero haberte aclarado un poco!

Saludos!

dec
01-09-2005, 17:55:52
Hola,

Si el caso es que (como presumo, aunque es probable que erróneamente) no se puede cambiar de ese modo el lenguaje "cuando a uno le parezca bien", sino que se basa en el lenguaje del sistema, tal vez no esté demás decir cómo hago para traducir en tiempo de ejecución el único programa que he llevado a cabo con vistas a tener la interfaz multilenguaje.

Al grano. He utilizado los componentes "TJvTranslator" y "TJvTranslatorStrings" que se incluyen en la Jedi Library (http://www.delphi-jedi.org/). Se acompañan de ejemplos en los que basarte y son bastante amables y eficaces. Se basan en los nombres de los componentes: puede traducirse tanto la propiedad "Caption" de los controles como la propiedad "Hint". Es posible traducir componentes como "listas y combos", quiere decirse, todos los elementos que contengan.

Se utiliza para ello un archivo en formato XML (un tanto singular, puesto que no es validable ni nada de eso, pero cumple su objetivo) que tienes que construir en función de los controles conque cuenta tu aplicación. El archivo XML, en fin, se divide en "nodos" que representan los "formularios" de la aplicación en cuestión y, dentro de cada "nodo/formulario" se asocian las cadenas de texto que al cabo consiguen traducir las propiedades de los controles que mencioné arriba.

Los recomiendo, digo los componentes, puesto que a mí me han ido y aun me van bastante bien: son, como digo, amables, en el sentido de que una vez los coges el hilo no cuesta demasiado añadir nuevas cadenas de texto para nuevos controles que fueran precisos en la aplicación. Una vez cuentes con los archivos XML precisos (uno por cada lenguaje a disponible, pero también podrías tener varios, por ejemplo, por cada formulario y lenguaje disponible) basta con un método para llevar a cabo la traducción de la aplicación.

jmariano
01-09-2005, 18:24:29
Saludos dec!

El único inconveniente que le veo al uso de los componentes que comentas, en lugar de la herramienta de Delphi, es que no podrías traducir los mensajes propios de Delphi cuando ocurre alguna excepción u otros que no tienen que ver con la propiedad "Caption" o "Hint" (ésta es la única ventaja que le veo a la herramienta de Delphi, ya que te permite visualizar casi todas las cadenas usadas en la aplicación, incluyendo los mensajes de las expcepciones, y así poder traducirlo "todo").

(En caso de estar equivocado, entonces, discúlpame pero es que no conozco bien esos componentes y baso el comentario por como dices que funcionan)

dec
01-09-2005, 19:36:50
Hola,

Bueno. Es cierto que traducir todos los mensajes que pudieran generarse puede ser una tarea ardua y complicada: la verdad es que es algo que no había pensado y sí solamente utilizo los recursos de Delphi en castellano, que pueden encontrarse en el apartado de Recursos (http://www.clubdelphi.com/recursos/) de este mismo sitio Web y que tradujo un forista de nombre Germán. Por cierto, gracias Germán.

Lo que sí puedo añadir a lo dicho es que uno de los componentes mencionados (concretamente "TJvStringsTranslator") se dedica, precisamente, a traducir "variables" en tiempo de ejecución, de tal manera que estas se incluyen en el archivo XML preciso, dentro del "nodo/formulario" en que son utilizadas.

Quiere decirse que no se limitan los componentes a traducir los "Captions" y "Hints" de los contoles. Por ejemplo, si tuvieras que mostrar al usuario un determinado mensaje (que no tiene que ser el "Caption" de un control) podrías hacerlo sin problemas: sencillamente guardando dicho mensaje en una variable de tipo "string" y utilizando el componente susomentado.

No sé si me explicaré correctamente: en el ejemplo de los componentes puede verse más claro, puesto que no solamente se traducen algunos controles ("Caption" y "Hints") sino que también se muestra cómo es posible traducir variables, de tal modo que el tema de los mensajes al usuario puede solucionarse de ese modo, sino es ya que esto no llegue a otros mensajes que pudieran mostrarse en caso de excepción, por ejemplo.

Es probable que no sean unos componentes perfectos, o que los halla mejores, pero, desde luego, dan bastante juego, son muy sencillos de usar y permiten una escalabilidad también sencilla (en el sentido referido más arriba de poder añadir más controles y sus correspondientes traducciones sin mucha dificultad).

¿Un ejemplo "real"? Bueno. El único que puedo ofrecer es el programa XEditor (http://www.xeditor.tk), el cual hace uso de los referidos componentes y cuya interfaz está "disponible" en español y en inglés (este último un tanto regular, porque he sido yo mismo el traductor/traidor que ha llevado a cabo la tarea).

Hugorr
01-09-2005, 22:47:40
Buenas noches, señores/as.

La verdad que los componente están bien, pero me gustaria utilizar delphi por la traducción de las excepciones me parecce mas sencillo y ademas no dependo de componentes externos. De todas formas esta bien que halla varias solucciones.

Realmente jmariano a mi no me crea ninguna dll, seguramente lo haga mal. ¿Prodrias mandarme los pasos a segurir y un ejemplo en el que traduzca una simple etiqueta, o el formulario?.

Seguiré trasteando con esos componentes. Os tendre informados...

jmariano
02-09-2005, 01:24:05
Buenas noches, señores/as.

La verdad que los componente están bien, pero me gustaria utilizar delphi por la traducción de las excepciones me parecce mas sencillo y ademas no dependo de componentes externos. De todas formas esta bien que halla varias solucciones.

Realmente jmariano a mi no me crea ninguna dll, seguramente lo haga mal. ¿Prodrias mandarme los pasos a segurir y un ejemplo en el que traduzca una simple etiqueta, o el formulario?.

Seguiré trasteando con esos componentes. Os tendre informados...

Perdona, me equivoqué!!! los archivos no son de extensión .dll sino que toman otra extensión diferente dependiendo del idioma destino que hayas seleccionado cuando hiciste la traducción. Por ejemplo, si elegiste "Español-Alfabetización Internacional" el archivo creado tendrá extensión .ESN (el nombre es el mismo que el del ejecutable) o si eligiste "Español-Alfabetización Tradicional" tendrá extensión .ESS (creo que todas las variantes del español generan archivos que comienzan por "ES...", otros idiomas no se que extensión tendrán). En realidad, toman como extensión el mismo nombre de la carpeta donde Delphi te guardó el proyecto con la traducción, así que fíjate como se llama dicha carpeta y busca un archivo con esa extensión (que, normalmente, ha de estar donde se encuentre el ejecutable).

Cualquier duda vuelve a preguntar!

Saludos!

Hugorr
02-09-2005, 21:13:47
Buenas,

jmariano bueno pues tenias rarón crea un archivo con extensión del idioma seleccionado caso de español (*.ESP). Ahora que ya hay cosa claras. Me gustaria meter todos esos archivo en una carpeta llamese "lang" y yo desde mi programa elegir un idioma de los disponibles y cambiarlo. Claro esta el problema que para cambiar depende del idioma del S.O. ¿Que pasa si el S.O. tiene un idioma que en la aplicación no está creado?

Si no es molestia prodrias mandarme un ejemplo....


Un saludo....

jmariano
02-09-2005, 22:10:30
Buenas,

jmariano bueno pues tenias rarón crea un archivo con extensión del idioma seleccionado caso de español (*.ESP). Ahora que ya hay cosa claras. Me gustaria meter todos esos archivo en una carpeta llamese "lang" y yo desde mi programa elegir un idioma de los disponibles y cambiarlo. Claro esta el problema que para cambiar depende del idioma del S.O. ¿Que pasa si el S.O. tiene un idioma que en la aplicación no está creado?

Si no es molestia prodrias mandarme un emplico....


Un saludo....

A tu última pregunta, si no existiera el idioma en tu aplicación, entonces, creo que no se cargará ningún archivo de recursos y tu aplicación se mostrará tal y como es originalmente.

A la cuestión de poder seleccionar el idioma en tiempo de ejecución, el problema está en que el sistema fue pensado para que el idioma se seleccionara automáticamente según el de Windows, al ejecutar la aplicación. Pero, despues de buscar un poco en la ayuda, resulta que si existe una manera (aunque es con "truco", claro, y no es algo soportado por la VCL y las funciones de Delphi). Así que te explico según lo que leí:

- Primero has de localizar una unidad llamada "ReInit.pas", forma parte del ejemplo de Delphi "Richedit" que se encuentra dentro de la carpeta "Demos". Esta unidad la has de añadir a la cláusula "Uses" de tu aplicación (lo mejor sería que la copiaras tambien a la carpeta de tu proyecto). Esta unidad es necesaria porque contiene algunos métodos que nos permitirán cambiar el idioma en ejecución.

- Por último, en el lugar donde quieras cambiar el idioma, llama a la función "LoadNewResourceModule" (pasándole como parámetro el identificador del idioma a cargar), comprueba que la función te devuelve un valor distinto de 0 (si devuelve 0 es que el idioma no se cargó) y, si es así, llama al procedimiento "ReinitializeForms" (este procedimiento lo que hace es volver a leer los recursos para todos los formularios ya instanciados en memoria). Una vez que hayas hecho todo (y si fue bien), verás que, a partir de ahora, todos tus formularios, mensajes, etc., son presentados en el idioma seleccionado.

Te pongo el ejemplo que viene en la ayuda:


uses
ReInit, ...;

const
FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;

if LoadNewResourceModule(FRENCH) <> 0 then
ReinitializeForms;


(En el ejemplo carga, en tiempo de ejecución, todos los recursos para el idioma francés sin importar las diferentes variantes, es decir, carga el mismo recurso para todas las variantes que hubiera del francés).

Lo único que veo dificil es saber que identificador hay que utilizar para un idioma determinado. De todas formas, puedes hacer una búsqueda por el tipo "LCID" (utilizado para especificar un idioma) y ver el tema de los identificadores válidos.

Espero que te sirva!

Saludos!

P.D: Se me olvidó comentarte que si colocas los archivos de recursos en otra carpeta distina a la de la aplicación, entonces, tendrás que añadir dicha carpeta al "PATH" de Windows.

Chao!