Android: use BCP 47 tag to create a correct Locale for QTimeZone::displayName()
Before the patch we tried to create a java Locale object by passing the human-readable language, territory and variant strings. However, the Locale constructor accepts ISO-defined codes. Fix it by using a factory method Locale.forLanguageTag() [0] that constructs a Java Locale object based on BCP 47 tag. [0]: https://developer.android.com/reference/java/util/Locale#forLanguageTag(java.lang.String) Fixes: QTBUG-101460 Change-Id: If414c66cf0e5b7e8299ffc3a6038b6f9eb79d5ec Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> (cherry picked from commit 44f3fe1cf4e2319e012207eba3afe7adfe09cad6)
This commit is contained in:
parent
4cb27786be
commit
a2704c3421
@ -88,17 +88,10 @@ QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate()
|
|||||||
static QString getDisplayName(QJniObject zone, jint style, jboolean dst,
|
static QString getDisplayName(QJniObject zone, jint style, jboolean dst,
|
||||||
const QLocale &locale)
|
const QLocale &locale)
|
||||||
{
|
{
|
||||||
QJniObject jlanguage
|
QJniObject jbcpTag = QJniObject::fromString(locale.bcp47Name());
|
||||||
= QJniObject::fromString(QLocale::languageToString(locale.language()));
|
QJniObject jlocale = QJniObject::callStaticObjectMethod(
|
||||||
QJniObject jterritory
|
"java/util/Locale", "forLanguageTag", "(Ljava/lang/String;)Ljava/util/Locale;",
|
||||||
= QJniObject::fromString(QLocale::territoryToString(locale.territory()));
|
jbcpTag.object<jstring>());
|
||||||
QJniObject
|
|
||||||
jvariant = QJniObject::fromString(QLocale::scriptToString(locale.script()));
|
|
||||||
QJniObject jlocale("java.util.Locale",
|
|
||||||
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
|
|
||||||
jlanguage.object<jstring>(),
|
|
||||||
jterritory.object<jstring>(),
|
|
||||||
jvariant.object<jstring>());
|
|
||||||
|
|
||||||
return zone.callObjectMethod("getDisplayName",
|
return zone.callObjectMethod("getDisplayName",
|
||||||
"(ZILjava/util/Locale;)Ljava/lang/String;",
|
"(ZILjava/util/Locale;)Ljava/lang/String;",
|
||||||
|
@ -75,6 +75,8 @@ private Q_SLOTS:
|
|||||||
void macTest();
|
void macTest();
|
||||||
void darwinTypes();
|
void darwinTypes();
|
||||||
void winTest();
|
void winTest();
|
||||||
|
void localeSpecificDisplayName_data();
|
||||||
|
void localeSpecificDisplayName();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void printTimeZone(const QTimeZone &tz);
|
void printTimeZone(const QTimeZone &tz);
|
||||||
@ -1450,6 +1452,55 @@ void tst_QTimeZone::winTest()
|
|||||||
#endif // QT_BUILD_INTERNAL && USING_WIN_TZ
|
#endif // QT_BUILD_INTERNAL && USING_WIN_TZ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QTimeZone::localeSpecificDisplayName_data()
|
||||||
|
{
|
||||||
|
#ifdef USING_WIN_TZ
|
||||||
|
QSKIP("MS backend does not use locale parameter");
|
||||||
|
#endif
|
||||||
|
QTest::addColumn<QByteArray>("zoneName");
|
||||||
|
QTest::addColumn<QLocale>("locale");
|
||||||
|
QTest::addColumn<QTimeZone::TimeType>("timeType");
|
||||||
|
QTest::addColumn<QString>("expectedName");
|
||||||
|
|
||||||
|
QStringList names;
|
||||||
|
QLocale locale;
|
||||||
|
// Pick a non-system locale; German or French
|
||||||
|
if (QLocale::system().language() != QLocale::German) {
|
||||||
|
locale = QLocale(QLocale::German);
|
||||||
|
names << QString("Mitteleurop\u00e4ische Normalzeit")
|
||||||
|
<< QString("Mitteleurop\u00e4ische Sommerzeit");
|
||||||
|
} else {
|
||||||
|
locale = QLocale(QLocale::French);
|
||||||
|
names << QString("heure normale d\u2019Europe centrale")
|
||||||
|
<< QString("heure d\u2019\u00E9t\u00E9 d\u2019Europe centrale");
|
||||||
|
}
|
||||||
|
|
||||||
|
qsizetype index = 0;
|
||||||
|
QTest::newRow("Berlin, standard time")
|
||||||
|
<< QByteArray("Europe/Berlin") << locale << QTimeZone::StandardTime
|
||||||
|
<< names.at(index++);
|
||||||
|
|
||||||
|
QTest::newRow("Berlin, summer time")
|
||||||
|
<< QByteArray("Europe/Berlin") << locale << QTimeZone::DaylightTime
|
||||||
|
<< names.at(index++);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QTimeZone::localeSpecificDisplayName()
|
||||||
|
{
|
||||||
|
// This test checks that QTimeZone::displayName() correctly uses the
|
||||||
|
// specified locale, NOT the system locale (see QTBUG-101460).
|
||||||
|
QFETCH(QByteArray, zoneName);
|
||||||
|
QFETCH(QLocale, locale);
|
||||||
|
QFETCH(QTimeZone::TimeType, timeType);
|
||||||
|
QFETCH(QString, expectedName);
|
||||||
|
|
||||||
|
QTimeZone zone(zoneName);
|
||||||
|
QVERIFY(zone.isValid());
|
||||||
|
|
||||||
|
const QString localeName = zone.displayName(timeType, QTimeZone::LongName, locale);
|
||||||
|
QCOMPARE(localeName, expectedName);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef QT_BUILD_INTERNAL
|
#ifdef QT_BUILD_INTERNAL
|
||||||
// Test each private produces the same basic results for CET
|
// Test each private produces the same basic results for CET
|
||||||
void tst_QTimeZone::testCetPrivate(const QTimeZonePrivate &tzp)
|
void tst_QTimeZone::testCetPrivate(const QTimeZonePrivate &tzp)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user