Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Another "change qt application language at runtime" thread.



  • There is no significant difference in implementing changeEvent() or translationChanged() - both contain basically the same code regarding the translation (calling ui.retranslateUi() and possibly some manual code). There's a minimal overhead with the event handling in changeEvent().

    Just a matter of KISS - no more complex than needed :)



  • I want to thank you for helping me out! I am very grateful.

    I've decided to follow Volkers advice and do it the "official" way. I'm sorry BilbonSacquet - I am really grateful for your work!

    I'm trying to follow the example from the link I give in #0 again. I have a few questions though.
    How/where is the "language name" added to the actual Ui, enabling the user to choose between available languages? I'm not sure what the component in the example is, but I'm gonna use a qtablewidget to hold my language names. Is this done the same way as in the example?

    Thank you so much for your time!



  • In the wiki article, the available languages are determined by the available translation files (.qm) in method createLanguageMenu. You can go this way too, or implement your own algorithm, of course.



  • I'm now able to change the language on the static strings made in my designer.

    I'm not sure how to change it for all the strings written in code. I thought it would be done the same way as the designer strings. When changing the language, the dynamic string changes to the content of the string in the designer. This is not intended of course - instead it should get the translation from the .qm file.

    I'm also a bit confused concerning a line in the wiki article:

    @void MainWindow::loadLanguage(const QString& rLanguage)
    {
    if(m_currLang != rLanguage)
    {
    m_currLang = rLanguage;
    QLocale locale = QLocale(m_currLang);
    QLocale::setDefault(locale);
    QString languageName = QLocale::languageToString(locale.language());
    switchTranslator(m_translator, QString("TranslationExample_%1.qm").arg(rLanguage));
    switchTranslator(m_translatorQt, QString("qt_%1.qm").arg(rLanguage)); <------------
    ui.statusBar->showMessage(tr("Current Language changed to %1").arg(languageName));
    }
    }@

    The line marked with an arrow is the one confusing me. My guess is that it has something to do with my mentioned problem (Change language for dynamic strings)?

    Thank you for your time!

    EDIT:
    I of course wrap my strings in tr().

    When the changeEvent is called with a LanguageChange event, @ui.retranslateUi(this);@ is "run". When looking into this function, it seems that the application indeed just takes the string written in the designer.

    How do I get the string from my .qm file instead?

    EDIT2:
    I just wanted to add that my application is made using a model-view-controller pattern. All my Ui's are initialized in the controller class. Upon initialization the Ui's get a title. I don't know if this info helps?

    Please, I'm totally locked here :(



  • The strings in ui.retranslateUi() are taken from the .qm file.
    Of course, they contain only the strings in the form itself. Everything else - i.e. the strings used programmatically in your code - must be retranslated in the event too.

    So, if you have somewhere in your C++ code a line like this:

    @
    ui->infoLabel->setText(tr("Let's go this way"));
    @

    You will have to add to the event handler that very same line too.

    There is no automatic retranslation in Qt! You must do this manually on a language change. ui.retransalateUi() does exactly this - it's just for convenience that the code is generated by uic.

    The line marked with an arrow just loads the Qt translations. If you omit that, the system messages (like in file dialogs etc.) are not translated.

    Additionally, I strongly recommend reading thoroughly through the docs of the translation and internationalization system in order to understand what's going on and how Qt computes the translated strings:

    • "Internationalization with Qt":/doc/qt-4.7/internationalization.html
    • "Qt Linguist for Programmers":/doc/qt-4.7/linguist-programmers.html
    • [[Doc:QTranslator]] API docs
    • "Writing Source Code for Translation":/doc/qt-4.7/i18n-source-translation.html
    • The "Hello tr() example":/doc/qt-4.7/linguist-hellotr.html
    • The "I18N example":/doc/qt-4.7/tools-i18n.html


  • Thank you for the reply.

    I just wanna illustrate my scenario:

    From menuList.cpp
    @MenuList::MenuList(QString title, , QWidget *parent) : QWidget (parent) {
    ui.setupUi(this);
    ui->infoLabel->setText(title);
    }@

    From controller.cpp
    @void Controller::initializeScreens() {
    mainMenuScreen = new MenuList(tr("Main menu"), ...);
    settingsMenuScreen = new MenuList(tr("Settings"), ...);
    }@

    I tried adding
    @ui->infoLabel->setText(title);@
    to the event handler (in the MenuList class) like you said, but I get nothing.

    Does it have something to do with me inserting 'title' instead of an actual string (like "textstring here")?

    I've already looked at many of the links you provided, but I will look again.

    Thanks!



  • you must handle the language change in that class, that has the tr("xxx") for the string. You do not do it in the class that gets the already translated string. If the latter was true, you wouldn't have a ui.retranslateUi, but the QLabel would retranslate it's contents.



  • I now managed to get it up and running as intended.

    I did as you told me - handled the language change in the classes containing the strings, and then reloaded the strings in my ui classes.

    Thank you so much for helping me out! Dankeschön!!

    Have a nice day!



  • You're welcome - keine Ursache, gern geschehen! :-)



  • I don't think you need implement a Template Class and inherit all of its classes. Just override the changeEvent(QEvent* event) function on widgets from your View Layer, like that:

    @void MyWidget::changeEvent(QEvent* event){
    if (event->type() == QEvent::LanguageChange) {
    widget.retranslateUi(this);
    }
    QWidget::changeEvent(event);
    }@

    I hope that helped.


Log in to reply