"Language Reverts to English When Missing .qm File"
-
So, I have 3 language options in my application, English and 2 others, say Language A and Language B. Suppose that the .qm file of B is missing. I select A and the UI translates to A. Then, I select B, I get an error message box, but the language shifts to English. I want it to remain A. I don't get what I am doing wrong. Here is the function where I install and remove the translator:
void LanguageSupport::onLanguageChanged(Language lang) { if(lang == LanguageSupport::English) { qApp->removeTranslator(&translator); } else{ QString filePath = getLanguageFilePath(lang); if(!translator.load(filePath)) { QMessageBox::critical(nullptr, "error", "Failed to load language translation file"); return; } qApp->installTranslator(&translator); } }
Note: I am not using this translator in any other file. Its a private member of the LanguageSupport class.
-
So, I have 3 language options in my application, English and 2 others, say Language A and Language B. Suppose that the .qm file of B is missing. I select A and the UI translates to A. Then, I select B, I get an error message box, but the language shifts to English. I want it to remain A. I don't get what I am doing wrong. Here is the function where I install and remove the translator:
void LanguageSupport::onLanguageChanged(Language lang) { if(lang == LanguageSupport::English) { qApp->removeTranslator(&translator); } else{ QString filePath = getLanguageFilePath(lang); if(!translator.load(filePath)) { QMessageBox::critical(nullptr, "error", "Failed to load language translation file"); return; } qApp->installTranslator(&translator); } }
Note: I am not using this translator in any other file. Its a private member of the LanguageSupport class.
@shreya_agrawal said in "Language Reverts to English When Missing .qm File":
I don't get what I am doing wrong.
You remove the old translator so how should it be used afterwards? You have to load the old ts file.
-
Thank you for your reply!
The translator is only removed when I select English language. But when I select Language A and then Language B, the translator is not being removed. -
Thank you for your reply!
The translator is only removed when I select English language. But when I select Language A and then Language B, the translator is not being removed.@shreya_agrawal seems like you're using the same stack allocated translator for everything:
removeTranslator(&translator)
!translator.load(filePath)
probably the reason.
-
@shreya_agrawal seems like you're using the same stack allocated translator for everything:
removeTranslator(&translator)
!translator.load(filePath)
probably the reason.
@J-Hilk
If I don't use the same translator, then how would it know which translator to remove when switching back to English? -
@J-Hilk
If I don't use the same translator, then how would it know which translator to remove when switching back to English?@shreya_agrawal keep a map of QTranslator pointers and the LanguageSupport enum as key?
-
@shreya_agrawal keep a map of QTranslator pointers and the LanguageSupport enum as key?
@J-Hilk
I tried implementing this approach, but still facing the same issue.// Load translators for all languages for (auto it = languageFiles.constBegin(); it != languageFiles.constEnd(); ++it) { QSharedPointer<QTranslator> translator = QSharedPointer<QTranslator>::create(); if (translator->load(it.value())) { translators[it.key()] = translator; } else { qDebug() << "Failed to load translator for language:" << it.key(); } }
void LanguageSupport::onLanguageChanged(Language lang) { // Remove all translators for (auto it = translators.constBegin(); it != translators.constEnd(); ++it) { qApp->removeTranslator(it.value().data()); } if(lang == LanguageSupport::English) { return; } auto translator = translators.value(lang); if (translator) { qApp->installTranslator(translator.data()); } else { QMessageBox::critical(nullptr, "Error", "Failed to load language translation file"); } }
Am I doing something wrong in this?
-
@J-Hilk
I tried implementing this approach, but still facing the same issue.// Load translators for all languages for (auto it = languageFiles.constBegin(); it != languageFiles.constEnd(); ++it) { QSharedPointer<QTranslator> translator = QSharedPointer<QTranslator>::create(); if (translator->load(it.value())) { translators[it.key()] = translator; } else { qDebug() << "Failed to load translator for language:" << it.key(); } }
void LanguageSupport::onLanguageChanged(Language lang) { // Remove all translators for (auto it = translators.constBegin(); it != translators.constEnd(); ++it) { qApp->removeTranslator(it.value().data()); } if(lang == LanguageSupport::English) { return; } auto translator = translators.value(lang); if (translator) { qApp->installTranslator(translator.data()); } else { QMessageBox::critical(nullptr, "Error", "Failed to load language translation file"); } }
Am I doing something wrong in this?
@shreya_agrawal maybe this ?
// Remove all translators for (auto it = translators.constBegin(); it != translators.constEnd(); ++it) { qApp->removeTranslator(it.value().data()); }
seems like you now always remove all translators and do not reinstall any when the loading fails :D
-
Ah! I got your point. Now, I am removing all translators only when English is selected and then reinstalling them for the respective languages and it works as intended. Thanks !
-