summaryrefslogtreecommitdiffstats
path: root/src/corelib/text
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2021-09-14 12:39:41 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-09-16 08:03:45 +0000
commit40891871063a83147199a4ecbcd244403034421b (patch)
tree89998d37b005d0cd841376762425f38098481428 /src/corelib/text
parentea5c96af59ba601f2a23dc5a8eeaee628518f100 (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.cpp77
-rw-r--r--src/corelib/text/qlocale_mac.mm17
-rw-r--r--src/corelib/text/qlocale_p.h6
-rw-r--r--src/corelib/text/qlocale_unix.cpp8
-rw-r--r--src/corelib/text/qlocale_win.cpp7
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: