Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qqmllocale.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmllocale_p.h"
5#include <private/qqmlcontext_p.h>
6#include <QtCore/qnumeric.h>
7#include <QtCore/qdatetime.h>
8#include <QtCore/qtimezone.h>
9
10#include <private/qlocale_p.h>
11#include <private/qlocale_data_p.h>
12
13#include <private/qv4dateobject_p.h>
14#include <private/qv4numberobject_p.h>
15#include <private/qv4stringobject_p.h>
16
18
19using namespace QV4;
20
22
23#define THROW_ERROR(string) \
24 do { \
25 return scope.engine->throwError(QString::fromUtf8(string)); \
26 } while (false)
27
28
29#define GET_LOCALE_DATA_RESOURCE(OBJECT) \
30 QV4::Scoped<QQmlLocaleData> r(scope, OBJECT.as<QQmlLocaleData>()); \
31 if (!r) \
32 THROW_ERROR("Not a valid Locale object")
33
34static bool isLocaleObject(const QV4::Value &val)
35{
36 return val.as<QQmlLocaleData>();
37}
38
39//--------------
40// Date extension
41
43{
44 engine->datePrototype()->defineDefaultProperty(engine->id_toLocaleString(), method_toLocaleString);
45 engine->datePrototype()->defineDefaultProperty(QStringLiteral("toLocaleTimeString"), method_toLocaleTimeString);
46 engine->datePrototype()->defineDefaultProperty(QStringLiteral("toLocaleDateString"), method_toLocaleDateString);
47 engine->dateCtor()->defineDefaultProperty(QStringLiteral("fromLocaleString"), method_fromLocaleString);
48 engine->dateCtor()->defineDefaultProperty(QStringLiteral("fromLocaleTimeString"), method_fromLocaleTimeString);
49 engine->dateCtor()->defineDefaultProperty(QStringLiteral("fromLocaleDateString"), method_fromLocaleDateString);
50 engine->dateCtor()->defineDefaultProperty(QStringLiteral("timeZoneUpdated"), method_timeZoneUpdated);
51}
52
53ReturnedValue QQmlDateExtension::method_toLocaleString(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
54{
55 Scope scope(b);
56 if (argc > 2)
57 return QV4::DatePrototype::method_toLocaleString(b, thisObject, argv, argc);
58
59 const QV4::DateObject *date = thisObject->as<DateObject>();
60 if (!date)
61 return QV4::DatePrototype::method_toLocaleString(b, thisObject, argv, argc);
62
63 QDateTime dt = date->toQDateTime();
64
65 if (argc == 0) {
66 // Use QLocale for standard toLocaleString() function
67 QLocale locale;
68 RETURN_RESULT(scope.engine->newString(locale.toString(dt)));
69 }
70
71 if (!isLocaleObject(argv[0]))
72 return QV4::DatePrototype::method_toLocaleString(b, thisObject, argv, argc); // Use the default Date toLocaleString()
73
75
77 QString formattedDt;
78 if (argc == 2) {
79 if (String *s = argv[1].stringValue()) {
80 QString format = s->toQString();
81 formattedDt = r->d()->locale->toString(dt, format);
82 } else if (argv[1].isNumber()) {
83 quint32 intFormat = argv[1].toNumber();
85 formattedDt = r->d()->locale->toString(dt, format);
86 } else {
87 THROW_ERROR("Locale: Date.toLocaleString(): Invalid datetime format");
88 }
89 } else {
90 formattedDt = r->d()->locale->toString(dt, enumFormat);
91 }
92
93 RETURN_RESULT(scope.engine->newString(formattedDt));
94}
95
96ReturnedValue QQmlDateExtension::method_toLocaleTimeString(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
97{
98 Scope scope(b);
99 if (argc > 2)
100 return QV4::DatePrototype::method_toLocaleTimeString(b, thisObject, argv, argc);
101
102 const QV4::DateObject *date = thisObject->as<DateObject>();
103 if (!date)
104 return QV4::DatePrototype::method_toLocaleTimeString(b, thisObject, argv, argc);
105
106 QDateTime dt = date->toQDateTime();
107 QTime time = dt.time();
108
109 if (argc == 0) {
110 // Use QLocale for standard toLocaleString() function
112 RETURN_RESULT(scope.engine->newString(locale.toString(time)));
113 }
114
115 if (!isLocaleObject(argv[0]))
116 return QV4::DatePrototype::method_toLocaleTimeString(b, thisObject, argv, argc); // Use the default Date toLocaleTimeString()
117
119
121 QString formattedTime;
122 if (argc == 2) {
123 if (String *s = argv[1].stringValue()) {
124 QString format = s->toQString();
125 formattedTime = r->d()->locale->toString(time, format);
126 } else if (argv[1].isNumber()) {
127 quint32 intFormat = argv[1].toNumber();
129 formattedTime = r->d()->locale->toString(time, format);
130 } else {
131 THROW_ERROR("Locale: Date.toLocaleTimeString(): Invalid time format");
132 }
133 } else {
134 formattedTime = r->d()->locale->toString(time, enumFormat);
135 }
136
137 RETURN_RESULT(scope.engine->newString(formattedTime));
138}
139
140ReturnedValue QQmlDateExtension::method_toLocaleDateString(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
141{
142 Scope scope(b);
143 if (argc > 2)
144 return QV4::DatePrototype::method_toLocaleDateString(b, thisObject, argv, argc);
145
146 const QV4::DateObject *dateObj = thisObject->as<DateObject>();
147 if (!dateObj)
148 return QV4::DatePrototype::method_toLocaleDateString(b, thisObject, argv, argc);
149
150 QDateTime dt = dateObj->toQDateTime();
151 QDate date = dt.date();
152
153 if (argc == 0) {
154 // Use QLocale for standard toLocaleString() function
156 RETURN_RESULT(scope.engine->newString(locale.toString(date)));
157 }
158
159 if (!isLocaleObject(argv[0]))
160 return QV4::DatePrototype::method_toLocaleDateString(b, thisObject, argv, argc); // Use the default Date toLocaleDateString()
161
163
165 QString formattedDate;
166 if (argc == 2) {
167 if (String *s = argv[1].stringValue()) {
168 QString format = s->toQString();
169 formattedDate = r->d()->locale->toString(date, format);
170 } else if (argv[1].isNumber()) {
171 quint32 intFormat = argv[1].toNumber();
173 formattedDate = r->d()->locale->toString(date, format);
174 } else {
175 THROW_ERROR("Locale: Date.loLocaleDateString(): Invalid date format");
176 }
177 } else {
178 formattedDate = r->d()->locale->toString(date, enumFormat);
179 }
180
181 RETURN_RESULT(scope.engine->newString(formattedDate));
182}
183
184ReturnedValue QQmlDateExtension::method_fromLocaleString(const QV4::FunctionObject *b, const QV4::Value *, const QV4::Value *argv, int argc)
185{
186 QV4::Scope scope(b);
187 QV4::ExecutionEngine * const engine = scope.engine;
188 if (argc == 1) {
189 if (String *s = argv[0].stringValue()) {
191 QString dateString = s->toQString();
192 QDateTime dt = locale.toDateTime(dateString);
193 RETURN_RESULT(engine->newDateObject(dt));
194 }
195 }
196
197 if (argc < 1 || argc > 3 || !isLocaleObject(argv[0]))
198 THROW_ERROR("Locale: Date.fromLocaleString(): Invalid arguments");
199
201
203 QDateTime dt;
204 QString dateString = argv[1].toQStringNoThrow();
205 if (argc == 3) {
206 if (String *s = argv[2].stringValue()) {
207 QString format = s->toQString();
208 dt = r->d()->locale->toDateTime(dateString, format);
209 } else if (argv[2].isNumber()) {
210 quint32 intFormat = argv[2].toNumber();
212 dt = r->d()->locale->toDateTime(dateString, format);
213 } else {
214 THROW_ERROR("Locale: Date.fromLocaleString(): Invalid datetime format");
215 }
216 } else {
217 dt = r->d()->locale->toDateTime(dateString, enumFormat);
218 }
219
220 RETURN_RESULT(engine->newDateObject(dt));
221}
222
223ReturnedValue QQmlDateExtension::method_fromLocaleTimeString(const QV4::FunctionObject *b, const QV4::Value *, const QV4::Value *argv, int argc)
224{
225 QV4::Scope scope(b);
226 QV4::ExecutionEngine * const engine = scope.engine;
227
228 if (argc == 1) {
229 if (String *s = argv[0].stringValue()) {
231 QString timeString = s->toQString();
232 QTime time = locale.toTime(timeString);
234 dt.setTime(time);
235 RETURN_RESULT(engine->newDateObject(dt));
236 }
237 }
238
239 if (argc < 1 || argc > 3 || !isLocaleObject(argv[0]))
240 THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid arguments");
241
243
245 QTime tm;
246 QString dateString = argv[1].toQStringNoThrow();
247 if (argc == 3) {
248 if (String *s = argv[2].stringValue()) {
249 QString format = s->toQString();
250 tm = r->d()->locale->toTime(dateString, format);
251 } else if (argv[2].isNumber()) {
252 quint32 intFormat = argv[2].toNumber();
254 tm = r->d()->locale->toTime(dateString, format);
255 } else {
256 THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid datetime format");
257 }
258 } else {
259 tm = r->d()->locale->toTime(dateString, enumFormat);
260 }
261
262 QDateTime dt;
263 if (tm.isValid()) {
265 dt.setTime(tm);
266 }
267
268 RETURN_RESULT(engine->newDateObject(dt));
269}
270
271ReturnedValue QQmlDateExtension::method_fromLocaleDateString(const QV4::FunctionObject *b, const QV4::Value *, const QV4::Value *argv, int argc)
272{
273 QV4::Scope scope(b);
274 QV4::ExecutionEngine * const engine = scope.engine;
275
276 if (argc == 1) {
277 if (String *s = argv[0].stringValue()) {
279 QString dateString = s->toQString();
280 QDate date = locale.toDate(dateString);
282 }
283 }
284
285 if (argc < 1 || argc > 3 || !isLocaleObject(argv[0]))
286 THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid arguments");
287
289
291 QDate dt;
292 QString dateString = argv[1].toQStringNoThrow();
293 if (argc == 3) {
294 if (String *s = argv[2].stringValue()) {
295 QString format = s->toQString();
296 dt = r->d()->locale->toDate(dateString, format);
297 } else if (argv[2].isNumber()) {
298 quint32 intFormat = argv[2].toNumber();
300 dt = r->d()->locale->toDate(dateString, format);
301 } else {
302 THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid datetime format");
303 }
304 } else {
305 dt = r->d()->locale->toDate(dateString, enumFormat);
306 }
307
308 RETURN_RESULT(engine->newDateObject(dt.startOfDay(QTimeZone::UTC)));
309}
310
311ReturnedValue QQmlDateExtension::method_timeZoneUpdated(const QV4::FunctionObject *b, const QV4::Value *, const QV4::Value *, int argc)
312{
313 QV4::Scope scope(b);
314 if (argc != 0)
315 THROW_ERROR("Locale: Date.timeZoneUpdated(): Invalid arguments");
316
318
320}
321
322//-----------------
323// Number extension
324
326{
327 engine->numberPrototype()->defineDefaultProperty(engine->id_toLocaleString(), method_toLocaleString);
328 engine->numberPrototype()->defineDefaultProperty(QStringLiteral("toLocaleCurrencyString"), method_toLocaleCurrencyString);
329 engine->numberCtor()->defineDefaultProperty(QStringLiteral("fromLocaleString"), method_fromLocaleString);
330}
331
332QV4::ReturnedValue QQmlNumberExtension::method_toLocaleString(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
333{
334 QV4::Scope scope(b);
335 if (argc > 3)
336 THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments");
337
338 double number = thisObject->toNumber();
339
340 if (argc == 0) {
341 // Use QLocale for standard toLocaleString() function
342 QLocale locale;
343 RETURN_RESULT(scope.engine->newString(locale.toString(number)));
344 }
345
346 if (!isLocaleObject(argv[0]))
347 return QV4::NumberPrototype::method_toLocaleString(b, thisObject, argv, argc); // Use the default Number toLocaleString()
348
350
351 quint16 format = 'f';
352 if (argc > 1) {
353 if (!argv[1].isString())
354 THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments");
355 QString fs = argv[1].toQString();
356 if (fs.size())
357 format = fs.at(0).unicode();
358 }
359 int prec = 2;
360 if (argc > 2) {
361 if (!argv[2].isNumber())
362 THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments");
363 prec = argv[2].toInt32();
364 }
365
366 RETURN_RESULT(scope.engine->newString(r->d()->locale->toString(number, (char)format, prec)));
367}
368
369ReturnedValue QQmlNumberExtension::method_toLocaleCurrencyString(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
370{
371 QV4::Scope scope(b);
372 if (argc > 2)
373 THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments");
374
375 double number = thisObject->toNumber();
376
377 if (argc == 0) {
378 // Use QLocale for standard toLocaleString() function
380 RETURN_RESULT(scope.engine->newString(locale.toString(number)));
381 }
382
383 if (!isLocaleObject(argv[0]))
384 THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments");
385
387
389 if (argc > 1) {
390 if (!argv[1].isString())
391 THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments");
392 symbol = argv[1].toQStringNoThrow();
393 }
394
395 RETURN_RESULT(scope.engine->newString(r->d()->locale->toCurrencyString(number, symbol)));
396}
397
398ReturnedValue QQmlNumberExtension::method_fromLocaleString(const QV4::FunctionObject *b, const QV4::Value *, const QV4::Value *argv, int argc)
399{
400 QV4::Scope scope(b);
401 if (argc < 1 || argc > 2)
402 THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments");
403
404 int numberIdx = 0;
406
407 if (argc == 2) {
408 if (!isLocaleObject(argv[0]))
409 THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments");
410
412 locale = *r->d()->locale;
413
414 numberIdx = 1;
415 }
416
417 QString ns = argv[numberIdx].toQString();
418 if (!ns.size())
420
421 bool ok = false;
422 double val = locale.toDouble(ns, &ok);
423
424 if (!ok)
425 THROW_ERROR("Locale: Number.fromLocaleString(): Invalid format");
426
428}
429
430//--------------
431// Locale object
432
434{
435 QV4::Scope scope(b);
436 const QLocale *locale = getThisLocale(scope, thisObject);
437 if (!locale)
438 return Encode::undefined();
439 int fdow = int(locale->firstDayOfWeek());
440 if (fdow == 7)
441 fdow = 0; // Qt::Sunday = 7, but Sunday is 0 in JS Date
442 RETURN_RESULT(fdow);
443}
444
446 QV4::Scope scope(b);
447 const QLocale *locale = getThisLocale(scope, thisObject);
448 if (!locale)
449 return Encode::undefined();
450 int numberOptions = int(locale->numberOptions());
451 RETURN_RESULT(numberOptions);
452}
453
455 QV4::Scope scope(b);
456 QLocale *locale = getThisLocale(scope, thisObject);
457 int const numberOptions = argc ? int(argv[0].toNumber()) : QLocale::DefaultNumberOptions;
458 locale->setNumberOptions(QLocale::NumberOptions {numberOptions});
459 return Encode::undefined();
460}
461
463{
464 QV4::Scope scope(b);
465 const QLocale *locale = getThisLocale(scope, thisObject);
466 if (!locale)
467 return Encode::undefined();
468
469 if (argc < 1 || argc > 3) {
471 "Locale: formattedDataSize(): Expected 1-3 arguments, but received %1").arg(argc).toLatin1());
472 }
473
474 const qint64 bytes = static_cast<qint64>(argv[0].toInteger());
475 if (argc == 1)
476 RETURN_RESULT(scope.engine->newString(locale->formattedDataSize(bytes)));
477
478 int precision = 0;
479 if (argc >= 2) {
480 if (!argv[1].isInteger())
481 THROW_ERROR("Locale: formattedDataSize(): Invalid argument ('precision' must be an int)");
482
483 precision = argv[1].toInt32();
484 if (argc == 2)
485 RETURN_RESULT(scope.engine->newString(locale->formattedDataSize(bytes, precision)));
486 }
487
488 // argc >= 3
489 if (!argv[2].isNumber())
490 THROW_ERROR("Locale: formattedDataSize(): Invalid argument ('format' must be DataSizeFormat)");
491
492 const quint32 intFormat = argv[2].toUInt32();
493 const auto format = QLocale::DataSizeFormats(intFormat);
494 RETURN_RESULT(scope.engine->newString(locale->formattedDataSize(bytes, precision, format)));
495}
496
498{
499 QV4::Scope scope(b);
500 const QLocale *locale = getThisLocale(scope, thisObject);
501 if (!locale)
502 return Encode::undefined();
503 return QV4::Encode(locale->measurementSystem());
504}
505
507{
508 QV4::Scope scope(b);
509 const QLocale *locale = getThisLocale(scope, thisObject);
510 if (!locale)
511 return Encode::undefined();
512
513 return QV4::Encode(locale->textDirection());
514}
515
517{
518 QV4::Scope scope(b);
519 const QLocale *locale = getThisLocale(scope, thisObject);
520 if (!locale)
521 return Encode::undefined();
522
523 QList<Qt::DayOfWeek> days = locale->weekdays();
524
526 result->arrayReserve(days.size());
527 for (int i = 0; i < days.size(); ++i) {
528 int day = days.at(i);
529 if (day == 7) // JS Date days in range 0(Sunday) to 6(Saturday)
530 day = 0;
531 result->arrayPut(i, QV4::Value::fromInt32(day));
532 }
533 result->setArrayLengthUnchecked(days.size());
534
535 return result.asReturnedValue();
536}
537
539{
540 QV4::Scope scope(b);
541 const QLocale *locale = getThisLocale(scope, thisObject);
542 if (!locale)
543 return Encode::undefined();
544
545 QStringList langs = locale->uiLanguages();
547 result->arrayReserve(langs.size());
548 QV4::ScopedValue v(scope);
549 for (int i = 0; i < langs.size(); ++i)
550 result->arrayPut(i, (v = scope.engine->newString(langs.at(i))));
551
552 result->setArrayLengthUnchecked(langs.size());
553
554 return result.asReturnedValue();
555}
556
558{
559 QV4::Scope scope(b);
560 const QLocale *locale = getThisLocale(scope, thisObject);
561 if (!locale)
562 return Encode::undefined();
563
564 if (argc > 1)
565 THROW_ERROR("Locale: currencySymbol(): Invalid arguments");
566
568 if (argc == 1) {
569 quint32 intFormat = argv[0].toNumber();
571 }
572
573 RETURN_RESULT(scope.engine->newString(locale->currencySymbol(format)));
574}
575
576#define LOCALE_FORMAT(FUNC) \
577ReturnedValue QQmlLocaleData::method_ ##FUNC (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc) { \
578 QV4::Scope scope(b); \
579 const QLocale *locale = getThisLocale(scope, thisObject); \
580 if (!locale) \
581 return Encode::undefined(); \
582 if (argc > 1) \
583 THROW_ERROR("Locale: " #FUNC "(): Invalid arguments"); \
584 QLocale::FormatType format = QLocale::LongFormat;\
585 if (argc == 1) { \
586 quint32 intFormat = argv[0].toUInt32(); \
587 format = QLocale::FormatType(intFormat); \
588 } \
589 RETURN_RESULT(scope.engine->newString(locale-> FUNC (format))); \
590}
591
592LOCALE_FORMAT(dateTimeFormat)
593LOCALE_FORMAT(timeFormat)
594LOCALE_FORMAT(dateFormat)
595
596// +1 added to idx because JS is 0-based, whereas QLocale months begin at 1.
597#define LOCALE_FORMATTED_MONTHNAME(VARIABLE) \
598ReturnedValue QQmlLocaleData::method_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc) {\
599 Scope scope(b); \
600 const QLocale *locale = getThisLocale(scope, thisObject); \
601 if (!locale) \
602 return Encode::undefined(); \
603 if (argc < 1 || argc > 2) \
604 THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \
605 QLocale::FormatType enumFormat = QLocale::LongFormat; \
606 int idx = argv[0].toInt32() + 1; \
607 if (idx < 1 || idx > 12) \
608 THROW_ERROR("Locale: Invalid month"); \
609 QString name; \
610 if (argc == 2) { \
611 if (argv[1].isNumber()) { \
612 quint32 intFormat = argv[1].toUInt32(); \
613 QLocale::FormatType format = QLocale::FormatType(intFormat); \
614 name = locale-> VARIABLE(idx, format); \
615 } else { \
616 THROW_ERROR("Locale: Invalid datetime format"); \
617 } \
618 } else { \
619 name = locale-> VARIABLE(idx, enumFormat); \
620 } \
621 RETURN_RESULT(scope.engine->newString(name)); \
622}
623
624// 0 -> 7 as Qt::Sunday is 7, but Sunday is 0 in JS Date
625#define LOCALE_FORMATTED_DAYNAME(VARIABLE) \
626ReturnedValue QQmlLocaleData::method_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc) {\
627 Scope scope(b); \
628 const QLocale *locale = getThisLocale(scope, thisObject); \
629 if (!locale) \
630 return Encode::undefined(); \
631 if (argc < 1 || argc > 2) \
632 THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \
633 QLocale::FormatType enumFormat = QLocale::LongFormat; \
634 int idx = argv[0].toInt32(); \
635 if (idx < 0 || idx > 7) \
636 THROW_ERROR("Locale: Invalid day"); \
637 if (idx == 0) idx = 7; \
638 QString name; \
639 if (argc == 2) { \
640 if (argv[1].isNumber()) { \
641 quint32 intFormat = argv[1].toUInt32(); \
642 QLocale::FormatType format = QLocale::FormatType(intFormat); \
643 name = locale-> VARIABLE(idx, format); \
644 } else { \
645 THROW_ERROR("Locale: Invalid datetime format"); \
646 } \
647 } else { \
648 name = locale-> VARIABLE(idx, enumFormat); \
649 } \
650 RETURN_RESULT(scope.engine->newString(name)); \
651}
652
654LOCALE_FORMATTED_MONTHNAME(standaloneMonthName)
656LOCALE_FORMATTED_DAYNAME(standaloneDayName)
657
658ReturnedValue QQmlLocaleData::method_toString(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
659{
660 Scope scope(b);
661 const QLocale *locale = getThisLocale(scope, thisObject);
662 if (!locale)
663 return Encode::undefined();
664
665 if (argc == 0) {
666 // As a special (undocumented) case, when called with no arguments,
667 // just forward to QDebug. This makes it consistent with other types
668 // in JS that can be converted to a string via toString().
669 RETURN_RESULT(scope.engine->newString(QDebug::toString(*locale)));
670 }
671
672 if (argc > 3) {
674 "Locale: toString(): Expected 1-3 arguments, but received %1").arg(argc));
675 }
676
677 if (argv[0].isNumber()) {
678 if (argv[0].isInteger()) {
679 // toString(int)
680 RETURN_RESULT(scope.engine->newString(locale->toString(argv[0].toInt32())));
681 } else {
682 // toString(double[, char][, int])
683 const double number = argv[0].toNumber();
684 if (argc == 1)
685 RETURN_RESULT(scope.engine->newString(locale->toString(number)));
686
687 if (!argv[1].isString()) {
688 THROW_ERROR("Locale: the second argument to the toString overload "
689 "whose first argument is a double should be a char");
690 }
691 const char format = argv[1].toQString().at(0).toLatin1();
692
693 switch (argc) {
694 case 2:
695 RETURN_RESULT(scope.engine->newString(locale->toString(number, format)));
696 case 3:
697 if (!argv[2].isInteger()) {
698 THROW_ERROR("Locale: the third argument to the toString overload "
699 "whose first argument is a double should be an int");
700 }
701
702 const int precision = argv[2].toInt32();
703 RETURN_RESULT(scope.engine->newString(locale->toString(number, format, precision)));
704 }
705 }
706 } else if (const DateObject *dateObject = argv[0].as<DateObject>()) {
707 // toString(Date, string) or toString(Date[, FormatType])
708 if (argc > 2) {
710 "Locale: the toString() overload that takes a Date as its first "
711 "argument expects 1 or 2 arguments, but received %1").arg(argc));
712 }
713
714 if (argc == 2 && argv[1].isString()) {
715 RETURN_RESULT(scope.engine->newString(locale->toString(
716 dateObject->toQDateTime(), argv[1].toQString())));
717 }
718
719 if (argc == 2 && !argv[1].isNumber()) {
720 THROW_ERROR("Locale: the second argument to the toString overloads whose "
721 "first argument is a Date should be a string or FormatType");
722 }
723
724 const QLocale::FormatType format = argc == 2
725 ? QLocale::FormatType(argv[1].toNumber()) : QLocale::LongFormat;
726 RETURN_RESULT(scope.engine->newString(locale->toString(dateObject->toQDateTime(), format)));
727 }
728
729 THROW_ERROR("Locale: toString() expects either an int, double, or Date as its first argument");
730}
731
732#define LOCALE_STRING_PROPERTY(VARIABLE) \
733ReturnedValue QQmlLocaleData::method_get_ ## VARIABLE (const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int) \
734{ \
735 Scope scope(b); \
736 const QLocale *locale = getThisLocale(scope, thisObject); \
737 if (!locale) \
738 return Encode::undefined(); \
739 RETURN_RESULT(scope.engine->newString(locale-> VARIABLE()));\
740}
741
743LOCALE_STRING_PROPERTY(nativeLanguageName)
744#if QT_DEPRECATED_SINCE(6, 6)
746#endif
747LOCALE_STRING_PROPERTY(nativeTerritoryName)
748LOCALE_STRING_PROPERTY(decimalPoint)
749LOCALE_STRING_PROPERTY(groupSeparator)
751LOCALE_STRING_PROPERTY(zeroDigit)
752LOCALE_STRING_PROPERTY(negativeSign)
753LOCALE_STRING_PROPERTY(positiveSign)
754LOCALE_STRING_PROPERTY(exponential)
757
759{
760public:
763
765};
766
768{
769 QV4::Scope scope(engine);
771
772 o->defineDefaultProperty(QStringLiteral("dateFormat"), QQmlLocaleData::method_dateFormat, 0);
773 o->defineDefaultProperty(QStringLiteral("standaloneDayName"), QQmlLocaleData::method_standaloneDayName, 0);
774 o->defineDefaultProperty(QStringLiteral("standaloneMonthName"), QQmlLocaleData::method_standaloneMonthName, 0);
775 o->defineDefaultProperty(QStringLiteral("dayName"), QQmlLocaleData::method_dayName, 0);
776 o->defineDefaultProperty(QStringLiteral("timeFormat"), QQmlLocaleData::method_timeFormat, 0);
777 o->defineDefaultProperty(QStringLiteral("monthName"), QQmlLocaleData::method_monthName, 0);
778 o->defineDefaultProperty(QStringLiteral("toString"), QQmlLocaleData::method_toString, 0);
779 o->defineDefaultProperty(QStringLiteral("currencySymbol"), QQmlLocaleData::method_currencySymbol, 0);
780 o->defineDefaultProperty(QStringLiteral("dateTimeFormat"), QQmlLocaleData::method_dateTimeFormat, 0);
781 o->defineDefaultProperty(QStringLiteral("formattedDataSize"), QQmlLocaleData::method_get_formattedDataSize, 0);
782 o->defineAccessorProperty(QStringLiteral("name"), QQmlLocaleData::method_get_name, nullptr);
783 o->defineAccessorProperty(QStringLiteral("positiveSign"), QQmlLocaleData::method_get_positiveSign, nullptr);
784 o->defineAccessorProperty(QStringLiteral("uiLanguages"), QQmlLocaleData::method_get_uiLanguages, nullptr);
785 o->defineAccessorProperty(QStringLiteral("firstDayOfWeek"), QQmlLocaleData::method_get_firstDayOfWeek, nullptr);
786 o->defineAccessorProperty(QStringLiteral("pmText"), QQmlLocaleData::method_get_pmText, nullptr);
787 o->defineAccessorProperty(QStringLiteral("percent"), QQmlLocaleData::method_get_percent, nullptr);
788 o->defineAccessorProperty(QStringLiteral("textDirection"), QQmlLocaleData::method_get_textDirection, nullptr);
789 o->defineAccessorProperty(QStringLiteral("weekDays"), QQmlLocaleData::method_get_weekDays, nullptr);
790 o->defineAccessorProperty(QStringLiteral("negativeSign"), QQmlLocaleData::method_get_negativeSign, nullptr);
791 o->defineAccessorProperty(QStringLiteral("groupSeparator"), QQmlLocaleData::method_get_groupSeparator, nullptr);
792 o->defineAccessorProperty(QStringLiteral("decimalPoint"), QQmlLocaleData::method_get_decimalPoint, nullptr);
793 o->defineAccessorProperty(QStringLiteral("nativeLanguageName"), QQmlLocaleData::method_get_nativeLanguageName, nullptr);
794#if QT_DEPRECATED_SINCE(6, 6)
795 o->defineAccessorProperty(QStringLiteral("nativeCountryName"), QQmlLocaleData::method_get_nativeCountryName, nullptr);
796#endif
797 o->defineAccessorProperty(QStringLiteral("nativeTerritoryName"), QQmlLocaleData::method_get_nativeTerritoryName, nullptr);
798 o->defineAccessorProperty(QStringLiteral("zeroDigit"), QQmlLocaleData::method_get_zeroDigit, nullptr);
799 o->defineAccessorProperty(QStringLiteral("amText"), QQmlLocaleData::method_get_amText, nullptr);
800 o->defineAccessorProperty(QStringLiteral("measurementSystem"), QQmlLocaleData::method_get_measurementSystem, nullptr);
801 o->defineAccessorProperty(QStringLiteral("exponential"), QQmlLocaleData::method_get_exponential, nullptr);
803
804 prototype.set(engine, o);
805}
806
808{
809}
810
812
816
906{
907 QLocale qlocale;
908 if (!localeName.isEmpty())
909 qlocale = QLocale(localeName);
910 return wrap(engine, qlocale);
911}
912
914{
915 QV4::Scope scope(v4);
916 QV4LocaleDataDeletable *d = localeV4Data(scope.engine);
918 *wrapper->d()->locale = locale;
919 QV4::ScopedObject p(scope, d->prototype.value());
920 wrapper->setPrototypeOf(p);
921 return wrapper.asReturnedValue();
922}
923
925{
926 engine->stringPrototype()->defineDefaultProperty(QStringLiteral("localeCompare"), method_localeCompare);
927}
928
930{
931 if (argc != 1 || (!argv[0].isString() && !argv[0].as<StringObject>()))
932 return QV4::StringPrototype::method_localeCompare(b, thisObject, argv, argc);
933
934 if (!thisObject->isString() && !thisObject->as<StringObject>())
935 return QV4::StringPrototype::method_localeCompare(b, thisObject, argv, argc);
936
937 QString thisString = thisObject->toQStringNoThrow();
938 QString thatString = argv[0].toQStringNoThrow();
939
940 return QV4::Encode(QString::localeAwareCompare(thisString, thatString));
941}
942
1255
1256#include "moc_qqmllocale_p.cpp"
constexpr char16_t unicode() const noexcept
Returns the numeric Unicode value of the QChar.
Definition qchar.h:458
\inmodule QtCore\reentrant
Definition qdatetime.h:257
static QDateTime currentDateTime()
This is an overloaded member function, provided for convenience. It differs from the above function o...
void setTime(QTime time)
Sets the time part of this datetime to time.
QTime time() const
Returns the time part of the datetime.
QDate date() const
Returns the date part of the datetime.
\inmodule QtCore \reentrant
Definition qdatetime.h:27
QDateTime startOfDay(const QTimeZone &zone) const
QJSValue newObject()
Creates a JavaScript object of class Object.
Definition qlist.h:74
CurrencySymbolFormat
Definition qlocale.h:883
@ CurrencySymbol
Definition qlocale.h:885
@ LongFormat
Definition qlocale.h:865
@ DefaultNumberOptions
Definition qlocale.h:868
static void registerExtension(QV4::ExecutionEngine *engine)
static void registerExtension(QV4::ExecutionEngine *engine)
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5710
qsizetype size() const
Returns the number of characters in this string.
Definition qstring.h:182
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
Definition qstring.h:1079
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
int localeAwareCompare(const QString &s) const
Definition qstring.cpp:6649
\inmodule QtCore \reentrant
Definition qdatetime.h:189
bool isValid() const
Returns true if the time is valid; otherwise returns false.
QV4::PersistentValue prototype
QV4LocaleDataDeletable(QV4::ExecutionEngine *engine)
ObjectType::Data * allocate(Args &&... args)
Definition qv4mm_p.h:199
QDate date
[1]
Q_QML_PRIVATE_EXPORT void registerStringLocaleCompare(QV4::ExecutionEngine *engine)
Q_QML_PRIVATE_EXPORT QV4::ReturnedValue method_localeCompare(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
Q_QML_PRIVATE_EXPORT QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName)
Provides locale specific properties and formatted data.
Q_QML_PRIVATE_EXPORT QV4::ReturnedValue wrap(QV4::ExecutionEngine *engine, const QLocale &locale)
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
quint64 ReturnedValue
static const void * symbol()
#define QT_IGNORE_DEPRECATIONS(statement)
static bool isNumber(char s)
#define Q_QNAN
Definition qnumeric.h:81
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLboolean r
[2]
GLuint name
GLint GLsizei GLsizei GLenum format
GLuint GLfloat * val
GLuint64EXT * result
[6]
GLdouble s
[6]
Definition qopenglext.h:235
GLfloat GLfloat p
[1]
GLenum GLint GLint * precision
#define GET_LOCALE_DATA_RESOURCE(OBJECT)
#define LOCALE_FORMATTED_DAYNAME(VARIABLE)
#define LOCALE_FORMATTED_MONTHNAME(VARIABLE)
static bool isLocaleObject(const QV4::Value &val)
#define LOCALE_STRING_PROPERTY(VARIABLE)
#define LOCALE_FORMAT(FUNC)
#define THROW_ERROR(string)
SSL_CTX int(*) void arg)
static QT_BEGIN_NAMESPACE QAsn1Element wrap(quint8 type, const QAsn1Element &child)
#define QStringLiteral(str)
unsigned int quint32
Definition qtypes.h:45
unsigned short quint16
Definition qtypes.h:43
long long qint64
Definition qtypes.h:55
#define V4_DEFINE_EXTENSION(dataclass, datafunction)
Definition qv4engine_p.h:38
#define RETURN_UNDEFINED()
#define RETURN_RESULT(r)
#define DEFINE_OBJECT_VTABLE(classname)
QJSEngine engine
[0]
Q_QML_PRIVATE_EXPORT QDateTime toQDateTime() const
static ReturnedValue method_toLocaleDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static void timezoneUpdated(ExecutionEngine *e)
static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static constexpr ReturnedValue undefined()
MemoryManager * memoryManager
Heap::String * newString(const QString &s=QString())
ReturnedValue throwError(const Value &value)
Heap::ArrayObject * newArrayObject(int count=0)
static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static QV4::ReturnedValue method_get_textDirection(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_decimalPoint(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_currencySymbol(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_dayName(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_zeroDigit(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_nativeLanguageName(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_amText(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_standaloneMonthName(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_monthName(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_dateFormat(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_negativeSign(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_measurementSystem(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_standaloneDayName(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_dateTimeFormat(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_groupSeparator(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_firstDayOfWeek(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_toString(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_formattedDataSize(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_exponential(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_timeFormat(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_uiLanguages(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_pmText(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_set_numberOptions(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_positiveSign(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_weekDays(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_numberOptions(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static V4_NEEDS_DESTROY QLocale * getThisLocale(QV4::Scope &scope, const QV4::Value *thisObject)
static QV4::ReturnedValue method_get_percent(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_nativeTerritoryName(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
static QV4::ReturnedValue method_get_name(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
ExecutionEngine * engine
bool isNumber() const
bool isInteger() const
static ReturnedValue method_localeCompare(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static constexpr Value fromInt32(int i)
Definition qv4value_p.h:187
bool isString() const
Definition qv4value_p.h:284
int toInt32() const
Definition qv4value_p.h:350
unsigned int toUInt32() const
Definition qv4value_p.h:361
double toNumber() const
Definition qv4value_p.h:320
const T * as() const
Definition qv4value_p.h:132
QString toQString() const
Definition qv4value.cpp:158
QString toQStringNoThrow() const
Definition qv4value.cpp:122
double toInteger() const
Definition qv4value_p.h:391
void wrapper()