[qrvthtool] TranslationManager: Made some adjustments, including removing translators before updating them.

FIXME: qt_* and qtbase_* don't seem to be reloading properly when
changing the language at runtime, at least on Linux. Setting LC_ALL
seems to be the only way to get Qt's translations to switch.
This commit is contained in:
David Korth 2025-05-30 19:19:45 -04:00
parent b8c7cc7c09
commit 4e0f741910

View File

@ -40,7 +40,7 @@ public:
static TranslationManager *instance; static TranslationManager *instance;
// QTranslators // QTranslators
QTranslator *qtTranslator; array<QTranslator*, 2> qtTranslator; // 0 == qt, 1 == qtbase
QTranslator *prgTranslator; QTranslator *prgTranslator;
// List of paths to check for translations. // List of paths to check for translations.
@ -53,13 +53,9 @@ TranslationManager *TranslationManagerPrivate::instance = nullptr;
TranslationManagerPrivate::TranslationManagerPrivate(TranslationManager *q) TranslationManagerPrivate::TranslationManagerPrivate(TranslationManager *q)
: q_ptr(q) : q_ptr(q)
, qtTranslator(new QTranslator()) , qtTranslator({new QTranslator(), new QTranslator()})
, prgTranslator(new QTranslator()) , prgTranslator(new QTranslator())
{ {
// Install the QTranslators.
QCoreApplication::installTranslator(qtTranslator);
QCoreApplication::installTranslator(prgTranslator);
// Determine which paths to check for translations. // Determine which paths to check for translations.
pathList.clear(); pathList.clear();
@ -105,7 +101,8 @@ TranslationManagerPrivate::TranslationManagerPrivate(TranslationManager *q)
TranslationManagerPrivate::~TranslationManagerPrivate() TranslationManagerPrivate::~TranslationManagerPrivate()
{ {
delete qtTranslator; delete qtTranslator[0];
delete qtTranslator[1];
delete prgTranslator; delete prgTranslator;
} }
@ -136,6 +133,11 @@ void TranslationManager::setTranslation(const QString &locale)
{ {
Q_D(TranslationManager); Q_D(TranslationManager);
// Remove the QTranslators, if they were installed.
qApp->removeTranslator(d->qtTranslator[0]);
qApp->removeTranslator(d->qtTranslator[1]);
qApp->removeTranslator(d->prgTranslator);
// Initialize the Qt translation system. // Initialize the Qt translation system.
const array<QString, 2> qtLocales = { const array<QString, 2> qtLocales = {
QStringLiteral("qt_") + locale, QStringLiteral("qt_") + locale,
@ -148,11 +150,11 @@ void TranslationManager::setTranslation(const QString &locale)
// Check the Qt library path first. // Check the Qt library path first.
for (size_t i = 0; i < qtLocales.size(); i++) { for (size_t i = 0; i < qtLocales.size(); i++) {
# if QT_VERSION >= QT_VERSION_CHECK(6,0,0) # if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
auto path = QLibraryInfo::path(QLibraryInfo::TranslationsPath); QString path = QLibraryInfo::path(QLibraryInfo::TranslationsPath);
# else /* QT_VERSION < QT_VERSION_CHECK(6,0,0) */ # else /* QT_VERSION < QT_VERSION_CHECK(6,0,0) */
auto path = QLibraryInfo::location(QLibraryInfo::TranslationsPath)); QString path = QLibraryInfo::location(QLibraryInfo::TranslationsPath));
# endif /* QT_VERSION >= QT_VERSION_CHECK(6,0,0) */ # endif /* QT_VERSION >= QT_VERSION_CHECK(6,0,0) */
isLoaded[i] = d->qtTranslator->load(qtLocales[i], path); isLoaded[i] = d->qtTranslator[i]->load(qtLocales[i], path);
} }
#endif #endif
@ -165,7 +167,7 @@ void TranslationManager::setTranslation(const QString &locale)
continue; continue;
} }
isLoaded[i] = d->qtTranslator->load(qtLocales[i], path); isLoaded[i] = d->qtTranslator[i]->load(qtLocales[i], path);
} }
} }
} }
@ -178,6 +180,11 @@ void TranslationManager::setTranslation(const QString &locale)
} }
} }
// Add the new QTranslators.
qApp->installTranslator(d->qtTranslator[0]);
qApp->installTranslator(d->qtTranslator[1]);
qApp->installTranslator(d->prgTranslator);
/** Translation file information. **/ /** Translation file information. **/
//: Translation file author. Put your name here. //: Translation file author. Put your name here.