Traducción de internacionalización de Qt, función de cadena externa, traducción de mapa (QT_TRANSLATE_NOOP)


Código fuente de GitHub:     QmlLearningPro , subproyecto seleccionado: TranslationsDemo.pro

Para otros artículos de QML, haga clic aquí:     Notas de estudio de QT QUICK QML


1. Proceso de traducción de Qt

Proceso de traducción: la parte de traducción en el juego de números locos de Qt Ejemplo rápido de QML (programación mixta de QML C++, traducción, QSetting) :

inserte la descripción de la imagen aquí

1) Preparar el código fuente para la traducción

Use qsTr() para envolver en QML y use tr() para envolver en cpp. El texto envuelto en él será capturado por Qt Linguist para su traducción.

//main.qml
text:                   qsTr("Correct")

2) Generar archivo xxx.ts

Primero agregue el siguiente código al archivo TranslationsDemo.pro :

TRANSLATIONS += $$PWD/Translations/zh_CN.ts

Se puede generar usando dos métodos:

① En la barra de menú de Qt Creator, haga clic en Tools->External->Qt Linguist->Release update translation (lrelease)(lupdate) , y se generará un archivo ts en el directorio donde se encuentra el archivo de código fuente.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

② Use el comando CMD para generar:
inserte la descripción de la imagen aquí
use luupdate TranslationsDemo.pro

inserte la descripción de la imagen aquí
se genera el archivo ts
inserte la descripción de la imagen aquí

3) zh_CN.ts se puede agregar en qml.qrc

inserte la descripción de la imagen aquí

4) Traducir y generar archivos qm

Método 1: haga clic con el botón derecho para abrir el archivo de traducción zh_CN.ts
inserte la descripción de la imagen aquí
y publíquelo después de la traducción:
inserte la descripción de la imagen aquí
se genera el archivo zh_CN.qm
inserte la descripción de la imagen aquí

Método 2, ejecuta el comando:

 lrelease -verbose zh_CN.ts

inserte la descripción de la imagen aquí
Se genera el archivo zh_CN.qm
inserte la descripción de la imagen aquí
5) Agregue el archivo zh_CN.qm a qml.qrc:

inserte la descripción de la imagen aquí

6) Cargue el archivo de traducción qm

Cargue el archivo qm generado en main.cpp

void setLanguage(QGuiApplication *app) {
    
    

    QLocale locale = QLocale::system();

    if(locale.language() == QLocale::Chinese)
    {
    
    
        QTranslator *translator = new QTranslator(app);
        ///--以下三种方法都可以加载翻译文件
        if(translator->load(":/translations/zh_CN.qm"))
//          if(translator->load(locale, ":/translations/zh_CN.qm", "", ":/i18n"))
//          if (translator->load(locale, "zh_CN", ".", ":/translations", ".qm"))
        {
    
    
            app->installTranslator(translator);
        }
        else {
    
    
            qDebug() << "Error loading source localization ";
        }
    }
}

Finalmente compílalo.

2. Usa QT_TRANSLATE_NOOP para traducir

En el archivo .cpp, la traducción ordinaria se puede agregar al paquete de campo tr() y no hay introducción aquí.

Y usar QT_TRANSLATE_NOOP puede traducir múltiples segmentos de cadena fuera de la función y traducir en el mapa

1) Cadenas en funciones, como en el mapa:

Si no es factible envolverlo directamente con tr(), simplemente use QT_TRANSLATE_NOOP .

Consulte el código fuente para obtener más detalles, aquí solo hay fragmentos:

① Prueba de traducción.cpp

QStringList TranslationTest::GetQStringList() {
    
    
    QStringList tmp;

    QMap<uint32_t, QString> flightMode = {
    
    
        {
    
     STABILIZE,    AppTranslate("Stabilize")},        //
        {
    
     ALT_HOLD,     AppTranslate("Altitude Hold")},
        {
    
     POS_HOLD,     AppTranslate("Position Hold")}
    };

    for(uint32_t i: flightMode.keys()) {
    
    
        tmp.append(flightMode[i]);  // tmp << enumToString[i];
    }
    return  tmp;
}

QString TranslationTest::AppTranslate(const char* cchar)
{
    
    
    const char* context = "ContextTest";
    return _app->translate( context, QT_TRANSLATE_NOOP(context, cchar));
}

② Prueba de traducción.h

Q_PROPERTY(QStringList qStringListTest      READ GetQStringList       CONSTANT)

③ Archivo de traducción zh_CN.ts

<context>
    <name>ContextTest</name>
    <message>
        <location filename="../TranslationTest.cpp" line="63"/>
        <source>Stabilize</source>
        <translation>增稳</translation>
    </message>
    <message>
        <location filename="../TranslationTest.cpp" line="50"/>
        <source>Altitude Hold</source>
        <translation>高度保持</translation>
    </message>
    <message>
        <location filename="../TranslationTest.cpp" line="50"/>
        <source>Position Hold</source>
        <translation>位置保持</translation>
    </message>
</context>

④ En la interfaz de usuario: main.qml

Repeater {
    
    
    id:         repeater
    model:      TranslationTest.qStringListTest
    Label {
    
    
        text:                       modelData
        font.pointSize:             15
        font.bold:                  true                     //黑体
    }
}

inserte la descripción de la imagen aquí

2) Cadena fuera de la función

① Prueba de traducción.cpp:

const  char *MathProblem::greeting_strings[] = {
    
    
    QT_TRANSLATE_NOOP( "FriendlyConversation",  "Hello"),
    QT_TRANSLATE_NOOP( "FriendlyConversation",  "Goodbye")
    QT_TRANSLATE_NOOP( "FriendlyConversation",  "How are you")
};
QString TranslationTest::globalGreeting(int type)
{
    
    
    return _app->translate( "FriendlyConversation", greetingStrings[type]);
}

② Prueba de traducción.h:

Q_INVOKABLE QString globalGreeting(int type) ;

③ Archivo de traducción zh_CN.ts

<context>
    <name>FriendlyConversation</name>
    <message>
        <location filename="../TranslationTest.cpp" line="50"/>
        <source>Hello</source>
        <translation>你好</translation>
    </message>
    <message>
        <location filename="../TranslationTest.cpp" line="50"/>
        <source>Goodbye</source>
        <translation>再见</translation>
    </message>
    <message>
        <location filename="../TranslationTest.cpp" line="50"/>
        <source>How are you?</source>
        <translation>你好吗?</translation>
    </message>
</context>

④ interfaz de usuario: main.qml:

Label {
    
    
    text:  TranslationTest.globalGreeting(0)
    font.pointSize: 15
}
Label {
    
    
    text:  TranslationTest.globalGreeting(1)
    font.pointSize: 15
}

espectáculo:

![Insertar descripción de la imagen aquí](https://img-blog.csdnimg.cn/c0b46911831b49c1878ca491f52539d6.png

Referencia: Qt Learning Road (34): Internacionalización (Parte 2)

Supongo que te gusta

Origin blog.csdn.net/qq_16504163/article/details/125686784
Recomendado
Clasificación