0

I start to have quite a decent software but I would like to translate it, so I added a combobox in my settings menu. I would like the program to translate when the user selects his language inside the combobox. I already translated using Linguist and generated TS and QM files. I linked the ts file in my .pro.

main.cpp

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();
}

translator.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")
        }
    }
 }

I tried using qmlRegisterType("issou.translator", 1, 0, "Translator"); then importing it in the qml. Then i could create a Translator object in my qml and call some functions. But that didn't work. Any suggestions ?

Thank you.

wissou
  • 9
  • 1
    Typo: change `selectLanguage("fr");` to `translator.selectLanguage("fr");` – eyllanesc Mar 27 '19 at 15:59
  • I get the same error : /usr/bin/ld: CMakeFiles/project.dir/src/main.cpp.o: in function `Translator::Translator(QQmlEngine*)': main.cpp:(.text._ZN18TranslatorC2EP10QQmlEngine[_ZN18TranslatorC5EP10QQmlEngine]+0x27): undefined reference to `vtable for Translator' /usr/bin/ld: CMakeFiles/projectdir/src/main.cpp.o: in function `Translator::~Translator()': main.cpp:(.text._ZN18TranslatorD2Ev[_ZN18TranslatorD5Ev]+0xf): undefined reference to `vtable for Translator' Is my problem not about binding ? – wissou Mar 27 '19 at 17:21
  • The error indicates that you are not running the MOC. If you are a beginner I recommend you use qmake instead of cmake – eyllanesc Mar 27 '19 at 17:27
  • Thank you for your fast answers. I just tried with qcreator so that it doesn't use cmake, and it gives me the same error. – wissou Mar 27 '19 at 17:41
  • ***CMakeFiles** /project.dir/src/main.cpp.o*, that's why I pointed out that you use cmake, if you upload your code to a repo like github I could test it, maybe the problem is in another side – eyllanesc Mar 27 '19 at 17:42

0 Answers0