From 9b85b81bc82f4e615b5d165425dc9f84fd2ae482 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Sat, 24 Nov 2012 04:09:34 +0200 Subject: QLocale: Fix matchingLocales() behavior if script or country is not Any* Since the documentation doesn't mention the search should be done by language only, consider the current behavior incorrect. As of now, it is possible to get a list of locales by Country or Script as well. Also fix countriesForLanguage() to be in-sync with matchingLocales(). Change-Id: I6a09ca459120143565fa6099d2b823df1fed7c25 Reviewed-by: Denis Dzyubenko --- src/corelib/tools/qlocale.cpp | 31 ++++++++++++++---------- tests/auto/corelib/tools/qlocale/tst_qlocale.cpp | 30 +++++++++++++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index f116dab401..4b4c94872e 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -1911,6 +1911,9 @@ QLocale QLocale::system() Getting a list of all locales: QList allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); + + Getting a list of locales suitable for Russia: + QList locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::Russia); */ QList QLocale::matchingLocales(QLocale::Language language, QLocale::Script script, @@ -1920,16 +1923,20 @@ QList QLocale::matchingLocales(QLocale::Language language, uint(country) > QLocale::LastCountry) return QList(); + if (language == QLocale::C) + return QList() << QLocale(QLocale::C); + QList result; - const QLocaleData *data = locale_data; if (language == QLocale::AnyLanguage && script == QLocale::AnyScript && country == QLocale::AnyCountry) result.reserve(locale_data_size); - if (language != QLocale::C) - data += locale_index[language]; + const QLocaleData *data = locale_data + locale_index[language]; while ( (data != locale_data + locale_data_size) && (language == QLocale::AnyLanguage || data->m_language_id == uint(language))) { - QLocale locale(*new QLocalePrivate(localeDataIndex(data))); - result.append(locale); + if ((script == QLocale::AnyScript || data->m_script_id == uint(script)) + && (country == QLocale::AnyCountry || data->m_country_id == uint(country))) { + QLocale locale(*new QLocalePrivate(localeDataIndex(data))); + result.append(locale); + } ++data; } return result; @@ -1939,7 +1946,7 @@ QList QLocale::matchingLocales(QLocale::Language language, \obsolete \since 4.3 - Returns the list of countries that have entires for \a language in Qt's locale + Returns the list of countries that have entries for \a language in Qt's locale database. If the result is an empty list, then \a language is not represented in Qt's locale database. @@ -1948,19 +1955,17 @@ QList QLocale::matchingLocales(QLocale::Language language, QList QLocale::countriesForLanguage(Language language) { QList result; - - unsigned language_id = language; - uint idx = locale_index[language_id]; - if (language == C) { result << AnyCountry; return result; } - const QLocaleData *data = locale_data + idx; - + unsigned language_id = language; + const QLocaleData *data = locale_data + locale_index[language_id]; while (data->m_language_id == language_id) { - result << static_cast(data->m_country_id); + const QLocale::Country country = static_cast(data->m_country_id); + if (!result.contains(country)) + result.append(country); ++data; } diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp index 911187da53..ea65236d16 100644 --- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp @@ -100,6 +100,7 @@ private slots: #endif void legacyNames(); void unixLocaleName(); + void matchingLocales(); void double_conversion_data(); void double_conversion(); void long_long_conversion_data(); @@ -534,6 +535,35 @@ void tst_QLocale::legacyNames() #undef TEST_CTOR } +void tst_QLocale::matchingLocales() +{ + const QLocale c(QLocale::C); + const QLocale ru_RU(QLocale::Russian, QLocale::Russia); + + QList locales = QLocale::matchingLocales(QLocale::C, QLocale::AnyScript, QLocale::AnyCountry); + QCOMPARE(locales.size(), 1); + QVERIFY(locales.contains(c)); + + locales = QLocale::matchingLocales(QLocale::Russian, QLocale::CyrillicScript, QLocale::Russia); + QCOMPARE(locales.size(), 1); + QVERIFY(locales.contains(ru_RU)); + + locales = QLocale::matchingLocales(QLocale::Russian, QLocale::AnyScript, QLocale::AnyCountry); + QVERIFY(!locales.isEmpty()); + QVERIFY(!locales.contains(c)); + QVERIFY(locales.contains(ru_RU)); + + locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::CyrillicScript, QLocale::AnyCountry); + QVERIFY(!locales.isEmpty()); + QVERIFY(!locales.contains(c)); + QVERIFY(locales.contains(ru_RU)); + + locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::Russia); + QVERIFY(!locales.isEmpty()); + QVERIFY(!locales.contains(c)); + QVERIFY(locales.contains(ru_RU)); +} + void tst_QLocale::unixLocaleName() { #define TEST_NAME(req_lang, req_country, exp_name) \ -- cgit v1.2.3