Fix augmentation of UI language list

Previously, the augmentation wasn't being applied to the system
locale, due to a mistaken test claiming the locale's name didn't
resemble the string from which it was constructed. The test dates from
before various fixes to likely sub-tag processing that should make it
redundant now. This makes QLocalePrivate::rawName() also redundant
(and its conversion of QLatin1String to QByteArray relied on '\0'
termination which wasn't actually present in the various codes).

Expanded the test of systemLocale() to also test uiLanguages() turns a
single entry into the list we expect; and add two new test-cases.
(The test uses a mock system locale class, making this independent of
the platform backend.)

Fixes: QTBUG-92234
Change-Id: I0cdf6eae152a42dc377f4ea3e62c282ff4be1764
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
(cherry picked from commit b2871765ced8059e571d17d4010e8d8ada4e9190)
This commit is contained in:
Edward Welbourne 2021-05-31 15:46:41 +02:00
parent f55a7e744d
commit 47134f44c1
3 changed files with 28 additions and 33 deletions

View File

@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2021 The Qt Company Ltd.
** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@ -406,22 +406,6 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
return m_data->id().withLikelySubtagsRemoved().name(separator);
}
/*!
\internal
*/
QByteArray QLocalePrivate::rawName(char separator) const
{
QByteArrayList parts;
if (m_data->m_language_id != QLocale::AnyLanguage)
parts.append(languageCode().latin1());
if (m_data->m_script_id != QLocale::AnyScript)
parts.append(scriptCode().latin1());
if (m_data->m_country_id != QLocale::AnyCountry)
parts.append(countryCode().latin1());
return parts.join(separator);
}
static int findLocaleIndexById(const QLocaleId &localeId)
{
quint16 idx = locale_index[localeId.language_id];
@ -4253,13 +4237,8 @@ QStringList QLocale::uiLanguages() const
if (i < uiLanguages.size()) {
// Adding likely-adjusted forms to system locale's list.
// Name the locale is derived from:
const QString &name = uiLanguages.at(i);
prior = name.toLatin1();
// Don't try to likely-adjust if construction's likely-adjustments
// were so drastic the result doesn't match the prior name:
if (locale.name() != name && locale.d->rawName() != prior)
continue;
// Insert just after prior:
prior = uiLanguages.at(i).toLatin1();
// Insert just after the entry we're supplementing:
j = i + 1;
} else {
// Plain locale, not system locale; just append.

View File

@ -404,7 +404,6 @@ public:
quint16 countryId() const { return m_data->m_country_id; }
QByteArray bcp47Name(char separator = '-') const;
QByteArray rawName(char separator = '-') const;
inline QLatin1String languageCode() const { return languageToCode(QLocale::Language(m_data->m_language_id)); }
inline QLatin1String scriptCode() const { return scriptToCode(QLocale::Script(m_data->m_script_id)); }

View File

@ -3047,13 +3047,13 @@ void tst_QLocale::bcp47Name()
class MySystemLocale : public QSystemLocale
{
public:
MySystemLocale(const QLocale &locale) : m_locale(locale)
MySystemLocale(const QString &locale) : m_name(locale), m_locale(locale)
{
}
QVariant query(QueryType /*type*/, QVariant /*in*/) const override
QVariant query(QueryType type, QVariant /*in*/) const override
{
return QVariant();
return type == UILanguages ? QVariant(QStringList{m_name}) : QVariant();
}
QLocale fallbackUiLocale() const override
@ -3062,16 +3062,32 @@ public:
}
private:
const QString m_name;
const QLocale m_locale;
};
void tst_QLocale::systemLocale_data()
{
// Test uses MySystemLocale, so is platform-independent.
QTest::addColumn<QString>("name");
QTest::addColumn<QLocale::Language>("language");
QTest::addRow("catalan") << QString("ca") << QLocale::Catalan;
QTest::addRow("ukrainian") << QString("uk") << QLocale::Ukrainian;
QTest::addRow("german") << QString("de") << QLocale::German;
QTest::addColumn<QStringList>("uiLanguages");
QTest::addRow("catalan")
<< QString("ca") << QLocale::Catalan
<< QStringList{QStringLiteral("ca"), QStringLiteral("ca-ES"), QStringLiteral("ca-Latn-ES")};
QTest::addRow("ukrainian")
<< QString("uk") << QLocale::Ukrainian
<< QStringList{QStringLiteral("uk"), QStringLiteral("uk-UA"), QStringLiteral("uk-Cyrl-UA")};
QTest::addRow("german")
<< QString("de") << QLocale::German
<< QStringList{QStringLiteral("de"), QStringLiteral("de-DE"), QStringLiteral("de-Latn-DE")};
QTest::addRow("chinese-min")
<< QString("zh") << QLocale::Chinese
<< QStringList{QStringLiteral("zh"), QStringLiteral("zh-CN"), QStringLiteral("zh-Hans-CN")};
QTest::addRow("chinese-full")
<< QString("zh-Hans-CN") << QLocale::Chinese
<< QStringList{QStringLiteral("zh-Hans-CN"), QStringLiteral("zh"), QStringLiteral("zh-CN")};
}
void tst_QLocale::systemLocale()
@ -3081,12 +3097,13 @@ void tst_QLocale::systemLocale()
QFETCH(QString, name);
QFETCH(QLocale::Language, language);
QFETCH(QStringList, uiLanguages);
{
QLocale locale(name);
MySystemLocale sLocale(locale);
MySystemLocale sLocale(name);
QCOMPARE(QLocale().language(), language);
QCOMPARE(QLocale::system().language(), language);
QCOMPARE(QLocale::system().uiLanguages(), uiLanguages);
}
QCOMPARE(QLocale(), originalLocale);