Fix loading language from system UI languages

Fixes #1847
This commit is contained in:
Jonas Kvinge
2025-10-30 23:54:42 +01:00
parent 0537b072fe
commit a4de7559ac
3 changed files with 65 additions and 33 deletions

View File

@@ -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; const QString basefilename = prefix + u'_' + language;
QTranslator *t = new QTranslator; QTranslator *t = new QTranslator;
if (t->load(basefilename, path)) { if (!t->load(basefilename, path)) {
qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t);
translations_ << t;
}
else {
delete t; delete t;
return false;
} }
qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t);
translations_ << t;
return true;
} }

View File

@@ -31,7 +31,7 @@ class Translations {
public: public:
explicit Translations(); explicit Translations();
~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: private:
QList<QTranslator*> translations_; QList<QTranslator*> translations_;

View File

@@ -260,46 +260,76 @@ int main(int argc, char *argv[]) {
IconLoader::Init(); IconLoader::Init();
#ifdef HAVE_TRANSLATIONS #ifdef HAVE_TRANSLATIONS
QString language = options.language();
if (language.isEmpty()) { QStringList languages;
Settings s;
s.beginGroup(BehaviourSettings::kSettingsGroup); // Load language from command line options
language = s.value(BehaviourSettings::kLanguage).toString(); if (!options.language().isEmpty()) {
s.endGroup(); 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) #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 #else
const QStringList system_languages = QLocale::system().uiLanguages(); const QStringList system_languages = QLocale::system().uiLanguages();
#endif for (const QString &language : system_languages) {
if (system_languages.isEmpty()) { QString language_underscore = language;
language = QLocale::system().name(); 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 #endif
} }
if (languages.isEmpty()) {
languages << QLocale::system().name();
} }
ScopedPtr<Translations> translations(new Translations); ScopedPtr<Translations> translations(new Translations);
translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language); for (const QString &language : std::as_const(languages)) {
translations->LoadTranslation(u"strawberry"_s, u":/i18n"_s, language); if (translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language)) {
translations->LoadTranslation(u"strawberry"_s, QStringLiteral(TRANSLATIONS_DIR), language); break;
translations->LoadTranslation(u"strawberry"_s, QCoreApplication::applicationDirPath(), language); }
translations->LoadTranslation(u"strawberry"_s, QDir::currentPath(), language); }
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 # ifdef HAVE_QTSPARKLE
qtsparkle::LoadTranslations(language); if (!languages.isEmpty()) {
qtsparkle::LoadTranslations(languages.first());
}
# endif # endif
#endif #endif // HAVE_TRANSLATIONS
Application app; Application app;