Distinguish system locale from corresponding CLDR-derived one

Previously it was displayed as if it had been constructed from its
language, script and territory; but it is distinct from the locale
constructed in this way and may produce different results.

Report the system locale as QLocale::system() with its language,
script and country within /*...*/ following it, instead of as
QLocale(...) with these as its parameters. Add a test of the debug
output, verifying that it has the form intended.

[ChangeLog][Important Behavior Changes][QLocale] Message logging now
distinguishes the system locale from the corresponding locale -
generated from its language, script and territory - based on CLDR
data.

Pick-to: 6.9
Fixes: QTBUG-133922
Change-Id: Ic6fb137821fb7bf29d0f6446a46225cadd54b82a
Reviewed-by: Mate Barany <mate.barany@qt.io>
This commit is contained in:
Edward Welbourne 2025-02-20 11:02:22 +01:00
parent 92ec27e461
commit e323d46cda
2 changed files with 34 additions and 3 deletions

View File

@ -5437,10 +5437,12 @@ QString QLocale::nativeCountryName() const
QDebug operator<<(QDebug dbg, const QLocale &l)
{
QDebugStateSaver saver(dbg);
const bool isSys = l == QLocale::system();
dbg.nospace().noquote()
<< "QLocale(" << QLocale::languageToString(l.language())
<< ", " << QLocale::scriptToString(l.script())
<< ", " << QLocale::territoryToString(l.territory()) << ')';
<< (isSys ? "QLocale::system()/* " : "QLocale(")
<< QLocale::languageToString(l.language()) << ", "
<< QLocale::scriptToString(l.script()) << ", "
<< QLocale::territoryToString(l.territory()) << (isSys ? " */" : ")");
return dbg;
}
#endif

View File

@ -178,6 +178,7 @@ private slots:
void unixLocaleName();
void testNames_data();
void testNames();
void debugOutput();
private:
QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
QString m_sysapp;
@ -3410,6 +3411,34 @@ void tst_QLocale::testNames()
}
}
void tst_QLocale::debugOutput()
{
// Test operator<<(QDebug, const QLocale &) works as intended:
QTest::failOnWarning();
{
const QLocale en(QLocale::English, QLocale::LatinScript, QLocale::UnitedStates);
QTest::ignoreMessage(QtMsgType::QtWarningMsg,
"QLocale(English, Latin, United States)");
qWarning() << en;
}
{
const auto params = [](const QLocale &loc) {
return (QLocale::languageToString(loc.language())
+ u", " + QLocale::scriptToString(loc.script())
+ u", " + QLocale::territoryToString(loc.territory())).toLatin1();
};
const QLocale sys = QLocale::system();
QTest::ignoreMessage(QtMsgType::QtWarningMsg,
("QLocale::system()/* " + params(sys) + " */").constData());
// QTBUG-133922: system and its CLDR counterpart should differ.
qWarning() << sys;
const QLocale match(sys.language(), sys.script(), sys.territory());
QTest::ignoreMessage(QtMsgType::QtWarningMsg,
("QLocale(" + params(match) + ')').constData());
qWarning() << match;
}
}
void tst_QLocale::dayName_data()
{
QTest::addColumn<QString>("locale_name");