summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qlocale.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools/qlocale.cpp')
-rw-r--r--src/corelib/tools/qlocale.cpp68
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