Qt Linguist translation error
-
Hello!
I am using Qt Linguist to translate my app to chinese. I want to do it inside the application, in a settings window.
I have a QComboBox to switch between the languages, and when I select the option, this is my code:
if (arg1.compare("Chinese", Qt::CaseInsensitive) == 0) { T.load(":/Translations/resources/translations/myApp_ch.qm"); QApplication::installTranslator(&T); QCoreApplication::installTranslator(&T); ui->retranslateUi(this); }
The problem is that there are some windows that do not translate.
However, if I do it from main.cpp, it works fine:
QApplication a(argc, argv); QTranslator T; T.load(":/Translations/resources/translations/myApp_ch.qm"); a.installTranslator(&T);
What am I doing wrong?
Thank you very guys!
-
@ivanicy said in Qt Linguist translation error:
What am I doing wrong?
Only newly created windows are using the translator automatically. For the rest you have to watch for the
LanguageChange
event as explained here. -
@Christian-Ehrlicher And, how should I do that? I have to reimplement the changeEvent in every windows in my app?
-
@ivanicy said in Qt Linguist translation error:
I have to reimplement the changeEvent in every windows in my app?
if you want online translation, yes. I would simply restart the app / tell the user to do so.
-
@ivanicy if all your translatable texts are inside your ui form classes, than it's a simple matter of calling
ui->retranslateUi(this);
on each form, after the translator is installed.
However, if you yourself set a - for translation marked -string inside your application (tr("")), you will have to set that string again after the translator is loaded and installed
-
@ivanicy It's not that complicated. Basically you need to write custom slot for every class that has a form. Slot is rather simple:
void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }
This is the example for a main program window (hence
MainWindow
andQMainWindow
), but for classes that origin in, let's say, QDialog you'd obviously need to change code a bit. -
@artwaw Yes, I know how to do it, but I have a lot of windows in my app hehe. Thank you very much guys. @J-Hilk @Christian-Ehrlicher.
I have another question about it. I have lines like this in my code:
QString sText; if (sText.compare(tr("something"), Qt::CaseInsensitive) == 0) { ... }
In these cases, the compare function doesn't work. But I need to compare with the translated word. How can I fix it?
-
@ivanicy said in Qt Linguist translation error:
In these cases, the compare function doesn't work.
What does this mean?
-
@Christian-Ehrlicher The compare function doesn't work when I have a tr() inside it. It doesn't enter in this if().
-
Then you should look what tr("seomthing") returns matches what you're expecting.
-
@ivanicy said in Qt Linguist translation error:
I use this function in more windows. I have to use QMainWindow in this windows too?
First thing in the changeEvent is to call respective ancestor's changeEvent.
EDIT: I use QMainWindow in the example since I stated that it is for QMainWindow descendant. If your window inherits from QDialog you should call QDialog, etc...
-
Sorry for bothering so much. I have detected that this method don't translate texts that I have put by coding, for example context menus or treeviews.
I use
ui->retranslateUi(this);
Is there something missing to translate the code part as well?
Thank you and sorry guys :(
-
@ivanicy said in Qt Linguist translation error:
ui->retranslateUi(this);
As you can see, only the stuff in the ui struct can be translated with this call - how should this translate e.g. text from a model or somewhere else? The rest has to be done manually.
-
@ivanicy said in Qt Linguist translation error:
Sorry for bothering so much. I have detected that this method don't translate texts that I have put by coding, for example context menus or treeviews.
I use
ui->retranslateUi(this);
Is there something missing to translate the code part as well?
Thank you and sorry guys :(
@J-Hilk said in Qt Linguist translation error:
However, if you yourself set a - for translation marked -string inside your application (tr("")), you will have to set that string again after the translator is loaded and installed