首页 > 解决方案 > Qt:用 qml 对象连接翻译器

问题描述

我开始有一个相当不错的软件,但我想翻译它,所以我在我的设置菜单中添加了一个组合框。当用户在组合框中选择他的语言时,我希望程序进行翻译。我已经使用 Linguist 翻译并生成了 TS 和 QM 文件。我在我的 .pro 中链接了 ts 文件。

主文件

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    Translator translator(&engine);

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

    return app.exec();
}

翻译器.h

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

public:
    explicit Translator(QQmlEngine *engine)
    {
        translator = new QTranslator(this);
        engine = engine;
    }

    QString getEmptyString()
    {
        return "";
    }

    Q_INVOKABLE void selectLanguage(QString language)
    {
        if(language == QString("en"))
        {
            translator->load(":/translation/lang_en.qm");
            qGuiApp->installTranslator(translator);
            engine->retranslate();
        }
        if(language == QString("fr"))
        {
            qGuiApp->removeTranslator(translator);
            engine->retranslate();
        }
        emit languageChanged();
    }

signals:
    void languageChanged();

private:
    QTranslator *translator;
    QQmlEngine *engine;
};

main.qml

ComboBox {
    id: comboLangage
    currentIndex: 0
    model: [ qsTr("Français"), qsTr("Anglais") ]
    width: 200
    onActivated: {
        if(comboLangage.currentIndex == 0){
            selectLanguage("fr"); // how do i call this method ?
        }
        else if(comboLangage.currentIndex == 1){
            selectLanguage("en")
        }
    }
 }

我尝试使用 qmlRegisterType("issou.translator", 1, 0, "Translator"); 然后将其导入 qml。然后我可以在我的 qml 中创建一个 Translator 对象并调用一些函数。但这没有用。有什么建议么 ?

谢谢你。

标签: c++qtqmlqt-linguist

解决方案


推荐阅读