Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qandroidsystemlocale.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 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 "androidjnimain.h"
6#include "qdatetime.h"
7#include "qstringlist.h"
8#include "qvariant.h"
9
10#include <QtCore/private/qjnihelpers_p.h>
11#include <QtCore/QJniObject>
12
14
16{
17}
18
19void QAndroidSystemLocale::getLocaleFromJava() const
20{
21 QWriteLocker locker(&m_lock);
22
23 QJniObject javaLocaleObject;
24 QJniObject javaActivity(QtAndroid::activity());
25 if (!javaActivity.isValid())
26 javaActivity = QtAndroid::service();
27 if (javaActivity.isValid()) {
28 QJniObject resources = javaActivity.callObjectMethod("getResources", "()Landroid/content/res/Resources;");
29 QJniObject configuration = resources.callObjectMethod("getConfiguration", "()Landroid/content/res/Configuration;");
30
31 javaLocaleObject = configuration.getObjectField("locale", "Ljava/util/Locale;");
32 } else {
33 javaLocaleObject = QJniObject::callStaticObjectMethod("java/util/Locale", "getDefault", "()Ljava/util/Locale;");
34 }
35
36 QString languageCode = javaLocaleObject.callObjectMethod("getLanguage", "()Ljava/lang/String;").toString();
37 QString countryCode = javaLocaleObject.callObjectMethod("getCountry", "()Ljava/lang/String;").toString();
38
39 m_locale = QLocale(languageCode + u'_' + countryCode);
40}
41
43{
44 if (type == LocaleChanged) {
45 getLocaleFromJava();
46 return QVariant();
47 }
48
49 QReadLocker locker(&m_lock);
50
51 switch (type) {
52 case DecimalPoint:
53 return m_locale.decimalPoint();
54 case GroupSeparator:
55 return m_locale.groupSeparator();
56 case ZeroDigit:
57 return m_locale.zeroDigit();
58 case NegativeSign:
59 return m_locale.negativeSign();
60 case DateFormatLong:
61 return m_locale.dateFormat(QLocale::LongFormat);
62 case DateFormatShort:
63 return m_locale.dateFormat(QLocale::ShortFormat);
64 case TimeFormatLong:
65 return m_locale.timeFormat(QLocale::LongFormat);
66 case TimeFormatShort:
67 return m_locale.timeFormat(QLocale::ShortFormat);
68 case DayNameLong:
69 return m_locale.dayName(in.toInt(), QLocale::LongFormat);
70 case DayNameShort:
71 return m_locale.dayName(in.toInt(), QLocale::ShortFormat);
72 case DayNameNarrow:
73 return m_locale.dayName(in.toInt(), QLocale::NarrowFormat);
75 return m_locale.standaloneDayName(in.toInt(), QLocale::LongFormat);
77 return m_locale.standaloneDayName(in.toInt(), QLocale::ShortFormat);
79 return m_locale.standaloneDayName(in.toInt(), QLocale::NarrowFormat);
80 case MonthNameLong:
81 return m_locale.monthName(in.toInt(), QLocale::LongFormat);
82 case MonthNameShort:
83 return m_locale.monthName(in.toInt(), QLocale::ShortFormat);
84 case MonthNameNarrow:
85 return m_locale.monthName(in.toInt(), QLocale::NarrowFormat);
87 return m_locale.standaloneMonthName(in.toInt(), QLocale::LongFormat);
89 return m_locale.standaloneMonthName(in.toInt(), QLocale::ShortFormat);
91 return m_locale.standaloneMonthName(in.toInt(), QLocale::NarrowFormat);
93 return m_locale.toString(in.toDate(), QLocale::LongFormat);
95 return m_locale.toString(in.toDate(), QLocale::ShortFormat);
97 return m_locale.toString(in.toTime(), QLocale::LongFormat);
99 return m_locale.toString(in.toTime(), QLocale::ShortFormat);
101 return m_locale.dateTimeFormat(QLocale::LongFormat);
103 return m_locale.dateTimeFormat(QLocale::ShortFormat);
105 return m_locale.toString(in.toDateTime(), QLocale::LongFormat);
107 return m_locale.toString(in.toDateTime(), QLocale::ShortFormat);
108 case PositiveSign:
109 return m_locale.positiveSign();
110 case AMText:
111 return m_locale.amText();
112 case PMText:
113 return m_locale.pmText();
114 case FirstDayOfWeek:
115 return m_locale.firstDayOfWeek();
116 case CurrencySymbol:
117 return m_locale .currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
118 case CurrencyToString: {
119 switch (in.metaType().id()) {
120 case QMetaType::Int:
121 return m_locale .toCurrencyString(in.toInt());
122 case QMetaType::UInt:
123 return m_locale .toCurrencyString(in.toUInt());
124 case QMetaType::Double:
125 return m_locale .toCurrencyString(in.toDouble());
126 case QMetaType::LongLong:
127 return m_locale .toCurrencyString(in.toLongLong());
128 case QMetaType::ULongLong:
129 return m_locale .toCurrencyString(in.toULongLong());
130 default:
131 break;
132 }
133 return QString();
134 }
136 return m_locale.quoteString(in.value<QStringView>());
138 return m_locale.quoteString(in.value<QStringView>(), QLocale::AlternateQuotation);
140 return m_locale.createSeparatedList(in.value<QStringList>());
141 case LocaleChanged:
142 Q_ASSERT_X(false, Q_FUNC_INFO, "This can't happen.");
143 case UILanguages: {
145 QJniObject localeListObject =
146 QJniObject::callStaticObjectMethod("android/os/LocaleList", "getDefault",
147 "()Landroid/os/LocaleList;");
148 if (localeListObject.isValid()) {
149 QString lang = localeListObject.callObjectMethod("toLanguageTags",
150 "()Ljava/lang/String;").toString();
151 // Some devices return with it enclosed in []'s so check if both exists before
152 // removing to ensure it is formatted correctly
153 if (lang.startsWith(QChar('[')) && lang.endsWith(QChar(']')))
154 lang = lang.mid(1, lang.length() - 2);
155 return lang.split(QChar(','));
156 }
157 }
158 return QVariant();
159 }
160 default:
161 break;
162 }
163 return QVariant();
164}
165
167{
168 QReadLocker locker(&m_lock);
169 return m_locale;
170}
171
QLocale fallbackLocale() const override
QVariant query(QueryType type, QVariant in) const override
\inmodule QtCore
Definition qchar.h:48
\inmodule QtCore
QString decimalPoint() const
Definition qlocale.cpp:2535
QString quoteString(const QString &str, QuotationStyle style=StandardQuotation) const
Definition qlocale.h:1117
QString dateTimeFormat(FormatType format=LongFormat) const
Definition qlocale.cpp:2306
QString zeroDigit() const
Definition qlocale.cpp:2590
QString dateFormat(FormatType format=LongFormat) const
Definition qlocale.cpp:2244
QString negativeSign() const
Definition qlocale.cpp:2607
Qt::DayOfWeek firstDayOfWeek() const
Definition qlocale.cpp:3132
@ AlternateQuotation
Definition qlocale.h:1116
QString dayName(int, FormatType format=LongFormat) const
Definition qlocale.cpp:2867
CurrencySymbolFormat
Definition qlocale.h:883
@ LongFormat
Definition qlocale.h:865
@ NarrowFormat
Definition qlocale.h:865
@ ShortFormat
Definition qlocale.h:865
QString toCurrencyString(qlonglong, const QString &symbol=QString()) const
Definition qlocale.cpp:4418
QString timeFormat(FormatType format=LongFormat) const
Definition qlocale.cpp:2275
QString groupSeparator() const
Definition qlocale.cpp:2554
QString createSeparatedList(const QStringList &strl) const
Definition qlocale.cpp:1208
QString monthName(int, FormatType format=LongFormat) const
Definition qlocale.cpp:2833
QString amText() const
Definition qlocale.cpp:3299
QString pmText() const
Definition qlocale.cpp:3319
QString positiveSign() const
Definition qlocale.cpp:2624
QString toString(qlonglong i) const
Returns a localized string representation of i.
Definition qlocale.cpp:1962
QString standaloneMonthName(int, FormatType format=LongFormat) const
Definition qlocale.cpp:2849
QString standaloneDayName(int, FormatType format=LongFormat) const
Definition qlocale.cpp:2884
QString currencySymbol(CurrencySymbolFormat=CurrencySymbol) const
Definition qlocale.cpp:4386
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5299
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
Definition qstring.cpp:7956
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
Definition qstring.cpp:5204
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5350
qsizetype length() const
Returns the number of characters in this string.
Definition qstring.h:187
@ StringToAlternateQuotation
Definition qlocale_p.h:147
@ DateTimeToStringShort
Definition qlocale_p.h:135
@ StandaloneMonthNameLong
Definition qlocale_p.h:153
@ ListToSeparatedString
Definition qlocale_p.h:149
@ StandaloneDayNameNarrow
Definition qlocale_p.h:158
@ StandaloneMonthNameNarrow
Definition qlocale_p.h:155
@ StringToStandardQuotation
Definition qlocale_p.h:146
@ StandaloneDayNameShort
Definition qlocale_p.h:157
@ StandaloneDayNameLong
Definition qlocale_p.h:156
@ StandaloneMonthNameShort
Definition qlocale_p.h:154
\inmodule QtCore
Definition qvariant.h:64
\inmodule QtCore
Combined button and popup list for selecting options.
Q_CORE_EXPORT jint androidSdkVersion()
QtJniTypes::Activity activity()
QtJniTypes::Service service()
#define Q_FUNC_INFO
GLenum type
GLuint in
#define Q_ASSERT_X(cond, x, msg)
Definition qrandom.cpp:48