summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qlocale.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text/qlocale.cpp')
-rw-r--r--src/corelib/text/qlocale.cpp578
1 files changed, 397 insertions, 181 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index 5685d87c85..91e393e343 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -72,6 +72,10 @@
# include <time.h>
#endif
+#include "private/qcalendarbackend_p.h"
+#include "private/qgregoriancalendar_p.h"
+#include "qcalendar.h"
+
QT_BEGIN_NAMESPACE
#ifndef QT_NO_SYSTEMLOCALE
@@ -341,8 +345,10 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
return localeId.withLikelySubtagsRemoved().name(separator);
}
-static const QLocaleData *findLocaleDataById(const QLocaleId &localeId)
+static const QLocaleData *findLocaleDataById(const QLocaleId &lid)
{
+ QLocaleId localeId = lid.withLikelySubtagsAdded();
+
const uint idx = locale_index[localeId.language_id];
const QLocaleData *data = locale_data + idx;
@@ -443,6 +449,12 @@ const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLoca
return locale_data + idx;
}
+uint QLocaleData::findLocaleOffset(QLocale::Language language, QLocale::Script script,
+ QLocale::Country country)
+{
+ return findLocaleData(language, script, country) - locale_data;
+}
+
static bool parse_locale_tag(const QString &input, int &i, QString *result,
const QString &separators)
{
@@ -550,6 +562,16 @@ static const QLocaleData *findLocaleData(const QString &name)
return QLocaleData::findLocaleData(lang, script, cntry);
}
+static uint findLocaleOffset(const QString &name)
+{
+ QLocale::Language lang;
+ QLocale::Script script;
+ QLocale::Country cntry;
+ QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
+
+ return QLocaleData::findLocaleOffset(lang, script, cntry);
+}
+
QString qt_readEscapedFormatString(QStringView format, int *idx)
{
int &i = *idx;
@@ -617,8 +639,8 @@ static QLocale::NumberOptions default_number_options = QLocale::DefaultNumberOpt
static const QLocaleData *const c_data = locale_data;
static QLocalePrivate *c_private()
{
- static QLocalePrivate c_locale =
- { c_data, Q_BASIC_ATOMIC_INITIALIZER(1), QLocale::OmitGroupSeparator };
+ static QLocalePrivate c_locale{
+ c_data, Q_BASIC_ATOMIC_INITIALIZER(1), 0, QLocale::OmitGroupSeparator };
return &c_locale;
}
@@ -803,9 +825,11 @@ static QLocalePrivate *localePrivateByName(const QString &name)
{
if (name == QLatin1String("C"))
return c_private();
+ // TODO: Remove this version, and use offset everywhere
const QLocaleData *data = findLocaleData(name);
- return QLocalePrivate::create(data, data->m_language_id == QLocale::C ?
- QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
+ return QLocalePrivate::create(data, findLocaleOffset(name),
+ data->m_language_id == QLocale::C
+ ? QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
}
static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Script script,
@@ -814,7 +838,9 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
if (language == QLocale::C)
return c_private();
+ // TODO: Remove pointer, use index instead
const QLocaleData *data = QLocaleData::findLocaleData(language, script, country);
+ const uint offset = QLocaleData::findLocaleOffset(language, script, country);
QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
@@ -823,7 +849,7 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
numberOptions = default_number_options;
data = defaultData();
}
- return QLocalePrivate::create(data, numberOptions);
+ return QLocalePrivate::create(data, offset, numberOptions);
}
@@ -1957,7 +1983,7 @@ QString QLocale::toString(qulonglong i) const
QString QLocale::toString(const QDate &date, const QString &format) const
{
- return d->dateTimeToString(format, QDateTime(), date, QTime(), this);
+ return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *this);
}
#endif
@@ -1972,7 +1998,7 @@ QString QLocale::toString(const QDate &date, const QString &format) const
*/
QString QLocale::toString(const QDate &date, QStringView format) const
{
- return d->dateTimeToString(format, QDateTime(), date, QTime(), this);
+ return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *this);
}
/*!
@@ -2027,7 +2053,7 @@ static bool timeFormatContainsAP(QStringView format)
*/
QString QLocale::toString(const QTime &time, const QString &format) const
{
- return d->dateTimeToString(format, QDateTime(), QDate(), time, this);
+ return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *this);
}
#endif
@@ -2042,7 +2068,7 @@ QString QLocale::toString(const QTime &time, const QString &format) const
*/
QString QLocale::toString(const QTime &time, QStringView format) const
{
- return d->dateTimeToString(format, QDateTime(), QDate(), time, this);
+ return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *this);
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -2058,7 +2084,7 @@ QString QLocale::toString(const QTime &time, QStringView format) const
QString QLocale::toString(const QDateTime &dateTime, const QString &format) const
{
- return d->dateTimeToString(format, dateTime, QDate(), QTime(), this);
+ return QCalendar().dateTimeToString(format, dateTime, QDate(), QTime(), *this);
}
#endif
@@ -2073,7 +2099,58 @@ QString QLocale::toString(const QDateTime &dateTime, const QString &format) cons
*/
QString QLocale::toString(const QDateTime &dateTime, QStringView format) const
{
- return d->dateTimeToString(format, dateTime, QDate(), QTime(), this);
+ return QCalendar().dateTimeToString(format, dateTime, QDate(), QTime(), *this);
+}
+
+QString QLocale::toString(const QDate &date, QStringView format, QCalendar cal) const
+{
+ return cal.dateTimeToString(format, QDateTime(), date, QTime(), *this);
+}
+
+QString QLocale::toString(const QDate &date, QLocale::FormatType format, QCalendar cal) const
+{
+ if (!date.isValid())
+ return QString();
+
+#ifndef QT_NO_SYSTEMLOCALE
+ if (cal.isGregorian() && d->m_data == systemData()) {
+ QVariant res = systemLocale()->query(format == LongFormat
+ ? QSystemLocale::DateToStringLong
+ : QSystemLocale::DateToStringShort,
+ date);
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+
+ QString format_str = dateFormat(format);
+ return toString(date, format_str, cal);
+}
+
+QString QLocale::toString(const QDateTime &dateTime, QLocale::FormatType format,
+ QCalendar cal) const
+{
+ if (!dateTime.isValid())
+ return QString();
+
+#ifndef QT_NO_SYSTEMLOCALE
+ if (cal.isGregorian() && d->m_data == systemData()) {
+ QVariant res = systemLocale()->query(format == LongFormat
+ ? QSystemLocale::DateTimeToStringLong
+ : QSystemLocale::DateTimeToStringShort,
+ dateTime);
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+
+ const QString format_str = dateTimeFormat(format);
+ return toString(dateTime, format_str, cal);
+}
+
+QString QLocale::toString(const QDateTime &dateTime, QStringView format, QCalendar cal) const
+{
+ return cal.dateTimeToString(format, dateTime, QDate(), QTime(), *this);
}
/*!
@@ -2232,6 +2309,7 @@ QString QLocale::dateTimeFormat(FormatType format) const
return dateFormat(format) + QLatin1Char(' ') + timeFormat(format);
}
+#if QT_CONFIG(datestring)
/*!
\since 4.4
@@ -2243,12 +2321,19 @@ QString QLocale::dateTimeFormat(FormatType format) const
\sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
*/
-#if QT_CONFIG(datestring)
QTime QLocale::toTime(const QString &string, FormatType format) const
{
return toTime(string, timeFormat(format));
}
-#endif
+
+/*!
+ \since 5.14
+ \overload
+*/
+QTime QLocale::toTime(const QString &string, FormatType format, QCalendar cal) const
+{
+ return toTime(string, timeFormat(format), cal);
+}
/*!
\since 4.4
@@ -2261,12 +2346,19 @@ QTime QLocale::toTime(const QString &string, FormatType format) const
\sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
*/
-#if QT_CONFIG(datestring)
QDate QLocale::toDate(const QString &string, FormatType format) const
{
return toDate(string, dateFormat(format));
}
-#endif
+
+/*!
+ \since 5.14
+ \overload
+*/
+QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) const
+{
+ return toDate(string, dateFormat(format), cal);
+}
/*!
\since 4.4
@@ -2279,13 +2371,19 @@ QDate QLocale::toDate(const QString &string, FormatType format) const
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
*/
-
-#if QT_CONFIG(datestring)
QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
{
return toDateTime(string, dateTimeFormat(format));
}
-#endif
+
+/*!
+ \since 5.14
+ \overload
+*/
+QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal) const
+{
+ return toDateTime(string, dateTimeFormat(format), cal);
+}
/*!
\since 4.4
@@ -2298,22 +2396,30 @@ QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
\sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
*/
-#if QT_CONFIG(datestring)
QTime QLocale::toTime(const QString &string, const QString &format) const
{
+ return toTime(string, format, QCalendar());
+}
+
+/*!
+ \since 5.14
+ \overload
+*/
+QTime QLocale::toTime(const QString &string, const QString &format, QCalendar cal) const
+{
QTime time;
#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString);
+ QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format))
dt.fromString(string, 0, &time);
#else
+ Q_UNUSED(cal);
Q_UNUSED(string);
Q_UNUSED(format);
#endif
return time;
}
-#endif
/*!
\since 4.4
@@ -2329,22 +2435,30 @@ QTime QLocale::toTime(const QString &string, const QString &format) const
\sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
*/
-#if QT_CONFIG(datestring)
QDate QLocale::toDate(const QString &string, const QString &format) const
{
+ return toDate(string, format, QCalendar());
+}
+
+/*!
+ \since 5.14
+ \overload
+*/
+QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal) const
+{
QDate date;
#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString);
+ QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format))
dt.fromString(string, &date, 0);
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(cal);
#endif
return date;
}
-#endif
/*!
\since 4.4
@@ -2360,25 +2474,33 @@ QDate QLocale::toDate(const QString &string, const QString &format) const
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
*/
-#if QT_CONFIG(datestring)
QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
{
+ return toDateTime(string, format, QCalendar());
+}
+
+/*!
+ \since 5.14
+ \overload
+*/
+QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal) const
+{
#if QT_CONFIG(datetimeparser)
QTime time;
QDate date;
- QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString);
+ QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
return QDateTime(date, time);
#else
Q_UNUSED(string);
Q_UNUSED(format);
+ Q_UNUSED(cal);
#endif
return QDateTime(QDate(), QTime(-1, -1, -1));
}
-#endif
-
+#endif // datestring
/*!
\since 4.1
@@ -2623,38 +2745,7 @@ QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
*/
QString QLocale::monthName(int month, FormatType type) const
{
- if (month < 1 || month > 12)
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::MonthNameLong
- : QSystemLocale::MonthNameShort,
- month);
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- quint32 idx, size;
- switch (type) {
- case QLocale::LongFormat:
- idx = d->m_data->m_long_month_names_idx;
- size = d->m_data->m_long_month_names_size;
- break;
- case QLocale::ShortFormat:
- idx = d->m_data->m_short_month_names_idx;
- size = d->m_data->m_short_month_names_size;
- break;
- case QLocale::NarrowFormat:
- idx = d->m_data->m_narrow_month_names_idx;
- size = d->m_data->m_narrow_month_names_size;
- break;
- default:
- return QString();
- }
- return getLocaleListData(months_data + idx, size, month - 1);
+ return QCalendar().monthName(*this, month, QCalendar::Unspecified, type);
}
/*!
@@ -2670,110 +2761,221 @@ QString QLocale::monthName(int month, FormatType type) const
*/
QString QLocale::standaloneMonthName(int month, FormatType type) const
{
- if (month < 1 || month > 12)
- return QString();
+ return QCalendar().standaloneMonthName(*this, month, QCalendar::Unspecified, type);
+}
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::StandaloneMonthNameLong
- : QSystemLocale::StandaloneMonthNameShort,
- month);
- if (!res.isNull())
- return res.toString();
+/*!
+ \since 4.2
+
+ Returns the localized name of the \a day (where 1 represents
+ Monday, 2 represents Tuesday and so on), in the format specified
+ by \a type.
+
+ \sa monthName(), standaloneDayName()
+*/
+QString QLocale::dayName(int day, FormatType type) const
+{
+ return QCalendar().weekDayName(*this, day, type);
+}
+
+/*!
+ \since 4.5
+
+ Returns the localized name of the \a day (where 1 represents
+ Monday, 2 represents Tuesday and so on) that is used as a
+ standalone text, in the format specified by \a type.
+
+ If the locale information does not specify the standalone day
+ name then return value is the same as in dayName().
+
+ \sa dayName(), standaloneMonthName()
+*/
+QString QLocale::standaloneDayName(int day, FormatType type) const
+{
+ return QCalendar().standaloneWeekDayName(*this, day, type);
+}
+
+// Calendar look-up of month and day names:
+
+/*!
+ \internal
+ */
+
+static QString rawMonthName(const QCalendarLocale &localeData,
+ const ushort *monthsData, int month,
+ QLocale::FormatType type)
+{
+ quint32 idx, size;
+ switch (type) {
+ case QLocale::LongFormat:
+ idx = localeData.m_long.index;
+ size = localeData.m_long.size;
+ break;
+ case QLocale::ShortFormat:
+ idx = localeData.m_short.index;
+ size = localeData.m_short.size;
+ break;
+ case QLocale::NarrowFormat:
+ idx = localeData.m_narrow.index;
+ size = localeData.m_narrow.size;
+ break;
+ default:
+ return QString();
}
-#endif
+ return getLocaleListData(monthsData + idx, size, month - 1);
+}
+
+/*!
+ \internal
+ */
+static QString rawStandaloneMonthName(const QCalendarLocale &localeData,
+ const ushort *monthsData, int month,
+ QLocale::FormatType type)
+{
quint32 idx, size;
switch (type) {
case QLocale::LongFormat:
- idx = d->m_data->m_standalone_long_month_names_idx;
- size = d->m_data->m_standalone_long_month_names_size;
+ idx = localeData.m_standalone_long.index;
+ size = localeData.m_standalone_long.size;
break;
case QLocale::ShortFormat:
- idx = d->m_data->m_standalone_short_month_names_idx;
- size = d->m_data->m_standalone_short_month_names_size;
+ idx = localeData.m_standalone_short.index;
+ size = localeData.m_standalone_short.size;
break;
case QLocale::NarrowFormat:
- idx = d->m_data->m_standalone_narrow_month_names_idx;
- size = d->m_data->m_standalone_narrow_month_names_size;
+ idx = localeData.m_standalone_narrow.index;
+ size = localeData.m_standalone_narrow.size;
break;
default:
return QString();
}
- QString name = getLocaleListData(months_data + idx, size, month - 1);
- if (name.isEmpty())
- return monthName(month, type);
- return name;
+ QString name = getLocaleListData(monthsData + idx, size, month - 1);
+ return name.isEmpty() ? rawMonthName(localeData, monthsData, month, type) : name;
}
/*!
- \since 4.2
-
- Returns the localized name of the \a day (where 1 represents
- Monday, 2 represents Tuesday and so on), in the format specified
- by \a type.
+ \internal
+ */
- \sa monthName(), standaloneDayName()
-*/
-QString QLocale::dayName(int day, FormatType type) const
+static QString rawWeekDayName(const QLocaleData *data, const int day,
+ QLocale::FormatType type)
{
- if (day < 1 || day > 7)
+ quint32 idx, size;
+ switch (type) {
+ case QLocale::LongFormat:
+ idx = data->m_long_day_names_idx;
+ size = data->m_long_day_names_size;
+ break;
+ case QLocale::ShortFormat:
+ idx = data->m_short_day_names_idx;
+ size = data->m_short_day_names_size;
+ break;
+ case QLocale::NarrowFormat:
+ idx = data->m_narrow_day_names_idx;
+ size = data->m_narrow_day_names_size;
+ break;
+ default:
return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::DayNameLong
- : QSystemLocale::DayNameShort,
- day);
- if (!res.isNull())
- return res.toString();
}
-#endif
- if (day == 7)
- day = 0;
+ return getLocaleListData(days_data + idx, size, day == 7 ? 0 : day);
+}
+/*!
+ \internal
+ */
+
+static QString rawStandaloneWeekDayName(const QLocaleData *data, const int day,
+ QLocale::FormatType type)
+{
quint32 idx, size;
switch (type) {
case QLocale::LongFormat:
- idx = d->m_data->m_long_day_names_idx;
- size = d->m_data->m_long_day_names_size;
+ idx = data->m_standalone_long_day_names_idx;
+ size = data->m_standalone_long_day_names_size;
break;
case QLocale::ShortFormat:
- idx = d->m_data->m_short_day_names_idx;
- size = d->m_data->m_short_day_names_size;
+ idx = data->m_standalone_short_day_names_idx;
+ size = data->m_standalone_short_day_names_size;
break;
case QLocale::NarrowFormat:
- idx = d->m_data->m_narrow_day_names_idx;
- size = d->m_data->m_narrow_day_names_size;
+ idx = data->m_standalone_narrow_day_names_idx;
+ size = data->m_standalone_narrow_day_names_size;
break;
default:
return QString();
}
- return getLocaleListData(days_data + idx, size, day);
+ QString name = getLocaleListData(days_data + idx, size, day == 7 ? 0 : day);
+ if (name.isEmpty())
+ return rawWeekDayName(data, day, type);
+ return name;
}
-/*!
- \since 4.5
+// Refugees from qcalendar.cpp that need functions above:
- Returns the localized name of the \a day (where 1 represents
- Monday, 2 represents Tuesday and so on) that is used as a
- standalone text, in the format specified by \a type.
+QString QCalendarBackend::monthName(const QLocale &locale, int month, int,
+ QLocale::FormatType format) const
+{
+ Q_ASSERT(month >= 1 && month <= maxMonthsInYear());
+ return rawMonthName(localeMonthIndexData()[locale.d->m_data_offset],
+ localeMonthData(), month, format);
+}
- If the locale information does not specify the standalone day
- name then return value is the same as in dayName().
+QString QGregorianCalendar::monthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (locale.d->m_data == systemData()) {
+ Q_ASSERT(month >= 1 && month <= 12);
+ QVariant res = systemLocale()->query(format == QLocale::LongFormat
+ ? QSystemLocale::MonthNameLong
+ : QSystemLocale::MonthNameShort,
+ month);
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
- \sa dayName(), standaloneMonthName()
-*/
-QString QLocale::standaloneDayName(int day, FormatType type) const
+ return QCalendarBackend::monthName(locale, month, year, format);
+}
+
+QString QCalendarBackend::standaloneMonthName(const QLocale &locale, int month, int,
+ QLocale::FormatType format) const
+{
+ Q_ASSERT(month >= 1 && month <= maxMonthsInYear());
+ return rawStandaloneMonthName(localeMonthIndexData()[locale.d->m_data_offset],
+ localeMonthData(), month, format);
+}
+
+QString QGregorianCalendar::standaloneMonthName(const QLocale &locale, int month, int year,
+ QLocale::FormatType format) const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (locale.d->m_data == systemData()) {
+ Q_ASSERT(month >= 1 && month <= 12);
+ QVariant res = systemLocale()->query(format == QLocale::LongFormat
+ ? QSystemLocale::StandaloneMonthNameLong
+ : QSystemLocale::StandaloneMonthNameShort,
+ month);
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+
+ return QCalendarBackend::standaloneMonthName(locale, month, year, format);
+}
+
+// Most calendars share the common week-day naming, modulo locale.
+// Calendars that don't must override these methods.
+QString QCalendarBackend::weekDayName(const QLocale &locale, int day,
+ QLocale::FormatType format) const
{
if (day < 1 || day > 7)
return QString();
#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
+ if (locale.d->m_data == systemData()) {
+ QVariant res = systemLocale()->query(format == QLocale::LongFormat
? QSystemLocale::DayNameLong
: QSystemLocale::DayNameShort,
day);
@@ -2781,32 +2983,32 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
return res.toString();
}
#endif
- if (day == 7)
- day = 0;
- quint32 idx, size;
- switch (type) {
- case QLocale::LongFormat:
- idx = d->m_data->m_standalone_long_day_names_idx;
- size = d->m_data->m_standalone_long_day_names_size;
- break;
- case QLocale::ShortFormat:
- idx = d->m_data->m_standalone_short_day_names_idx;
- size = d->m_data->m_standalone_short_day_names_size;
- break;
- case QLocale::NarrowFormat:
- idx = d->m_data->m_standalone_narrow_day_names_idx;
- size = d->m_data->m_standalone_narrow_day_names_size;
- break;
- default:
+ return rawWeekDayName(locale.d->m_data, day, format);
+}
+
+QString QCalendarBackend::standaloneWeekDayName(const QLocale &locale, int day,
+ QLocale::FormatType format) const
+{
+ if (day < 1 || day > 7)
return QString();
+
+#ifndef QT_NO_SYSTEMLOCALE
+ if (locale.d->m_data == systemData()) {
+ QVariant res = systemLocale()->query(format == QLocale::LongFormat
+ ? QSystemLocale::DayNameLong
+ : QSystemLocale::DayNameShort,
+ day);
+ if (!res.isNull())
+ return res.toString();
}
- QString name = getLocaleListData(days_data + idx, size, day);
- if (name.isEmpty())
- return dayName(day == 0 ? 7 : day, type);
- return name;
+#endif
+
+ return rawStandaloneWeekDayName(locale.d->m_data, day, format);
}
+// End of this block of qcalendar.cpp refugees. (One more follows.)
+
/*!
\since 4.8
@@ -3010,10 +3212,11 @@ QString QLocale::pmText() const
return getLocaleData(pm_data + d->m_data->m_pm_idx, d->m_data->m_pm_size);
}
+// Another intrusion from QCalendar, using some of the tools above:
-QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
- const QLocale *q) const
+QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &datetime,
+ const QDate &dateOnly, const QTime &timeOnly,
+ const QLocale &locale) const
{
QDate date;
QTime time;
@@ -3035,6 +3238,15 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
}
QString result;
+ int year = 0, month = 0, day = 0;
+ if (formatDate) {
+ const auto parts = julianDayToDate(date.toJulianDay());
+ if (!parts.isValid())
+ return QString();
+ year = parts.year;
+ month = parts.month;
+ day = parts.day;
+ }
int i = 0;
while (i < format.size()) {
@@ -3057,15 +3269,14 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
switch (repeat) {
case 4: {
- const int yr = date.year();
- const int len = (yr < 0) ? 5 : 4;
- result.append(m_data->longLongToString(yr, -1, 10, len,
- QLocaleData::ZeroPadded));
+ const int len = (year < 0) ? 5 : 4;
+ result.append(locale.d->m_data->longLongToString(year, -1, 10, len,
+ QLocaleData::ZeroPadded));
break;
}
case 2:
- result.append(m_data->longLongToString(date.year() % 100, -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(year % 100, -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
default:
repeat = 1;
@@ -3079,17 +3290,17 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
repeat = qMin(repeat, 4);
switch (repeat) {
case 1:
- result.append(m_data->longLongToString(date.month()));
+ result.append(locale.d->m_data->longLongToString(month));
break;
case 2:
- result.append(m_data->longLongToString(date.month(), -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(month, -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
case 3:
- result.append(q->monthName(date.month(), QLocale::ShortFormat));
+ result.append(monthName(locale, month, year, QLocale::ShortFormat));
break;
case 4:
- result.append(q->monthName(date.month(), QLocale::LongFormat));
+ result.append(monthName(locale, month, year, QLocale::LongFormat));
break;
}
break;
@@ -3099,17 +3310,19 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
repeat = qMin(repeat, 4);
switch (repeat) {
case 1:
- result.append(m_data->longLongToString(date.day()));
+ result.append(locale.d->m_data->longLongToString(day));
break;
case 2:
- result.append(m_data->longLongToString(date.day(), -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(day, -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
case 3:
- result.append(q->dayName(date.dayOfWeek(), QLocale::ShortFormat));
+ result.append(locale.dayName(
+ dayOfWeek(date.toJulianDay()), QLocale::ShortFormat));
break;
case 4:
- result.append(q->dayName(date.dayOfWeek(), QLocale::LongFormat));
+ result.append(locale.dayName(
+ dayOfWeek(date.toJulianDay()), QLocale::LongFormat));
break;
}
break;
@@ -3133,11 +3346,11 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
switch (repeat) {
case 1:
- result.append(m_data->longLongToString(hour));
+ result.append(locale.d->m_data->longLongToString(hour));
break;
case 2:
- result.append(m_data->longLongToString(hour, -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(hour, -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
}
break;
@@ -3147,11 +3360,11 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
repeat = qMin(repeat, 2);
switch (repeat) {
case 1:
- result.append(m_data->longLongToString(time.hour()));
+ result.append(locale.d->m_data->longLongToString(time.hour()));
break;
case 2:
- result.append(m_data->longLongToString(time.hour(), -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(time.hour(), -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
}
break;
@@ -3161,11 +3374,11 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
repeat = qMin(repeat, 2);
switch (repeat) {
case 1:
- result.append(m_data->longLongToString(time.minute()));
+ result.append(locale.d->m_data->longLongToString(time.minute()));
break;
case 2:
- result.append(m_data->longLongToString(time.minute(), -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(time.minute(), -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
}
break;
@@ -3175,11 +3388,11 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
repeat = qMin(repeat, 2);
switch (repeat) {
case 1:
- result.append(m_data->longLongToString(time.second()));
+ result.append(locale.d->m_data->longLongToString(time.second()));
break;
case 2:
- result.append(m_data->longLongToString(time.second(), -1, 10, 2,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(time.second(), -1, 10, 2,
+ QLocaleData::ZeroPadded));
break;
}
break;
@@ -3187,13 +3400,15 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
case 'a':
used = true;
repeat = format.mid(i + 1).startsWith(QLatin1Char('p')) ? 2 : 1;
- result.append(time.hour() < 12 ? q->amText().toLower() : q->pmText().toLower());
+ result.append(time.hour() < 12 ? locale.amText().toLower()
+ : locale.pmText().toLower());
break;
case 'A':
used = true;
repeat = format.mid(i + 1).startsWith(QLatin1Char('P')) ? 2 : 1;
- result.append(time.hour() < 12 ? q->amText().toUpper() : q->pmText().toUpper());
+ result.append(time.hour() < 12 ? locale.amText().toUpper()
+ : locale.pmText().toUpper());
break;
case 'z':
@@ -3202,15 +3417,14 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
// note: the millisecond component is treated like the decimal part of the seconds
// so ms == 2 is always printed as "002", but ms == 200 can be either "2" or "200"
- result.append(m_data->longLongToString(time.msec(), -1, 10, 3,
- QLocaleData::ZeroPadded));
+ result.append(locale.d->m_data->longLongToString(time.msec(), -1, 10, 3,
+ QLocaleData::ZeroPadded));
if (repeat == 1) {
- if (result.endsWith(zero()))
+ if (result.endsWith(locale.d->zero()))
result.chop(1);
- if (result.endsWith(zero()))
+ if (result.endsWith(locale.d->zero()))
result.chop(1);
}
-
break;
case 't':
@@ -3233,6 +3447,8 @@ QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &da
return result;
}
+// End of QCalendar intrustions
+
QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
int width, unsigned flags) const
{