diff options
-rw-r--r-- | src/corelib/tools/qlocale.cpp | 68 |
1 files changed, 36 insertions, 32 deletions
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index 5598dfe237..6ae5a4162a 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -372,48 +372,52 @@ static const QLocaleData *findLocaleDataById(const QLocaleId &localeId) const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLocale::Script script, QLocale::Country country) { QLocaleId localeId = QLocaleId::fromIds(language, script, country); - localeId = localeId.withLikelySubtagsAdded(); + QLocaleId likelyId = localeId.withLikelySubtagsAdded(); - const uint idx = locale_index[localeId.language_id]; + const uint idx = locale_index[likelyId.language_id]; - // Try a straight match - if (const QLocaleData *const data = findLocaleDataById(localeId)) + // Try a straight match with the likely data: + if (const QLocaleData *const data = findLocaleDataById(likelyId)) return data; QList<QLocaleId> tried; - tried.push_back(localeId); + tried.push_back(likelyId); // No match; try again with likely country - localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry); - localeId = localeId.withLikelySubtagsAdded(); - if (!tried.contains(localeId)) { - if (const QLocaleData *const data = findLocaleDataById(localeId)) - return data; - tried.push_back(localeId); - } + if (country != QLocale::AnyCountry + && (language != QLocale::AnyLanguage || script != QLocale::AnyScript)) { + localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry); + likelyId = localeId.withLikelySubtagsAdded(); + if (!tried.contains(likelyId)) { + if (const QLocaleData *const data = findLocaleDataById(likelyId)) + return data; + tried.push_back(likelyId); + } - // No match; try again with any country - localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry); - if (!tried.contains(localeId)) { - if (const QLocaleData *const data = findLocaleDataById(localeId)) - return data; - tried.push_back(localeId); + // No match; try again with any country + if (!tried.contains(localeId)) { + if (const QLocaleData *const data = findLocaleDataById(localeId)) + return data; + tried.push_back(localeId); + } } // No match; try again with likely script - localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country); - localeId = localeId.withLikelySubtagsAdded(); - if (!tried.contains(localeId)) { - if (const QLocaleData *const data = findLocaleDataById(localeId)) - return data; - tried.push_back(localeId); - } - - // No match; try again with any script - localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country); - if (!tried.contains(localeId)) { - if (const QLocaleData *const data = findLocaleDataById(localeId)) - return data; - tried.push_back(localeId); + if (script != QLocale::AnyScript + && (language != QLocale::AnyLanguage || country != QLocale::AnyCountry)) { + localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country); + likelyId = localeId.withLikelySubtagsAdded(); + if (!tried.contains(likelyId)) { + if (const QLocaleData *const data = findLocaleDataById(likelyId)) + return data; + tried.push_back(likelyId); + } + + // No match; try again with any script + if (!tried.contains(localeId)) { + if (const QLocaleData *const data = findLocaleDataById(localeId)) + return data; + tried.push_back(localeId); + } } // No match; return data at original index |