diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 8ff896b0c5..2eb5e4e252 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -2642,8 +2642,13 @@ QString QLocale::toString(double f, char format, int precision) const /*! Returns a QLocale object initialized to the system locale. - On Windows and Mac, this locale will use the decimal/grouping characters and - date/time formats specified in the system configuration panel. + The system locale may use system-specific sources for locale data, where + available, otherwise falling back on QLocale's built-in database entry for + the language, script and territory the system reports. + + For example, on Windows and Mac, this locale will use the decimal/grouping + characters and date/time formats specified in the system configuration + panel. \sa c() */ @@ -2906,10 +2911,19 @@ QString QGregorianCalendar::monthName(const QLocale &locale, int month, int year #ifndef QT_NO_SYSTEMLOCALE if (locale.d->m_data == &systemLocaleData) { Q_ASSERT(month >= 1 && month <= 12); - QVariant res = systemLocale()->query(format == QLocale::LongFormat - ? QSystemLocale::MonthNameLong - : QSystemLocale::MonthNameShort, - month); + QSystemLocale::QueryType queryType = QSystemLocale::MonthNameLong; + switch (format) { + case QLocale::LongFormat: + queryType = QSystemLocale::MonthNameLong; + break; + case QLocale::ShortFormat: + queryType = QSystemLocale::MonthNameShort; + break; + case QLocale::NarrowFormat: + queryType = QSystemLocale::MonthNameNarrow; + break; + } + QVariant res = systemLocale()->query(queryType, month); if (!res.isNull()) return res.toString(); } @@ -2932,10 +2946,19 @@ QString QGregorianCalendar::standaloneMonthName(const QLocale &locale, int month #ifndef QT_NO_SYSTEMLOCALE if (locale.d->m_data == &systemLocaleData) { Q_ASSERT(month >= 1 && month <= 12); - QVariant res = systemLocale()->query(format == QLocale::LongFormat - ? QSystemLocale::StandaloneMonthNameLong - : QSystemLocale::StandaloneMonthNameShort, - month); + QSystemLocale::QueryType queryType = QSystemLocale::StandaloneMonthNameLong; + switch (format) { + case QLocale::LongFormat: + queryType = QSystemLocale::StandaloneMonthNameLong; + break; + case QLocale::ShortFormat: + queryType = QSystemLocale::StandaloneMonthNameShort; + break; + case QLocale::NarrowFormat: + queryType = QSystemLocale::StandaloneMonthNameNarrow; + break; + } + QVariant res = systemLocale()->query(queryType, month); if (!res.isNull()) return res.toString(); } @@ -2954,10 +2977,19 @@ QString QCalendarBackend::weekDayName(const QLocale &locale, int day, #ifndef QT_NO_SYSTEMLOCALE if (locale.d->m_data == &systemLocaleData) { - QVariant res = systemLocale()->query(format == QLocale::LongFormat - ? QSystemLocale::DayNameLong - : QSystemLocale::DayNameShort, - day); + QSystemLocale::QueryType queryType = QSystemLocale::DayNameLong; + switch (format) { + case QLocale::LongFormat: + queryType = QSystemLocale::DayNameLong; + break; + case QLocale::ShortFormat: + queryType = QSystemLocale::DayNameShort; + break; + case QLocale::NarrowFormat: + queryType = QSystemLocale::DayNameNarrow; + break; + } + QVariant res = systemLocale()->query(queryType, day); if (!res.isNull()) return res.toString(); } @@ -2974,10 +3006,19 @@ QString QCalendarBackend::standaloneWeekDayName(const QLocale &locale, int day, #ifndef QT_NO_SYSTEMLOCALE if (locale.d->m_data == &systemLocaleData) { - QVariant res = systemLocale()->query(format == QLocale::LongFormat - ? QSystemLocale::StandaloneDayNameLong - : QSystemLocale::StandaloneDayNameShort, - day); + QSystemLocale::QueryType queryType = QSystemLocale::StandaloneDayNameLong; + switch (format) { + case QLocale::LongFormat: + queryType = QSystemLocale::StandaloneDayNameLong; + break; + case QLocale::ShortFormat: + queryType = QSystemLocale::StandaloneDayNameShort; + break; + case QLocale::NarrowFormat: + queryType = QSystemLocale::StandaloneDayNameNarrow; + break; + } + QVariant res = systemLocale()->query(queryType, day); if (!res.isNull()) return res.toString(); } diff --git a/src/corelib/text/qlocale_mac.mm b/src/corelib/text/qlocale_mac.mm index c1d0c28751..787a4bf098 100644 --- a/src/corelib/text/qlocale_mac.mm +++ b/src/corelib/text/qlocale_mac.mm @@ -79,12 +79,18 @@ static QString macMonthName(int month, QSystemLocale::QueryType type) case QSystemLocale::MonthNameShort: formatterType = kCFDateFormatterShortMonthSymbols; break; + case QSystemLocale::MonthNameNarrow: + formatterType = kCFDateFormatterVeryShortMonthSymbols; + break; case QSystemLocale::StandaloneMonthNameLong: formatterType = kCFDateFormatterStandaloneMonthSymbols; break; case QSystemLocale::StandaloneMonthNameShort: formatterType = kCFDateFormatterShortStandaloneMonthSymbols; break; + case QSystemLocale::StandaloneMonthNameNarrow: + formatterType = kCFDateFormatterVeryShortStandaloneMonthSymbols; + break; default: qWarning("macMonthName: Unsupported query type %d", type); return QString(); @@ -116,17 +122,22 @@ static QString macDayName(int day, QSystemLocale::QueryType type) case QSystemLocale::DayNameShort: formatterType = kCFDateFormatterShortWeekdaySymbols; break; + case QSystemLocale::DayNameNarrow: + formatterType = kCFDateFormatterVeryShortWeekdaySymbols; + break; case QSystemLocale::StandaloneDayNameLong: formatterType = kCFDateFormatterStandaloneWeekdaySymbols; break; case QSystemLocale::StandaloneDayNameShort: formatterType = kCFDateFormatterShortStandaloneWeekdaySymbols; break; + case QSystemLocale::StandaloneDayNameNarrow: + formatterType = kCFDateFormatterVeryShortStandaloneWeekdaySymbols; + break; default: qWarning("macDayName: Unsupported query type %d", type); return QString(); } - QCFType values = static_cast(CFDateFormatterCopyProperty(formatter, formatterType)); @@ -466,13 +477,17 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const : kCFDateFormatterLongStyle); case DayNameLong: case DayNameShort: + case DayNameNarrow: case StandaloneDayNameLong: case StandaloneDayNameShort: + case StandaloneDayNameNarrow: return macDayName(in.toInt(), type); case MonthNameLong: case MonthNameShort: + case MonthNameNarrow: case StandaloneMonthNameLong: case StandaloneMonthNameShort: + case StandaloneMonthNameNarrow: return macMonthName(in.toInt(), type); case DateToStringShort: case DateToStringLong: diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h index 066f7bef76..5f2dd95863 100644 --- a/src/corelib/text/qlocale_p.h +++ b/src/corelib/text/qlocale_p.h @@ -96,8 +96,10 @@ public: TimeFormatShort, // QString DayNameLong, // QString, in: int DayNameShort, // QString, in: int + DayNameNarrow, // QString, in: int MonthNameLong, // QString, in: int MonthNameShort, // QString, in: int + MonthNameNarrow, // QString, in: int DateToStringLong, // QString, in: QDate DateToStringShort, // QString in: QDate TimeToStringLong, // QString in: QTime @@ -125,8 +127,10 @@ public: NativeTerritoryName, // QString StandaloneMonthNameLong, // QString, in: int StandaloneMonthNameShort, // QString, in: int + StandaloneMonthNameNarrow, // QString, in: int StandaloneDayNameLong, // QString, in: int - StandaloneDayNameShort // QString, in: int + StandaloneDayNameShort, // QString, in: int + StandaloneDayNameNarrow // QString, in: int }; virtual QVariant query(QueryType type, QVariant in = QVariant()) const; diff --git a/src/corelib/text/qlocale_unix.cpp b/src/corelib/text/qlocale_unix.cpp index 4eaefe0e72..84afaa377c 100644 --- a/src/corelib/text/qlocale_unix.cpp +++ b/src/corelib/text/qlocale_unix.cpp @@ -195,18 +195,26 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const return lc_time.dayName(in.toInt(), QLocale::LongFormat); case DayNameShort: return lc_time.dayName(in.toInt(), QLocale::ShortFormat); + case DayNameNarrow: + return lc_time.dayName(in.toInt(), QLocale::NarrowFormat); case StandaloneDayNameLong: return lc_time.standaloneDayName(in.toInt(), QLocale::LongFormat); case StandaloneDayNameShort: return lc_time.standaloneDayName(in.toInt(), QLocale::ShortFormat); + case StandaloneDayNameNarrow: + return lc_time.standaloneDayName(in.toInt(), QLocale::NarrowFormat); case MonthNameLong: return lc_time.monthName(in.toInt(), QLocale::LongFormat); case MonthNameShort: return lc_time.monthName(in.toInt(), QLocale::ShortFormat); + case MonthNameNarrow: + return lc_time.monthName(in.toInt(), QLocale::NarrowFormat); case StandaloneMonthNameLong: return lc_time.standaloneMonthName(in.toInt(), QLocale::LongFormat); case StandaloneMonthNameShort: return lc_time.standaloneMonthName(in.toInt(), QLocale::ShortFormat); + case StandaloneMonthNameNarrow: + return lc_time.standaloneMonthName(in.toInt(), QLocale::NarrowFormat); case DateToStringLong: return lc_time.toString(in.toDate(), QLocale::LongFormat); case DateToStringShort: diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp index f3e02c0440..ef41eb6bd2 100644 --- a/src/corelib/text/qlocale_win.cpp +++ b/src/corelib/text/qlocale_win.cpp @@ -757,8 +757,11 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const return d->dayName(in.toInt(), QLocale::LongFormat); case DayNameShort: return d->dayName(in.toInt(), QLocale::ShortFormat); + case DayNameNarrow: + return d->dayName(in.toInt(), QLocale::NarrowFormat); case StandaloneDayNameLong: case StandaloneDayNameShort: + case StandaloneDayNameNarrow: // Windows does not provide standalone day names, so fall back to CLDR return QVariant(); case MonthNameLong: @@ -769,6 +772,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const return d->monthName(in.toInt(), QLocale::ShortFormat); case StandaloneMonthNameShort: return d->standaloneMonthName(in.toInt(), QLocale::ShortFormat); + case MonthNameNarrow: + case StandaloneMonthNameNarrow: + // Windows provides no narrow month names, so we fall back to CLDR + return QVariant(); case DateToStringShort: return d->toString(in.toDate(), QLocale::ShortFormat); case DateToStringLong: diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp index 1c271ffefb..a72d163c67 100644 --- a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp @@ -3221,6 +3221,11 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() << QByteArray("ru_RU") << QDate(2021, 8, 30) << QLocale::ShortFormat << QString("\u0430\u0432\u0433.") << QString("\u0430\u0432\u0433.") << QString("\u043f\u043d") << QString("\u043f\u043d"); + // А, А, пн, П + QTest::newRow("ru_RU 30.08.2021 narrow") + << QByteArray("ru_RU") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << QString("\u0410") << QString("\u0410") << QString("\u043f\u043d") + << QString("\u041f"); #elif defined(Q_OS_DARWIN) // августа, август, понедельник, понедельник QTest::newRow("ru_RU 30.08.2021 long") @@ -3234,6 +3239,11 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() << QByteArray("ru_RU") << QDate(2021, 8, 30) << QLocale::ShortFormat << QString("\u0430\u0432\u0433.") << QString("\u0430\u0432\u0433.") << QString("\u041f\u043d") << QString("\u041f\u043d"); + // А, А, Пн, П + QTest::newRow("ru_RU 30.08.2021 narrow") + << QByteArray("ru_RU") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << QString("\u0410") << QString("\u0410") << QString("\u041f\u043d") + << QString("\u041f"); #endif #if QT_CONFIG(icu) || defined(Q_OS_DARWIN) @@ -3243,6 +3253,9 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() QTest::newRow("en_US 30.08.2021 short") << QByteArray("en_US") << QDate(2021, 8, 30) << QLocale::ShortFormat << "Aug" << "Aug" << "Mon" << "Mon"; + QTest::newRow("en_US 30.08.2021 narrow") + << QByteArray("en_US") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << "A" << "A" << "M" << "M"; QTest::newRow("de_DE 30.08.2021 long") << QByteArray("de_DE") << QDate(2021, 8, 30) << QLocale::LongFormat @@ -3250,6 +3263,9 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() QTest::newRow("de_DE 30.08.2021 short") << QByteArray("de_DE") << QDate(2021, 8, 30) << QLocale::ShortFormat << "Aug." << "Aug" << "Mo." << "Mo"; + QTest::newRow("de_DE 30.08.2021 narrow") + << QByteArray("de_DE") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << "A" << "A" << "M" << "M"; #elif defined(Q_OS_WIN) // августа, Август, понедельник, понедельник QTest::newRow("ru_RU 30.08.2021 long") @@ -3263,6 +3279,11 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() << QByteArray("ru_RU") << QDate(2021, 8, 30) << QLocale::ShortFormat << QString("\u0430\u0432\u0433") << QString("\u0430\u0432\u0433") << QString("\u041f\u043d") << QString("\u043f\u043d"); + // А, А, Пн, П + QTest::newRow("ru_RU 30.08.2021 narrow") + << QByteArray("ru_RU") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << QString("\u0410") << QString("\u0410") << QString("\u041f\u043d") + << QString("\u041f"); QTest::newRow("en_US 30.08.2021 long") << QByteArray("en_US") << QDate(2021, 8, 30) << QLocale::LongFormat @@ -3270,6 +3291,9 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() QTest::newRow("en_US 30.08.2021 short") << QByteArray("en_US") << QDate(2021, 8, 30) << QLocale::ShortFormat << "Aug" << "Aug" << "Mon" << "Mon"; + QTest::newRow("en_US 30.08.2021 narrow") + << QByteArray("en_US") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << "A" << "A" << "Mo" << "M"; QTest::newRow("de_DE 30.08.2021 long") << QByteArray("de_DE") << QDate(2021, 8, 30) << QLocale::LongFormat @@ -3277,6 +3301,9 @@ void tst_QLocale::systemLocaleDayAndMonthNames_data() QTest::newRow("de_DE 30.08.2021 short") << QByteArray("de_DE") << QDate(2021, 8, 30) << QLocale::ShortFormat << "Aug" << "Aug" << "Mo" << "Mo"; + QTest::newRow("de_DE 30.08.2021 narrow") + << QByteArray("de_DE") << QDate(2021, 8, 30) << QLocale::NarrowFormat + << "A" << "A" << "Mo" << "M"; #else QSKIP("This test can't run on this OS"); #endif