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
parent
4ac521354d
commit
9b85b81bc8
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) \
|
||||
|
|
|
|||
Loading…
Reference in New Issue