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) \