diff options
Diffstat (limited to 'src/corelib/text/qlocale.cpp')
-rw-r--r-- | src/corelib/text/qlocale.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index a859badb3c..6cf0488f83 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -4526,6 +4526,31 @@ QStringList QLocale::uiLanguages() const } if (locales.isEmpty()) locales.append(systemLocale()->fallbackUiLocale()); + // If the system locale (isn't C and) didn't include itself in the list, + // or as fallback, presume to know better than it and put its name + // first. (Known issue, QTBUG-104930, on some macOS versions when in + // locale en_DE.) Our translation system might have a translation for a + // locale the platform doesn't believe in. + const QString name = bcp47Name(); + if (!name.isEmpty() && language() != C && !uiLanguages.contains(name)) { + // That uses contains(name) as a cheap pre-test, but there may be an + // entry that matches this on purging likely subtags. + QLocaleId mine = + { d->m_data->m_language_id, d->m_data->m_script_id, d->m_data->m_country_id }; + mine = mine.withLikelySubtagsRemoved(); + const auto isMine = [mine](const QString &entry) { + QLocale::Language lang; + QLocale::Script script; + QLocale::Country cntry; + QLocalePrivate::getLangAndCountry(entry, lang, script, cntry); + QLocaleId id = { ushort(lang), ushort(script), ushort(cntry) }; + return id.withLikelySubtagsRemoved() == mine; + }; + if (std::none_of(uiLanguages.constBegin(), uiLanguages.constEnd(), isMine)) { + locales.prepend(*this); + uiLanguages.prepend(name); + } + } } else #endif { |