diff options
author | Edward Welbourne <[email protected]> | 2024-12-02 14:53:41 +0100 |
---|---|---|
committer | Edward Welbourne <[email protected]> | 2024-12-05 14:42:56 +0100 |
commit | 303863170c3ea7d1ee1b7188f507ad432ed3f860 (patch) | |
tree | 801da8394a8a9a13f7af7ffcae1813dc9ae6b0dc | |
parent | 091bb2f997c2bbe4e44d66527f13c435288e0562 (diff) |
QLocale: fix likely subtags to include und -> en_Latn_US
The lack of this was hidden by other rules (redundant with it) until
CLDR v45, but v46 prunes the redundant rules, breaking this. So
include the missing rule and tweak the code that assumed likely
sub-tag rules preserved language, since this one doesn't. Rework the
tail of withLikelySubtagsAdded() to correctly use this rule, now that
we have it. (The prior comment about there being no match-all was
wrong: CLDR did have it, but our data skipped it.) Amended one test
affected by it (when system locale wasn't en_US).
Pick-to: 6.8
Task-number: QTBUG-130877
Change-Id: I2a415b67af4bc8aa6a766bcc1e349ee5bda9f174
Reviewed-by: Mate Barany <[email protected]>
-rw-r--r-- | src/corelib/text/qlocale.cpp | 20 | ||||
-rw-r--r-- | src/corelib/text/qlocale_data_p.h | 3 | ||||
-rw-r--r-- | tests/auto/corelib/text/qlocale/tst_qlocale.cpp | 2 | ||||
-rw-r--r-- | util/locale_database/cldr.py | 2 | ||||
-rw-r--r-- | util/locale_database/qlocalexml.py | 2 |
5 files changed, 15 insertions, 14 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 42fdb49474e..6757c4bf0b7 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -390,15 +390,17 @@ QLocaleId QLocaleId::withLikelySubtagsAdded() const noexcept return value; } } - if (matchesAll()) { // Skipped all of the above. - // CLDR has no match-all at v37, but might get one some day ... - pairs = std::lower_bound(pairs, afterPairs, sought); - if (pairs < afterPairs) { - // All other keys are < match-all. - Q_ASSERT(pairs + 1 == afterPairs); - Q_ASSERT(pairs->key.matchesAll()); - return pairs->value; - } + // Finally, fall back to the match-all rule (if there is one): + pairs = afterPairs - 1; // All other keys are < match-all. + if (pairs->key.matchesAll()) { + QLocaleId value = pairs->value; + if (language_id) + value.language_id = language_id; + if (territory_id) + value.territory_id = territory_id; + if (script_id) + value.script_id = script_id; + return value; } return *this; } diff --git a/src/corelib/text/qlocale_data_p.h b/src/corelib/text/qlocale_data_p.h index 7eb88d61941..08b891eea66 100644 --- a/src/corelib/text/qlocale_data_p.h +++ b/src/corelib/text/qlocale_data_p.h @@ -59,7 +59,7 @@ struct LanguageCodeEntry // GENERATED PART STARTS HERE /* - This part of the file was generated on 2024-10-09 from the + This part of the file was generated on 2024-12-02 from the Common Locale Data Repository v45 http://www.unicode.org/cldr/ @@ -1031,6 +1031,7 @@ static inline constexpr QLocaleId likely_subtags[] = { { 0, 139, 0 }, { 308, 139, 134 }, // und_Vaii -> vai_Vaii_LR { 0, 141, 0 }, { 255, 141, 50 }, // und_Yiii -> ii_Yiii_CN { 0, 142, 0 }, { 339, 142, 161 }, // und_Rohg -> rhg_Rohg_MM + { 0, 0, 0 }, { 75, 66, 248 }, // und -> en_Latn_US }; static inline constexpr quint16 locale_index[] = { diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp index fba1fd01437..c1db299348e 100644 --- a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp @@ -429,7 +429,7 @@ void tst_QLocale::defaulted_ctor() QCOMPARE(l.territory(), exp_country); \ } while (false) - TEST_CTOR(AnyLanguage, AnyTerritory, defaultLanguage, defaultTerritory); + TEST_CTOR(AnyLanguage, AnyTerritory, QLocale::English, QLocale::UnitedStates); TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory); TEST_CTOR(Aymara, AnyTerritory, defaultLanguage, defaultTerritory); TEST_CTOR(Aymara, France, defaultLanguage, defaultTerritory); diff --git a/util/locale_database/cldr.py b/util/locale_database/cldr.py index 0e5154b8b57..c2b8611e6d3 100644 --- a/util/locale_database/cldr.py +++ b/util/locale_database/cldr.py @@ -62,8 +62,6 @@ class CldrReader (object): else: self.grumble(f'Skipping likelySubtag "{got}" -> "{use}" ({e})\n') continue - if not any(have): - continue give = (give[0], # Substitute according to http://www.unicode.org/reports/tr35/#Likely_Subtags diff --git a/util/locale_database/qlocalexml.py b/util/locale_database/qlocalexml.py index 3d950c3af33..92996ca48fb 100644 --- a/util/locale_database/qlocalexml.py +++ b/util/locale_database/qlocalexml.py @@ -281,7 +281,7 @@ class QLocaleXmlReader (object): sub-tags mapping says language's default locale uses the given script and territory.""" for have, give in self.__likely: - if have[1:] == (0, 0) and give[2]: + if have[0] and have[1:] == (0, 0) and give[2]: assert have[0] == give[0], (have, give) yield (give[:2], give[2]) |