From a4de7559ac9e831f643361d689036649ced003a4 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Thu, 30 Oct 2025 23:54:42 +0100 Subject: [PATCH] Fix loading language from system UI languages Fixes #1847 --- src/core/translations.cpp | 16 ++++---- src/core/translations.h | 2 +- src/main.cpp | 80 +++++++++++++++++++++++++++------------ 3 files changed, 65 insertions(+), 33 deletions(-) diff --git a/src/core/translations.cpp b/src/core/translations.cpp index b7f2a3179..0a1769615 100644 --- a/src/core/translations.cpp +++ b/src/core/translations.cpp @@ -41,17 +41,19 @@ Translations::~Translations() { } -void Translations::LoadTranslation(const QString &prefix, const QString &path, const QString &language) { +bool Translations::LoadTranslation(const QString &prefix, const QString &path, const QString &language) { const QString basefilename = prefix + u'_' + language; QTranslator *t = new QTranslator; - if (t->load(basefilename, path)) { - qLog(Debug) << "Tranlations loaded from" << basefilename; - QCoreApplication::installTranslator(t); - translations_ << t; - } - else { + if (!t->load(basefilename, path)) { delete t; + return false; } + qLog(Debug) << "Tranlations loaded from" << basefilename; + QCoreApplication::installTranslator(t); + translations_ << t; + + return true; + } diff --git a/src/core/translations.h b/src/core/translations.h index 228592171..703e3e118 100644 --- a/src/core/translations.h +++ b/src/core/translations.h @@ -31,7 +31,7 @@ class Translations { public: explicit Translations(); ~Translations(); - void LoadTranslation(const QString &prefix, const QString &path, const QString &language); + bool LoadTranslation(const QString &prefix, const QString &path, const QString &language); private: QList translations_; diff --git a/src/main.cpp b/src/main.cpp index 9ccf2d6eb..35fc0c05c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -260,46 +260,76 @@ int main(int argc, char *argv[]) { IconLoader::Init(); #ifdef HAVE_TRANSLATIONS - QString language = options.language(); - if (language.isEmpty()) { - Settings s; - s.beginGroup(BehaviourSettings::kSettingsGroup); - language = s.value(BehaviourSettings::kLanguage).toString(); - s.endGroup(); + + QStringList languages; + + // Load language from command line options + if (!options.language().isEmpty()) { + languages << options.language(); } - if (language.isEmpty()) { + // Load language from settings + if (languages.isEmpty()) { + Settings s; + s.beginGroup(BehaviourSettings::kSettingsGroup); + const QString language = s.value(BehaviourSettings::kLanguage).toString(); + s.endGroup(); + if (!language.isEmpty()) { + languages << language; + } + } + + // Use system UI languages + if (languages.isEmpty()) { #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) - const QStringList system_languages = QLocale::system().uiLanguages(QLocale::TagSeparator::Underscore); + languages = QLocale::system().uiLanguages(QLocale::TagSeparator::Underscore); #else const QStringList system_languages = QLocale::system().uiLanguages(); -#endif - if (system_languages.isEmpty()) { - language = QLocale::system().name(); + for (const QString &language : system_languages) { + QString language_underscore = language; + language_underscore = language_underscore.replace(u'-', u'_'); + languages << language_underscore; } - else { -#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) - language = system_languages.first(); -#else - language = system_languages.first(); - language = language.replace(u'-', u'_'); #endif - } + } + + if (languages.isEmpty()) { + languages << QLocale::system().name(); } ScopedPtr translations(new Translations); - translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language); - translations->LoadTranslation(u"strawberry"_s, u":/i18n"_s, language); - translations->LoadTranslation(u"strawberry"_s, QStringLiteral(TRANSLATIONS_DIR), language); - translations->LoadTranslation(u"strawberry"_s, QCoreApplication::applicationDirPath(), language); - translations->LoadTranslation(u"strawberry"_s, QDir::currentPath(), language); + for (const QString &language : std::as_const(languages)) { + if (translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language)) { + break; + } + } + + static const QStringList language_paths = QStringList() << u":/i18n"_s + << QStringLiteral(TRANSLATIONS_DIR) + << QCoreApplication::applicationDirPath() + << QDir::currentPath(); + + for (const QString &language : std::as_const(languages)) { + bool language_loaded = false; + for (const QString &language_path : language_paths) { + if (translations->LoadTranslation(u"strawberry"_s, language_path, language)) { + language_loaded = true; + break; + } + } + if (language_loaded) { + break; + } + } # ifdef HAVE_QTSPARKLE - qtsparkle::LoadTranslations(language); + if (!languages.isEmpty()) { + qtsparkle::LoadTranslations(languages.first()); + } # endif -#endif +#endif // HAVE_TRANSLATIONS Application app;