05
Jul
08

Internacionalización de aplicaciones Qt

Algo muy importante es que nuestras aplicaciones estén preparadas para la traducción a otros idiomas, un ejemplo muy bueno son las lenguas indígenas de Guatemala, para no ir tan lejos, tal vez se necesite que nuestra aplicación la pueda usar una persona que no sabe español, alemanes, ingleses, etc. etc. jejeje.

Para poder traducir fácilmente nuestra aplicación lo primero que hacemos es usar el objeto QTranslator, este tiene que ir en el main.cpp, ejemplo

Q_INIT_RESOURCE(application);
QTranslator translator;
QApplication app(argc, argv);
translator.load(“qt4_internacional_en”);
app.installTranslator(&translator);

El translator.load lo que hace es abrir el archivo de traducción que queramos usar, en este ejemplo es qt4_internacional_en (en este ejemplo el archivo tiene que estar en la misma carpeta que el ejecutable), como se puede ver vamos a traducir nuestra aplicación al ingles, este archivo tiene la extención “qm” -> “qt4_internacional_en.qm”, estos archivos qm se generan a traves de un archivo “ts”, asi que vamos a ver el proceso para crear el archivo “ts”, traducir el texto del “ts” y generar el archivo “qm”.

Primero tenemos que preparar nuestro código fuente para crear el archivo “ts” ya que la aplicación que crea este archivo lo que hace es sacar del código fuente de nuestro programa lo que se va a traducir.

Nota: Antes de empezar quiero hacer una observación, a la hora de crear los archivos cpp y h para un formulario creado con el diseñador de qt, KDevelop lo deja asi:

i_ventana::i_ventana(QWidget* parent, Qt::WFlags fl)
: QDialog( parent, fl ), Ui::Dialog()

QDevelop lo deja asi:

i_ventana::i_ventana( QWidget * parent, Qt::WFlags f)
: QDialog(parent, f)

Lo generado por KDevelop tiene algo de mas comparado con el de QDevelop, el Ui::Dialog(), si creamos el archivo “ts” con eso a la hora de traducir veremos algo asi:

Se puede ver que el grupo por así decirlo es Ui, si lo hacemos así no funcionará ni a patadas, lo mejor es quitarle esa parte, no le pasa nada al programa, si trabajamos con QDevelop pues no tenemos que hacer nada.

Codificar

Antes de crear el archivo “ts” tenemos que indicar en el código fuente de nuestro programa que es lo que se va a traducir, eso lo hacemos con la función ‘tr’ ejemplo:

Label->setText( tr(“Texto a traducir”) );

Es como el i18n que se usa con KLocale de KDE. Algo muy importante es que no debemos hacer lo siguiente:

tr( ” Los ” + variable_puntos + ” puntos del examen, ” + variable_nombre + ” fue el que los obtuvo” )

No podemos concatenar cadenas de esa manera ya que el orden de las palabras no son el mismo en otros idiomas, la traducción de esa frase en ingles es la siguiente ( lo traducí con google ):

the 5 points of the review, which was Pedro won

Si concatenamos las cadenas así la traducción podría quedar algo así:

the 5 points of the review,Pedro which was won

Tal vez no sea muy bueno el ejemplo pero se puede ver que las palabras cambiaron de lugar y eso no es bueno, la manera correcta de hacerlo es la siguiente:

tr(“Los %1 puntos del examen, %2 fue el que los obtuvo”,”Este es un comentario”).arg(“5”).arg(“pedro”)

En el texto se usa %1 y %2 (se puede usar los que se quiera, %3, %4, etc), estos serán reemplazados por lo que contenga los argumentos, arg(“5”) y arg(“Pedro”), el %1 será reemplazado por 5 y %2 por Pedro, el segundo parámetro es un comentario, este comentario es para ayudar al traductor a saber de que se trata el mensaje, puede ser necesario utilizarlo o no, tal vez se necesite traducir solo la palabra “save”, puede que sea salvar, o guardar un archivo, etc. en estos casos es bueno usar el comentario, este comentario lo podrá ver el traductor cuando este utilizando Qt Linguist pero no será visible para el usuario del programa.

Crear el archivo ‘ts’ y traducir

Cuando ya tenemos preparado nuestro código fuente, utilizamos la consola y nos vamos a la carpeta que contenga los archivos cpp de nuestro programa y ejecutamos:

lupdate *.cpp -ts qt4_internacional_en.ts

este comando extrae las cadenas que se tengan que traducir y los guarda en el archivo “qt4_internacional_en.ts”, ahora abrimos ese archivo con Qt Linguist, especificamos el idioma al que traduciremos en el menú de “edit” y en “Translation File Settings”, en este caso le puse que lo voy a traducir al ingles de Estados Unidos.

Como se puede ver ahora ya el grupo no es Ui, como se muestraba en la imagen anterior, ahora si funcionará la traducción, se puede ver el comentario que aparece para que el traductor sepa de que se trata, el traductor traduce el texto y mueve el %1 y %2 a las posiciones que le corresponden en el nuevo idioma, cuando esta lista esa traducción hacemos click en “Done and Next” para pasar a la siguiente frase a traducir.

Generando el archivo ‘qm’

Cuando terminamos de traducir guardamos el archivo y vamos al menú “File” y hacemos click en “Release”, esto nos generará el archivo ‘qm’, ahora solo es de copiar este archivo a la carpeta donde esta el ejecutable para que funcione, claro esta que a la hora de especificar el archivo ‘qm’ a usar por el programa le podemos decir la dirección donde esta para no tener que copiarlo a la misma carpeta donde esta el ejecutable, imagínense el /usr/bin lleno de archivos ‘qm’, jejeje,

Así quedaría la aplicación con la traducción al ingles, este también funciona para Windows, les dejo el código fuente para que lo trateen: qt4_internacional.tar.gz

Anuncios

1 Response to “Internacionalización de aplicaciones Qt”


  1. abril 13, 2010 en 3:37 pm

    Gracias!
    Era exacto lo que estaba buscando.


Responder

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


CGSOL 2008

Publicidad CGSOL 2008

A %d blogueros les gusta esto: