 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Jue 23 Feb, 2006 8:00 pm Asunto: Crear una aplicacion Multilingue |
|
|
Hola a todos, esta es la primera vez que escribo en este foro.
Actualmente estoy haciendo mi proyecto final de carrera. Como no podia ser de otra manera en toda la carrera no nos han enseñado nada del Builder y ahora lo tengo que utilizar para hacer una aplicacion.
Estoy trabajando sobre una aplicacion ya hecha con el Builder 4, y una de las primeras ampliaciones que tengo que hacer es que esta aplicacion sea multilingue, es decir, tener un menu idioma y poder seleccionar Castellano, Ingles, Frances, Aleman, ect... y que automaticamente todos los comentarios, menus, botones, ect se cambien al idioma seleccionado.
El problema es que no tengo ni idea de como empezar. Supongo que tendré que tener algun fichero o estructura de datos con todas las palabras para luego acceder a ella, pero la verdad es que estoy bastante perdido.
Agradeceria cualquier tipo de ayuda.
Un saludo y gracias anticipadas. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 24 Feb, 2006 12:01 am Asunto: |
|
|
Existen algunas maneras de realizar esta actividad, vamos a verlas
1.- Efectivamente puedes crear un archivo .INI, con la informacion para los lenguajes, usando la siguiente sintaxis.
[espa]
boton1=salir
boton2=cerrar
[ingles]
boton1=Exit
boton2=close
...
...
etc etc.
y cada vez que llames al cambio de lenguaje llamas a la parte que le corresponde dentro del archivo ini y modificas los captions, muy facil!! je je no tanto, ya que cuando tienes algo como esto en alguna parte de tu programa
| Código: | ShowMessage("Este es un mensaje"+Edit1->Text); |
no es demasiado ortodoxo ni bueno para la memoria que tengas que crear variables globales para todo el sistema.
por ejemplo para cambiar el texto por algo asi
| Código: | ShowMessage(Msg1+Edit1->Text); |
y luego a msg1, ponerle el valor depediendo el lenguaje, algo engorroso, para realizar esta actividad. bueno esta es la solucion, facil con chapuza... pero ahora veamos la solucion, profesional si hablo de professional existen 2 maneras
Primera manera
2a.- puedes usar algunos programas de pago, que te ayudan a convertir el texto que tienes encerrado entre comillas de tu codigo fuente y traducirlo en un editor algo potente, esto funciona asi.
tu generas el programa en este caso en el perfecto español, hablo del perfecto español en cuestion de bien escrito (no como yo, jeje), para que al usar el programa de pago el con su traductor pueda convertirte todas las cadenas de tu programa al idioma que has elegido, en algunos casos.
Te crea un copia del proyecto de esp a ing tendiendo 2 proyectos 1 con tus cadenas en Español y otro con las cadenas traducidas.
para no hacerlo mas largo, el nombre de los programas son:
TsiLang Component <-- componente de pago
Multilizer v6.1.11 <-- programa parecido a la opcion 2b
como dije anteriormente son de pago...
2b.- Esta opcion viene inmersa dentro de windows y puedes ubicarla dentro del menu de herramientas, y funciona de la siguiente manera crea al igual que le programa Multilizer una Dll donde estan los lenguajes que insertanste en tu programa. esto funciona bien... y es la manera de pasar las aplicaciones a diferentes lenguajes... con una DLL que genera el propio builder Enterprise, profesional no creo que lo tenga.
ahora no todo es color de rosa con florecitas, el echo que genere la Dll con los archivos traducidos, no significa que ya esta, en la parte de traduccion eres tu mismo quien traduce los textos, asi que como veras las 2 opciones que te comento, necesitan de traduccion por parte del desarollador...
saludos y estamos en contacto...
pd: la opcion 2b - se encuentre en la parte del menu Tools,
bien esperemos que puedas econtrar los programas, y ver los resultados de manera positiva... _________________

Ultima edición por Cesar C. Salazar Gonzalez el Sab 25 Feb, 2006 10:00 am, editado 1 vez |
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Vie 24 Feb, 2006 3:32 pm Asunto: |
|
|
Muchas gracias por la respuesta. Este finde me pondre con algunas pruebas y ya comento
Un saludo. |
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Vie 10 Mar, 2006 4:33 pm Asunto: |
|
|
Hola Cesar, muchisimas gracias por tu ayuda.
He conseguido hacer la traduccion gracias a la aplicacion de TsiLang, es un gran programa, pero al ser solo la version de evaluacion requiere tener el builder abierto.
Debido a esto tengo qeu buscarme una via alternativa "menos profesional". Investigando por ahi, creo que la manera más 'facil' es utilizar un archivo INI con todas las cadenas para todos los idiomas.
El problema esta en que no se como utilizarlo, como acceder a el desde el codigo fuente.
Si te es posible te agradeceria que me explicaras que pasos tendria que seguir.
-------------EDICION 1-------------------
Hola de nuevo, sigo trabajando y avanzando. Como no se coger los captions desde el archivo .ini de momento estoy utilizando funciones auxiliares que lo hacen:
Son de este estilo
Esta si invocaria al selecionar el idioma español en el menu de idiomas
| Código: | void __fastcall TForm1::Spanish1Click(TObject *Sender)
{
// Seleccion de idioma
english=false;
spanish=true;
// LLamada a la funcion que selecciona el idioma
idioma ();
// LLamada a la funcion que pone los captions
traduce ();
} |
//---------------------------------------------------------------------------
Llamo a dos funciones una que guarda en unos strings las traduccionesç
| Código: | //Funcion seleccion de idioma
void __fastcall TForm1::idioma()
{
if(spanish){
//Español
cad1="&Nuevo";
cad2="&Ingles";
cad3="&Salir";
cad4="&Archivo";
cad5="&Idiomas";
cad6="&Abrir...";
cad7="&Imprimir";
cad8="Imprimr &Como...";
cad9="Guardar C&omo";
cad10="&Cuardar";
cad11="&Español";
msg1="¡Hola mundo!";
}
else if (english){
//Ingles
cad1="&New";
cad2="&English";
cad3="E&xit";
cad4="&File";
cad5="&Language";
cad6="&Open...";
cad7="&Print";
cad8="P&rint Setup...";
cad9="Save &As";
cad10="&Save";
cad11="&Spanish";
msg1="Hi world!";
}
} |
//---------------------------------------------------------------------------
Y otra que cambia los captions
| Código: | //Funcion que cambia todos los captions
void __fastcall TForm1::traduce ()
{
TForm1::New1->Caption=cad1;
TForm1::English1->Caption=cad2;
TForm1::Exit1->Caption=cad3;
TForm1::File1->Caption=cad4;
TForm1::Language1->Caption=cad5;
TForm1::Open1->Caption=cad6;
TForm1::Print1->Caption=cad7;
TForm1::PrintSetup1->Caption=cad8;
TForm1::SaveAs1->Caption=cad9;
TForm1::Save1->Caption=cad10;
TForm1::Spanish1->Caption=cad11;
} |
Esta parte esta bastante clara, ya que solo me falta saber coger los idiomas desde el archivio INI en vez de usar la funcion idioma.
Para los mensajes de error o informacion es algo similar, se cambiar el mensaje de texto como hice con msg1, pero el problema es que en algo asi...
| Código: | Application->MessageBox("Welcome to C++Builder", "Message Box", MB_YESNOCANCEL); |
no se como cambiar el idioma en que aparecen los botones, ya que MB_YESNOCANCEL es una constante.
-------------EDICION 2-------------------
Hola de nuevo, escribo de nuevo por si mis avances sirven para otros usuarios.
He resueltos muchos de mis problemas.
Existe en Builder una libreria <IniFiles.hpp> q se debe de incluir.
Luego se debe de inicializar una variable similar a esta:
| Cita: | TIniFile *Conf; //en el .H
Conf=new TIniFile("c:\\languages.ini"); |
Luego existen multitud de funciones para leer y escribir en las secciones. Tendria esta pinta...
| Cita: | | Conf->ReadString("español","cad1","mens por si error"); |
Con este par de cosas puedo traducir casi todo. El problema que me surge ahora es que esta funcion ReadString devuelve un String y necesito pasarle el resultado a la funcion MessageBox, que espera un char
Por cierto, sigo sin saber como cambiar el idioma de los botones.
Un saludo |
|
| Volver arriba |
|
 |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
Publicado: Mie 15 Mar, 2006 9:47 am Asunto: |
|
|
utiliza la función c_str(). Es decir, si cad1 es el String que lees del fichero . INI de idiomas, solo tienes que hacer: cad1.c_str()
Un saludo |
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Mie 15 Mar, 2006 10:05 am Asunto: |
|
|
Gracias monica, es una funcion que conozco y siempre se me olvida utilizarla.
Muchisimas gracias |
|
| Volver arriba |
|
 |
Eduard Cdt

Registrado: 28 Nov 2005Mensajes: 8Ubicación: Cubelles
|
Publicado: Mie 15 Mar, 2006 1:37 pm Asunto: |
|
|
Respecto a YESNOCANCEL la traduccción depende de Windows.
Si tienes Windows en español, te aparece el MessageBox con SI NO CANCELAR. Deduzco que en otros idiomas aparecera el correspondiente.
Desconozco si se puede modificar Windows.
Una solución seria crear tu propia ventana imitando a un MessageBox, pero que permita cambiar el texto de los botones.
eduardser@hotmail.com |
|
| Volver arriba |
|
 |
Miguel Angel Torres Master


Registrado: 23 Abr 2006Mensajes: 282Ubicación: Siegen, Alemania
|
Publicado: Sab 06 May, 2006 3:45 pm Asunto: problema con .INI |
|
|
He realizado es siguiente archivo .ini con la siguentes información como aconsejan aqui:
[espa]
boton1=salir
boton2=cerrar
[ingles]
boton1=Exit
boton2=close
Luego creo un proyecto y agrego lo siguiente:
#include <IniFiles.hpp>
TIniFile *Conf;
y luego en el FormCreate esto:
Conf=new TIniFile("C\\Builder\\ArchivosINI\\idioma.ini");
y luego meto un boton y en edit en la forma y dentro del boton meto lo siguente:
Edit1->Text=Conf->ReadString("espa","boton1","No");
Mi duda es que siempre cuando presiono el boton me sale "No", mas no el valor de boton1. Agradecería q me ayudaran a solucionar esta duda ya que es la primera vez q trabajo con archivos .INI. Gracias por su atención..... |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|