mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
8275721: Name of UTC timezone in a locale changes depending on previous code
Reviewed-by: joehw
This commit is contained in:
parent
bd7c54aee8
commit
543d1a8cf4
2 changed files with 91 additions and 23 deletions
|
@ -82,7 +82,7 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (namesSuper != null) {
|
if (namesSuper != null) {
|
||||||
// CLDR's resource bundle has an translated entry for this id.
|
// CLDR's resource bundle has a translated entry for this id.
|
||||||
// Fix up names if needed, either missing or no-inheritance
|
// Fix up names if needed, either missing or no-inheritance
|
||||||
namesSuper[INDEX_TZID] = id;
|
namesSuper[INDEX_TZID] = id;
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||||
case "":
|
case "":
|
||||||
// Fill in empty elements
|
// Fill in empty elements
|
||||||
deriveFallbackName(namesSuper, i, locale,
|
deriveFallbackName(namesSuper, i, locale,
|
||||||
!TimeZone.getTimeZone(id).useDaylightTime());
|
TimeZone.getTimeZone(id).toZoneId().getRules().isFixedOffset());
|
||||||
break;
|
break;
|
||||||
case NO_INHERITANCE_MARKER:
|
case NO_INHERITANCE_MARKER:
|
||||||
// CLDR's "no inheritance marker"
|
// CLDR's "no inheritance marker"
|
||||||
|
@ -129,7 +129,7 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||||
|
|
||||||
// Derive fallback time zone name according to LDML's logic
|
// Derive fallback time zone name according to LDML's logic
|
||||||
private void deriveFallbackNames(String[] names, Locale locale) {
|
private void deriveFallbackNames(String[] names, Locale locale) {
|
||||||
boolean noDST = !TimeZone.getTimeZone(names[0]).useDaylightTime();
|
boolean noDST = TimeZone.getTimeZone(names[0]).toZoneId().getRules().isFixedOffset();
|
||||||
|
|
||||||
for (int i = INDEX_STD_LONG; i <= INDEX_GEN_SHORT; i++) {
|
for (int i = INDEX_STD_LONG; i <= INDEX_GEN_SHORT; i++) {
|
||||||
deriveFallbackName(names, i, locale, noDST);
|
deriveFallbackName(names, i, locale, noDST);
|
||||||
|
@ -149,13 +149,12 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check parent locale first
|
// Check parent locales first
|
||||||
if (!exists(names, index)) {
|
if (!exists(names, index)) {
|
||||||
CLDRLocaleProviderAdapter clpa = (CLDRLocaleProviderAdapter)LocaleProviderAdapter.forType(Type.CLDR);
|
CLDRLocaleProviderAdapter clpa = (CLDRLocaleProviderAdapter)LocaleProviderAdapter.forType(Type.CLDR);
|
||||||
var cands = clpa.getCandidateLocales("", locale);
|
var cands = clpa.getCandidateLocales("", locale);
|
||||||
if (cands.size() > 1) {
|
for (int i = 1; i < cands.size() ; i++) {
|
||||||
var parentLoc = cands.get(1); // immediate parent locale
|
String[] parentNames = super.getDisplayNameArray(id, cands.get(i));
|
||||||
String[] parentNames = super.getDisplayNameArray(id, parentLoc);
|
|
||||||
if (parentNames != null && !parentNames[index].isEmpty()) {
|
if (parentNames != null && !parentNames[index].isEmpty()) {
|
||||||
names[index] = parentNames[index];
|
names[index] = parentNames[index];
|
||||||
return;
|
return;
|
||||||
|
@ -163,22 +162,6 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if COMPAT can substitute the name
|
|
||||||
if (LocaleProviderAdapter.getAdapterPreference().contains(Type.JRE)) {
|
|
||||||
String[] compatNames = (String[])LocaleProviderAdapter.forJRE()
|
|
||||||
.getLocaleResources(mapChineseLocale(locale))
|
|
||||||
.getTimeZoneNames(id);
|
|
||||||
if (compatNames != null) {
|
|
||||||
for (int i = INDEX_STD_LONG; i <= INDEX_GEN_SHORT; i++) {
|
|
||||||
// Assumes COMPAT has no empty slots
|
|
||||||
if (i == index || !exists(names, i)) {
|
|
||||||
names[i] = compatNames[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Region Fallback
|
// Region Fallback
|
||||||
if (regionFormatFallback(names, index, locale)) {
|
if (regionFormatFallback(names, index, locale)) {
|
||||||
return;
|
return;
|
||||||
|
@ -189,6 +172,19 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if COMPAT can substitute the name
|
||||||
|
if (!exists(names, index) &&
|
||||||
|
LocaleProviderAdapter.getAdapterPreference().contains(Type.JRE)) {
|
||||||
|
String[] compatNames = (String[])LocaleProviderAdapter.forJRE()
|
||||||
|
.getLocaleResources(mapChineseLocale(locale))
|
||||||
|
.getTimeZoneNames(id);
|
||||||
|
if (compatNames != null) {
|
||||||
|
// Assumes COMPAT has no empty slots
|
||||||
|
names[index] = compatNames[index];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// last resort
|
// last resort
|
||||||
names[index] = toGMTFormat(id,
|
names[index] = toGMTFormat(id,
|
||||||
index == INDEX_DST_LONG || index == INDEX_DST_SHORT,
|
index == INDEX_DST_LONG || index == INDEX_DST_SHORT,
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8275721
|
||||||
|
* @modules jdk.localedata
|
||||||
|
* @summary Checks Chinese time zone names for `UTC` using CLDR are consistent
|
||||||
|
* @run testng/othervm -Djava.locale.providers=CLDR,COMPAT ChineseTimeZoneNameTest
|
||||||
|
* @run testng/othervm -Djava.locale.providers=CLDR ChineseTimeZoneNameTest
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import org.testng.annotations.DataProvider;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public class ChineseTimeZoneNameTest {
|
||||||
|
|
||||||
|
private static final Locale SIMPLIFIED_CHINESE = Locale.forLanguageTag("zh-Hans");
|
||||||
|
private static final Locale TRADITIONAL_CHINESE = Locale.forLanguageTag("zh-Hant");
|
||||||
|
private static final ZonedDateTime EPOCH_UTC =
|
||||||
|
ZonedDateTime.ofInstant(Instant.ofEpochSecond (0), ZoneId.of ("UTC"));
|
||||||
|
|
||||||
|
@DataProvider(name="locales")
|
||||||
|
Object[][] data() {
|
||||||
|
return new Object[][] {
|
||||||
|
{Locale.CHINESE, SIMPLIFIED_CHINESE},
|
||||||
|
{Locale.SIMPLIFIED_CHINESE, SIMPLIFIED_CHINESE},
|
||||||
|
{Locale.forLanguageTag("zh-SG"), SIMPLIFIED_CHINESE},
|
||||||
|
{Locale.forLanguageTag("zh-Hans-TW"), SIMPLIFIED_CHINESE},
|
||||||
|
{Locale.forLanguageTag("zh-HK"), TRADITIONAL_CHINESE},
|
||||||
|
{Locale.forLanguageTag("zh-MO"), TRADITIONAL_CHINESE},
|
||||||
|
{Locale.TRADITIONAL_CHINESE, TRADITIONAL_CHINESE},
|
||||||
|
{Locale.forLanguageTag("zh-Hant-CN"), TRADITIONAL_CHINESE},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dataProvider="locales")
|
||||||
|
public void test_ChineseTimeZoneNames(Locale testLoc, Locale resourceLoc) {
|
||||||
|
assertEquals(DateTimeFormatter.ofPattern("z", testLoc).format(EPOCH_UTC),
|
||||||
|
DateTimeFormatter.ofPattern("z", resourceLoc).format(EPOCH_UTC));
|
||||||
|
assertEquals(DateTimeFormatter.ofPattern("zzzz", testLoc).format(EPOCH_UTC),
|
||||||
|
DateTimeFormatter.ofPattern("zzzz", resourceLoc).format(EPOCH_UTC));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue