En esta página

Ejemplo de almohadilla de flecha

Comprender el concepto de contextos Qt Linguist y utilizar dos o más idiomas.

Captura de pantalla de Arrow Pad en inglés

Utilizaremos dos traducciones, francés y holandés, aunque no existe un límite efectivo en el número de traducciones posibles que se pueden utilizar con una aplicación.

Cuando se utiliza qmake, las líneas relevantes en arrowpad.pro son:

HEADERS      = arrowpad.h \
               mainwindow.h
SOURCES      = arrowpad.cpp \
               main.cpp \
               mainwindow.cpp

TRANSLATIONS = arrowpad_fr.ts \
               arrowpad_nl.ts

Si se utiliza CMake, las líneas relevantes en CMakeLists.txt son:

find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES fr nl)

qt6_add_translations(arrowpad
    QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION ${INSTALL_EXAMPLEDIR})

Ejecute lupdate. Debería producir dos archivos de mensajes idénticos arrowpad_fr.ts y arrowpad_nl.ts. Estos archivos contendrán todos los textos fuente marcados para su traducción con llamadas a tr() y sus contextos.

Si se utiliza qmake, lupdate debe ejecutarse manualmente:

lupdate arrowpad.pro

Si utiliza CMake, construya el objetivo update_translations para ejecutar lupdate:

cmake --build . --target update_translations

Consulte el manualQt Linguist para obtener más información sobre la traducción de aplicaciones Qt.

Recorrido línea por línea

En arrowpad.h definimos la subclase ArrowPad que es una subclase de QWidget. En la captura de pantalla anterior, el widget central con los cuatro botones es un ArrowPad.

class ArrowPad : public QWidget
{
    Q_OBJECT

Cuando se ejecuta lupdate no sólo extrae los textos fuente, sino que también los agrupa en contextos. Un contexto es el nombre de la clase en la que aparece el texto fuente. Así, en este ejemplo, "ArrowPad" es un contexto: es el contexto de los textos de la clase ArrowPad. La macro Q_OBJECT define así tr(x) en ArrowPad:

qApp->translate("ArrowPad", x)

Saber en qué clase aparece cada texto fuente permite Qt Linguist agrupar textos que están lógicamente relacionados, por ejemplo, todos los textos de un diálogo tendrán el contexto del nombre de la clase del diálogo y se mostrarán juntos. Esto proporciona información útil para el traductor, ya que el contexto en el que aparece el texto puede influir en cómo debe traducirse. Para algunas traducciones puede ser necesario cambiar los aceleradores de teclado y tener agrupados todos los textos de origen en un contexto (clase) determinado facilita al traductor realizar cualquier cambio de acelerador sin introducir conflictos.

En arrowpad.cpp implementamos la clase ArrowPad.

    upButton = new QPushButton(tr("&Up"));
    downButton = new QPushButton(tr("&Down"));
    leftButton = new QPushButton(tr("&Left"));
    rightButton = new QPushButton(tr("&Right"));

Llamamos a ArrowPad::tr() para la etiqueta de cada botón, ya que las etiquetas son texto visible para el usuario.

Captura de pantalla de Arrow Pad en inglés

class MainWindow : public QMainWindow
{
    Q_OBJECT

En la captura de pantalla anterior, toda la ventana es un MainWindow. Esto se define en el fichero de cabecera mainwindow.h. Aquí también, usamos Q_OBJECT, para que MainWindow se convierta en un contexto en Qt Linguist.

    arrowPad = new ArrowPad;

En la implementación de MainWindow, mainwindow.cpp, creamos una instancia de nuestra clase ArrowPad.

    exitAct = new QAction(tr("E&xit"), this);
    exitAct->setShortcut(QKeySequence(tr("Ctrl+Q", "Quit")));
    connect(exitAct, &QAction::triggered, this, &MainWindow::close);

También llamamos a MainWindow::tr() dos veces, una para la acción y otra para el acceso directo.

Nótese el uso de tr() para soportar diferentes teclas en otros idiomas. "Ctrl+Q" es una buena opción para Salir en inglés, pero un traductor holandés podría querer usar "Ctrl+A" (para Afsluiten) y un traductor alemán "Strg+E" (para Beenden). Cuando se utiliza tr() para aceleradores de teclas Ctrl, debe utilizarse la forma de dos argumentos con el segundo argumento describiendo la función que realiza el acelerador.

Nuestra función main() se define en main.cpp como de costumbre.

    QTranslator translator;
    if (translator.load(locale, u"arrowpad"_s, u"_"_s))
        app.installTranslator(&translator);

Elegimos qué traducción utilizar según la configuración regional actual. QLocale::system() puede verse influida por la configuración de la variable de entorno LANG, por ejemplo. Observe que el uso de una convención de nomenclatura que incorpora la configuración regional para los archivos de mensajes .qm, (y los archivos TS), facilita la implementación de la elección del archivo de traducción según la configuración regional.

Si no existe un fichero de mensajes QM para la configuración regional elegida, se utilizará el texto original y no se producirá ningún error.

Traducción al francés y al neerlandés

Empezaremos traduciendo la aplicación de ejemplo al francés. Inicie Qt Linguist con arrowpad_fr.ts. Debería obtener los siete textos fuente ("&Arriba", "&Izquierda", etc.) agrupados en dos contextos ("ArrowPad" y "MainWindow").

Ahora, introduzca las siguientes traducciones:

  • ArrowPad
    • &Arriba - &Haut
    • &Izquierda - &Gauche
    • &Derecha - &Droite
    • &Abajo - &Bas
  • MainWindow
    • E&Salir - &Quitter
    • Ctrl+Q - Ctrl+Q
    • &Archivo - &Fichero

El botón Done & Next marca la traducción como realizada y pasa al siguiente texto fuente. Es más rápido utilizar su atajo (véase la barra de menú Traducción) después de escribir cada traducción.

Guarde el archivo y haga lo mismo para el neerlandés trabajando con arrowpad_nl.ts:

  • ArrowPad
    • &Arriba - &Omhoog
    • &Izquierda - &Enlaces
    • &Derecha - &Rechts
    • &Abajo - Omlaa&g
  • MainWindow
    • E&xit - &Afsluiten
    • Ctrl+Q - Ctrl+A
    • Archivo - &Bestand

Tenemos que convertir los archivos fuente de traducción tt1_fr.ts y tt1_nl.ts en archivos QM. Podríamos utilizar Qt Linguist como hemos hecho antes; sin embargo, utilizar la herramienta de línea de comandos lrelease garantiza que se creen todos los archivos QM para la aplicación sin que tengamos que acordarnos de cargar y File|Release cada uno individualmente desde Qt Linguist.

Escribe

lrelease arrowpad.pro

cuando uses CMake, escribe

cmake --build . --target release_translations

Esto debería crear tanto arrowpad_fr.qm como arrowpad_nl.qm.

Para utilizar arrowpad_fr.qm, cambie el idioma de su sistema al francés. En Unix, uno de los dos comandos siguientes debería funcionar:

export LANG=fr
setenv LANG fr

En Windows o Mac, configure el idioma de la pantalla en francés.

Cuando ejecute el programa, debería ver la versión francesa:

Captura de pantalla de Arrow Pad en francés

Intente lo mismo con el neerlandés (utilice LANG=nl en Unix). Ahora debería aparecer la versión holandesa:

Captura de pantalla de Arrow Pad en neerlandés

Ejercicios

Marque una de las traducciones en Qt Linguist como no realizada, es decir, desmarcando la casilla "realizada"; ejecute lupdate, luego lrelease, y por último el ejemplo. ¿Qué efecto ha tenido este cambio?

Marque LANG=fr_CA (francés de Canadá) y ejecute de nuevo el programa de ejemplo. Explica por qué el resultado es el mismo que con LANG=fr.

Cambia uno de los aceleradores en la traducción al neerlandés para eliminar el conflicto entre &Bestand y &Boven.

Proyecto de ejemplo @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.