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 <denis@ddenis.info>
bb10
Konstantin Ritt 2012-11-24 04:09:34 +02:00 committed by The Qt Project
parent 4ac521354d
commit 9b85b81bc8
2 changed files with 48 additions and 13 deletions

View File

@ -1911,6 +1911,9 @@ QLocale QLocale::system()
Getting a list of all locales:
QList<QLocale> allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
Getting a list of locales suitable for Russia:
QList<QLocale> locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::Russia);
*/
QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
QLocale::Script script,
@ -1920,16 +1923,20 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
uint(country) > QLocale::LastCountry)
return QList<QLocale>();
if (language == QLocale::C)
return QList<QLocale>() << QLocale(QLocale::C);
QList<QLocale> 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> 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> QLocale::matchingLocales(QLocale::Language language,
QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
{
QList<Country> 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<Country>(data->m_country_id);
const QLocale::Country country = static_cast<Country>(data->m_country_id);
if (!result.contains(country))
result.append(country);
++data;
}

View File

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