summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qlocale.cpp
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2017-12-04 16:37:46 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2018-01-19 13:57:25 +0000
commit1d2e3a545278884781234edbfa19a4e3d38815dd (patch)
treec4230687448d8f15b450ba04759acce3242ba34d /src/corelib/tools/qlocale.cpp
parent0f9f716f36c72aa4df7fdcc56f7c19fa823acb85 (diff)
Don't try (Any,Any,Any) before a partially-specified locale
We unconditionally tried Any-ing out various tags of a locale without checking the remainer weren't Any, which would get us the C locale in some cases where we might have done better. So check some retained tag isn't Any before Any-ing out any tag. In the process, add a separate variable for the ID with likely tags filled in, to distinguish it from the supplied localeId (thereby somewhat clarifying what's afoot) and save duplicating the construction of this. Task-number: QTBUG-64940 Change-Id: Ibd9f1aba6862434cf00fbf77ba00288ac9a50a3b Reviewed-by: Jason Erb (Suitable Technologies) <erb@suitabletech.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
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