61 out.reserve(pattern.size());
62 bool inQuoted =
false;
63 while (!pattern.isEmpty()) {
64 const QChar ch = pattern.front();
65 qsizetype consumed = 1;
69 }
else if (inQuoted) {
71 }
else if (ch == u'E' || ch == u'y' || ch == u'a') {
72 while (consumed < pattern.size() && pattern[consumed] == ch)
75 out.append(consumed >= 4 ?
"dddd"_L1 :
"ddd"_L1);
77 out.append(consumed == 2 ?
"yy"_L1 :
"yyyy"_L1);
83 pattern = pattern.sliced(consumed);
92 constexpr jint SHORT = 3;
93 constexpr jint MEDIUM = 2;
94 constexpr jint FULL = 0;
96 const char *factory =
nullptr;
99 case QSystemLocale::DateFormatShort: factory =
"getDateInstance"; style = SHORT;
break;
100 case QSystemLocale::DateFormatLong: factory =
"getDateInstance"; style = FULL;
break;
101 case QSystemLocale::TimeFormatShort: factory =
"getTimeInstance"; style = SHORT;
break;
102 case QSystemLocale::TimeFormatLong: factory =
"getTimeInstance"; style = MEDIUM;
break;
103 default: Q_UNREACHABLE();
break;
106 const auto dateFormat = DateFormat::callStaticMethod<DateFormat>(factory, style, locale);
107 return qtPatternFromJava(dateFormat.callMethod<QString>(
"toPattern"));
112 const QJniObject context = QtAndroidPrivate::context();
113 const Locale androidLocale = [context]{
114 if (context.isValid()) {
115 const auto resources = context.callMethod<Resources>(
"getResources");
116 const auto configuration = resources.callMethod<Configuration>(
"getConfiguration");
117 return configuration.getField<Locale>(
"locale");
119 return Locale::callStaticMethod<Locale>(
"getDefault");
123 updated.language = QLocale::codeToLanguage(androidLocale.callMethod<QString>(
"getLanguage"));
124 updated.script = QLocale::codeToScript(androidLocale.callMethod<QString>(
"getScript"));
125 updated.territory = QLocale::codeToTerritory(androidLocale.callMethod<QString>(
"getCountry"));
129 updated.dateFormatShort = patternForStyle(QSystemLocale::DateFormatShort, androidLocale);
130 updated.dateFormatLong = patternForStyle(QSystemLocale::DateFormatLong, androidLocale);
131 updated.timeFormatShort = patternForStyle(QSystemLocale::TimeFormatShort, androidLocale);
132 updated.timeFormatLong = patternForStyle(QSystemLocale::TimeFormatLong, androidLocale);
137 QWriteLocker locker(&lock);
138 localeInfo = updated;
145QLocale QSystemLocale::fallbackLocale()
const
147 QSystemLocaleData *d = qSystemLocaleData();
149 return QLocale(QLocale::C);
151 const LocaleInfo info = d->snapshot();
152 return QLocale(info.language, info.script, info.territory);
155QVariant QSystemLocale::query(QueryType type, QVariant &&in)
const
158 QSystemLocaleData *d = qSystemLocaleData();
162 if (type == LocaleChanged) {
163 d->readLocaleFromJava();
167 const LocaleInfo info = d->snapshot();
171 return QVariant::fromValue(
static_cast<
int>(info.language));
173 return QVariant::fromValue(
static_cast<
int>(info.territory));
175 return QVariant::fromValue(
static_cast<
int>(info.script));
177 return QLocale(info.language, info.script, info.territory).name();
178 case TimeFormatShort:
179 return info.timeFormatShort;
181 return info.timeFormatLong;
182 case DateFormatShort:
183 return info.dateFormatShort;
185 return info.dateFormatLong;
187 const LocaleList localeList = LocaleList::callStaticMethod<LocaleList>(
"getDefault");
188 if (!localeList.isValid())
190 QString tags = localeList.callMethod<QString>(
"toLanguageTags");
192 if (tags.startsWith(u'[') && tags.endsWith(u']'))
193 tags = tags.mid(1, tags.length() - 2);
194 return tags.split(u',');