8275721: Name of UTC timezone in a locale changes depending on previous code

Reviewed-by: joehw
This commit is contained in:
Naoto Sato 2021-12-07 16:44:52 +00:00
parent bd7c54aee8
commit 543d1a8cf4
2 changed files with 91 additions and 23 deletions

View file

@ -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,