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

本文详细介绍了Qt应用程序的国际化翻译流程,包括使用qsTr和tr函数包裹文本,生成和更新ts文件,使用Qt Linguist进行翻译,以及加载qm文件。同时,还探讨了QT_TRANSLATE_NOOP的使用,如何翻译函数内外的字符串段和map中的内容,提供了一个完整的cpp和QML的示例。通过这个过程,开发者可以为Qt应用添加多语言支持。
摘要由CSDN通过智能技术生成


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 命令生成:
在这里插入图片描述

常用指令:
① 切换硬盘目录,输入盘+冒号,如: c: 、d:、e:
② dir 列举目录(相当于ls)
③ cd 进入目录(一样)
④ table 补全命令(一样)

使用 lupdate TranslationsDemo.pro

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

第一次使用,生产翻译文档
lupdate -verbose TranslationsDemo.pro
lrelease -verbose zh_CN.ts

后续经常使用

更新翻译
lrelease -verbose zh_CN.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): 国际化(下)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值