Skip to content
Permalink
Browse files
8275721: Name of UTC timezone in a locale changes depending on previo…
…us code

Reviewed-by: joehw
  • Loading branch information
naotoj committed Dec 7, 2021
1 parent bd7c54a commit 543d1a8cf41d32dca161c9d8041f133a71bf0ecb
Showing 2 changed files with 91 additions and 23 deletions.
@@ -82,7 +82,7 @@ protected String[] getDisplayNameArray(String id, Locale locale) {
}

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 @@ protected String[] getDisplayNameArray(String id, Locale locale) {
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 @@ protected String[][] getZoneStrings(Locale locale) {

// 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,36 +149,19 @@ private void deriveFallbackName(String[] names, int index, Locale locale, boolea
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;
}
}
}

// 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 @@ private void deriveFallbackName(String[] names, int index, Locale locale, boolea
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));
}
}

1 comment on commit 543d1a8

@openjdk-notifier
Copy link

@openjdk-notifier openjdk-notifier bot commented on 543d1a8 Dec 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.