Qt 国际化翻译,函数外部字符串、Map 翻译(QT_TRANSLATE_NOOP)


GitHub 源码:     QmlLearningPro选择子工程:TranslationsDemo.pro

QML 其它文章请点击这里:     QT QUICK QML 学习笔记


1. Qt 的翻译流程

翻译流程:Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程、翻译、QSetting ) 中的翻译部分:

在这里插入图片描述

1)准备要翻译的源代码

在 QML 中使用 qsTr() 来包裹,在 cpp 中使用 tr() 来包裹。用它包裹的文本会被 Qt Linguist(Qt 语言家)捕捉到从而进行翻译工作。

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

2)生成 xxx.ts 文件

先在 TranslationsDemo.pro 文件中添加如下代码:

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

可以使用两种方法生成:

① 在 Qt Creator 的菜单栏中依次点击 工具->外部->Qt语言家->发布更新翻译(lrelease)(lupdate),就会在源代码文件所在的目录生成 ts 文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

② 使用 CMD 命令生成:
在这里插入图片描述
使用 lupdate TranslationsDemo.pro

在这里插入图片描述
生成了 ts 文件
在这里插入图片描述

3) 可在 qml.qrc 中添加 zh_CN.ts

在这里插入图片描述

4)翻译并生成 qm 文件

方法一: 右键打开翻译文件 zh_CN.ts
在这里插入图片描述
翻译后发布:
在这里插入图片描述
生成了 zh_CN.qm 文件
在这里插入图片描述

方法二,执行指令:

 lrelease -verbose zh_CN.ts

在这里插入图片描述
生成了 zh_CN.qm 文件
在这里插入图片描述
5)添加 zh_CN.qm 文件到 qml.qrc 中:

在这里插入图片描述

6)加载 qm 翻译文件

在 main.cpp 中加载生成的 qm 文件

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 ";
        }
    }
}

最后编译即可。

2. 利用 QT_TRANSLATE_NOOP 翻译

在 .cpp 文件中普通的翻译加入 tr() 字段包裹即可,这里不多介绍。

而利用 QT_TRANSLATE_NOOP 能翻译函数外的多个字符串段 和 map 中翻译

1)函数内的字符串,如 map 中:

如果直接用 tr() 包裹是行不通的,用 QT_TRANSLATE_NOOP 即可。

具体见源码,这里只摘取片段:

① TranslationTest.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));
}

② TranslationTest.h

Q_PROPERTY(QStringList qStringListTest      READ GetQStringList       CONSTANT)

③ 翻译文件 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>

④ ui中:main.qml

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

在这里插入图片描述

2)函数外的字符串

① TranslationTest.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]);
}

② TranslationTest.h:

Q_INVOKABLE QString globalGreeting(int type) ;

③ 翻译文件 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>

④ ui:main.qml:

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

显示:

![在这里插入图片描述](https://img-blog.csdnimg.cn/c0b46911831b49c1878ca491f52539d6.png

参考: Qt学习之路(34): 国际化(下)

猜你喜欢

转载自blog.csdn.net/qq_16504163/article/details/125686784