mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue