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) {
|
||||
// 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
|
||||
namesSuper[INDEX_TZID] = id;
|
||||
|
||||
|
@ -91,7 +91,7 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
|||
case "":
|
||||
// Fill in empty elements
|
||||
deriveFallbackName(namesSuper, i, locale,
|
||||
!TimeZone.getTimeZone(id).useDaylightTime());
|
||||
TimeZone.getTimeZone(id).toZoneId().getRules().isFixedOffset());
|
||||
break;
|
||||
case 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
|
||||
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++) {
|
||||
deriveFallbackName(names, i, locale, noDST);
|
||||
|
@ -149,13 +149,12 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
|||
return;
|
||||
}
|
||||
|
||||
// Check parent locale first
|
||||
// Check parent locales first
|
||||
if (!exists(names, index)) {
|
||||
CLDRLocaleProviderAdapter clpa = (CLDRLocaleProviderAdapter)LocaleProviderAdapter.forType(Type.CLDR);
|
||||
var cands = clpa.getCandidateLocales("", locale);
|
||||
if (cands.size() > 1) {
|
||||
var parentLoc = cands.get(1); // immediate parent locale
|
||||
String[] parentNames = super.getDisplayNameArray(id, parentLoc);
|
||||
for (int i = 1; i < cands.size() ; i++) {
|
||||
String[] parentNames = super.getDisplayNameArray(id, cands.get(i));
|
||||
if (parentNames != null && !parentNames[index].isEmpty()) {
|
||||
names[index] = parentNames[index];
|
||||
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
|
||||
if (regionFormatFallback(names, index, locale)) {
|
||||
return;
|
||||
|
@ -189,6 +172,19 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
|||
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
|
||||
names[index] = toGMTFormat(id,
|
||||
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