C++ QT-QML翻译重传

C++ QT-QML翻译重传,c++,qt,qml,C++,Qt,Qml,我正在Windows上运行QT5.10.1,而应用程序仅在QML中制作。我正在尝试使用新的retranslate()在运行时更改语言。当前代码与使用附加的getEmptyString()的文本配合良好。但是qsTr()中的其余文本没有TranslationHandler.cpp为空,并且我尚未清理包含的内容 因此,我能够使用context属性从QML设置语言。我还检查了引擎,所以引擎是同一个实例。你知道为什么重传功能不起作用吗 谢谢你的帮助 main.cpp: #include <QGui

我正在Windows上运行QT
5.10.1
,而
应用程序
仅在
QML
中制作。我正在尝试使用新的
retranslate()
在运行时更改语言。当前代码与使用附加的
getEmptyString()
的文本配合良好。但是
qsTr()
中的其余文本没有
TranslationHandler.cpp
为空,并且我尚未清理包含的内容

因此,我能够使用context属性从QML设置语言。我还检查了引擎,所以引擎是同一个实例。你知道为什么重传功能不起作用吗

谢谢你的帮助

main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTranslator>
#include <QtGui>
#include <QQmlContext>
#include <QDebug>
#include <QQmlEngine>
#include "translationhandler.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    TranslationHandler transHndl(&engine);

    engine.rootContext()->setContextProperty("translateHandler", &transHndl);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}
#ifndef TRANSLATIONHANDLER_H
#define TRANSLATIONHANDLER_H
#include <QTranslator>
#include <QString>
#include <QGuiApplication>
#include <QObject>
#include <QDebug>
#include <QQmlEngine>

class TranslationHandler : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)

public:
    explicit TranslationHandler(QQmlEngine *engine)
    {
        m_translator1 = new QTranslator(this);
        m_currentLanguage = "en";
        m_engine = engine;
    }

    QString getEmptyString()
    {
        return "";
    }

    Q_INVOKABLE QString getCurrentLanguage()
    {
        return m_currentLanguage;
    }

    Q_INVOKABLE void selectLanguage(QString language)
    {
        if(language == QString("jp"))
        {
            m_currentLanguage = language;
            m_translator1->load(":/translation/qml_jp.qm");
            qGuiApp->installTranslator(m_translator1);
            m_engine->retranslate();
        }
        if(language == QString("en"))
        {
            m_currentLanguage = language;
            qGuiApp->removeTranslator(m_translator1);
            m_engine->retranslate();
        }
        emit languageChanged();
    }

signals:
    void languageChanged();

private:
    QTranslator *m_translator1;
    QString m_currentLanguage;
    QQmlEngine *m_engine;

public slots:
};

#endif // TRANSLATIONHANDLER_H
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“translationhandler.h”
int main(int argc,char*argv[])
{
QCoreApplication::setAttribute(Qt::AA_enableHighdDiscaling);
QGUI应用程序应用程序(argc、argv);
qqmlaplicationengine;
TranslationHandler transHndl(和引擎);
engine.rootContext()->setContextProperty(“translateHandler”和&transHndl);
engine.load(QUrl(QStringLiteral(“qrc:/main.qml”));
if(engine.rootObjects().isEmpty())
返回-1;
返回app.exec();
}

TranslationHandler.h:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTranslator>
#include <QtGui>
#include <QQmlContext>
#include <QDebug>
#include <QQmlEngine>
#include "translationhandler.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    TranslationHandler transHndl(&engine);

    engine.rootContext()->setContextProperty("translateHandler", &transHndl);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}
#ifndef TRANSLATIONHANDLER_H
#define TRANSLATIONHANDLER_H
#include <QTranslator>
#include <QString>
#include <QGuiApplication>
#include <QObject>
#include <QDebug>
#include <QQmlEngine>

class TranslationHandler : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)

public:
    explicit TranslationHandler(QQmlEngine *engine)
    {
        m_translator1 = new QTranslator(this);
        m_currentLanguage = "en";
        m_engine = engine;
    }

    QString getEmptyString()
    {
        return "";
    }

    Q_INVOKABLE QString getCurrentLanguage()
    {
        return m_currentLanguage;
    }

    Q_INVOKABLE void selectLanguage(QString language)
    {
        if(language == QString("jp"))
        {
            m_currentLanguage = language;
            m_translator1->load(":/translation/qml_jp.qm");
            qGuiApp->installTranslator(m_translator1);
            m_engine->retranslate();
        }
        if(language == QString("en"))
        {
            m_currentLanguage = language;
            qGuiApp->removeTranslator(m_translator1);
            m_engine->retranslate();
        }
        emit languageChanged();
    }

signals:
    void languageChanged();

private:
    QTranslator *m_translator1;
    QString m_currentLanguage;
    QQmlEngine *m_engine;

public slots:
};

#endif // TRANSLATIONHANDLER_H
\ifndef TRANSLATIONHANDLER\u H
#定义TRANSLATIONHANDLER_H
#包括
#包括
#包括
#包括
#包括
#包括
类TranslationHandler:公共QObject
{
Q_对象
Q_属性(QString emptyString READ getEmptyString NOTIFY languageChanged)
公众:
显式TranslationHandler(QQmlEngine*引擎)
{
m_translator 1=新的QTranslator(本);
m_currentLanguage=“en”;
m_发动机=发动机;
}
QString getEmptyString()
{
返回“”;
}
Q_可调用的QString getCurrentLanguage()
{
返回m_currentLanguage;
}
Q_可调用void selectLanguage(QString语言)
{
如果(语言==QString(“jp”))
{
m_currentLanguage=语言;
m_translator1->load(“:/translation/qml_jp.qm”);
qGuiApp->installTranslator(m_translator 1);
m_引擎->重新传输();
}
如果(语言==QString(“en”))
{
m_currentLanguage=语言;
qGuiApp->removeTranslator(m_translator1);
m_引擎->重新传输();
}
emit languageChanged();
}
信号:
void languageChanged();
私人:
QTranslator*m_translator1;
QString m_currentLanguage;
QQmlEngine*m_发动机;
公众时段:
};
#endif//TRANSLATIONHANDLER\u H

这已确认为错误,将在5.12版中修复。如果你想自己编译,请检查错误报告


您知道emptyString的用途吗?如果您使用的是Qt>=5.10版本,则不再需要使用该空字符串。空字符串是本示例中唯一可用的内容。我已将空字符串添加到一个文本中,这是设置新语言时唯一更改的文本请注意,PropertyChanges元素()中包含的字符串有一个错误,在Qt 5.11 Beta中修复了该错误,可能是
ListElement
中的qsTr也有问题,因为这是我的大部分字符串所在的位置。有没有找到一个解决方案可以在5.12之前的版本上工作?thanks@Nmaster88抱歉,在bug修复之前我没有找到方法。