diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2021-09-14 12:39:41 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-09-16 08:03:45 +0000 |
commit | 40891871063a83147199a4ecbcd244403034421b (patch) | |
tree | 89998d37b005d0cd841376762425f38098481428 /src/corelib/text | |
parent | ea5c96af59ba601f2a23dc5a8eeaee628518f100 (diff) |
Teach QLocale::system() to use narrow format
QLocale::system() was not making use of QLocaleFormat::Narrow, always
treating it in the same way as QLocaleFormat::Short.
This patch fixes the issue for day and month names.
The implementation falls back to CLDR if system locale fails to
provide some data.
Task-number: QTBUG-84877
Change-Id: Ia37e59dbf02d7a5e230f2767d294b9ab7de37f33
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
(cherry picked from commit 61343b5a3f10f5b9166729176d4b95a4c538c278)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/corelib/text')
-rw-r--r-- | src/corelib/text/qlocale.cpp | 77 | ||||
-rw-r--r-- | src/corelib/text/qlocale_mac.mm | 17 | ||||
-rw-r--r-- | src/corelib/text/qlocale_p.h | 6 | ||||
-rw-r--r-- | src/corelib/text/qlocale_unix.cpp | 8 | ||||
-rw-r--r-- | src/corelib/text/qlocale_win.cpp | 7 |
5 files changed, 95 insertions, 20 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index c8447cdac8..25d4423a28 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -2612,8 +2612,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() */ @@ -2876,10 +2881,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(); } @@ -2902,10 +2916,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(); } @@ -2924,10 +2947,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(); } @@ -2944,10 +2976,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 a2af0c2933..4293cdda27 100644 --- a/src/corelib/text/qlocale_mac.mm +++ b/src/corelib/text/qlocale_mac.mm @@ -79,12 +79,18 @@ static QVariant 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 {}; @@ -116,17 +122,22 @@ static QVariant 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 {}; } - QCFType<CFArrayRef> values = static_cast<CFArrayRef>(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 a1bd03ca33..b3360e1620 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 d47946f9d6..e5164a0361 100644 --- a/src/corelib/text/qlocale_unix.cpp +++ b/src/corelib/text/qlocale_unix.cpp @@ -194,18 +194,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 212242e216..95279e278b 100644 --- a/src/corelib/text/qlocale_win.cpp +++ b/src/corelib/text/qlocale_win.cpp @@ -758,8 +758,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: @@ -770,6 +773,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: |