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

Posted 火山上的企鹅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

显示:

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

以上是关于Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Qt 国际化翻译

Qt系列文章之三十九(Qt多语言国际化程序实例设计实现)

Qt系列文章之三十九(Qt多语言国际化程序实例设计实现)

Qt中tr()的作用