--- old/make/tools/src/build/tools/cldrconverter/Bundle.java 2012-12-03 11:41:07.000000000 +0900 +++ new/make/tools/src/build/tools/cldrconverter/Bundle.java 2012-12-03 11:41:06.000000000 +0900 @@ -29,6 +29,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -86,7 +87,23 @@ private final static String[] ERA_KEYS = { "long.Eras", "Eras", - "short.Eras" + "narrow.Eras" + }; + + // Keys for individual time zone names + private final static String TZ_GEN_LONG_KEY = "timezone.displayname.generic.long"; + private final static String TZ_GEN_SHORT_KEY = "timezone.displayname.generic.short"; + private final static String TZ_STD_LONG_KEY = "timezone.displayname.standard.long"; + private final static String TZ_STD_SHORT_KEY = "timezone.displayname.standard.short"; + private final static String TZ_DST_LONG_KEY = "timezone.displayname.daylight.long"; + private final static String TZ_DST_SHORT_KEY = "timezone.displayname.daylight.short"; + private final static String[] ZONE_NAME_KEYS = { + TZ_STD_LONG_KEY, + TZ_STD_SHORT_KEY, + TZ_DST_LONG_KEY, + TZ_DST_SHORT_KEY, + TZ_GEN_LONG_KEY, + TZ_GEN_SHORT_KEY }; private final String id; @@ -98,6 +115,7 @@ return bundles.get(id); } + @SuppressWarnings("ConvertToStringSwitch") Bundle(String id, String cldrPath, String bundles, String currencies) { this.id = id; this.cldrPath = cldrPath; @@ -242,9 +260,12 @@ // handle multiple inheritance for month and day names handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNames"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthAbbreviations"); + handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNarrows"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNames"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayAbbreviations"); + handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNarrows"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "AmPmMarkers"); + handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "narrow.AmPmMarkers"); adjustEraNames(myMap, calendarType); @@ -253,6 +274,99 @@ handleDateTimeFormatPatterns(DATETIME_PATTERN_KEYS, myMap, parentsMap, calendarType, "DateTimePatterns"); } + // if myMap has any empty timezone or metazone names, weed out them. + // Fill in any missing abbreviations if locale is "en". + for (Iterator it = myMap.keySet().iterator(); it.hasNext();) { + String key = it.next(); + if (key.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX) + || key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) { + @SuppressWarnings("unchecked") + Map nameMap = (Map) myMap.get(key); + if (nameMap.isEmpty()) { + // Some zones have only exemplarCity, which become empty. + // Remove those from the map. + it.remove(); + continue; + } + + if (id.startsWith("en")) { + fillInAbbrs(key, nameMap); + } + } + } + for (Iterator it = myMap.keySet().iterator(); it.hasNext();) { + String key = it.next(); + if (key.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX) + || key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) { + @SuppressWarnings("unchecked") + Map nameMap = (Map) myMap.get(key); + // Convert key/value paris to an array. + String[] names = new String[ZONE_NAME_KEYS.length]; + int ix = 0; + for (String nameKey : ZONE_NAME_KEYS) { + String name = nameMap.get(nameKey); + if (name == null) { + @SuppressWarnings("unchecked") + Map parentNames = (Map) parentsMap.get(key); + if (parentNames != null) { + name = parentNames.get(nameKey); + } + } + names[ix++] = name; + } + if (hasNulls(names)) { + String metaKey = toMetaZoneKey(key); + if (metaKey != null) { + Object obj = myMap.get(metaKey); + if (obj instanceof String[]) { + String[] metaNames = (String[]) obj; + for (int i = 0; i < names.length; i++) { + if (names[i] == null) { + names[i] = metaNames[i]; + } + } + } else if (obj instanceof Map) { + @SuppressWarnings("unchecked") + Map m = (Map) obj; + for (int i = 0; i < names.length; i++) { + if (names[i] == null) { + names[i] = m.get(ZONE_NAME_KEYS[i]); + } + } + } + } + // If there are still any nulls, try filling in them from en data. + if (hasNulls(names) && !id.equals("en")) { + @SuppressWarnings("unchecked") + String[] enNames = (String[]) Bundle.getBundle("en").getTargetMap().get(key); + if (enNames == null) { + if (metaKey != null) { + @SuppressWarnings("unchecked") + String[] metaNames = (String[]) Bundle.getBundle("en").getTargetMap().get(metaKey); + enNames = metaNames; + } + } + if (enNames != null) { + for (int i = 0; i < names.length; i++) { + if (names[i] == null) { + names[i] = enNames[i]; + } + } + } + // If there are still nulls, give up names. + if (hasNulls(names)) { + names = null; + } + } + } + // replace the Map with the array + if (names != null) { + myMap.put(key, names); + } else { + it.remove(); + } + } + } return myMap; } @@ -352,20 +466,10 @@ realKeys[index] = realKey; eraNames[index++] = value; } - if (eraNames[0] != null) { - if (eraNames[1] != null) { - if (eraNames[2] == null) { - // Eras -> short.Eras - // long.Eras -> Eras - map.put(realKeys[2], map.get(realKeys[1])); - map.put(realKeys[1], map.get(realKeys[0])); - } - } else { - // long.Eras -> Eras - map.put(realKeys[1], map.get(realKeys[0])); + for (int i = 0; i < eraNames.length; i++) { + if (eraNames[i] == null) { + map.put(realKeys[i], null); } - // remove long.Eras - map.remove(realKeys[0]); } } @@ -473,6 +577,86 @@ return jrePattern.toString(); } + private String toMetaZoneKey(String tzKey) { + if (tzKey.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)) { + String tz = tzKey.substring(CLDRConverter.TIMEZONE_ID_PREFIX.length()); + String meta = CLDRConverter.handlerMetaZones.get(tz); + if (meta != null) { + return CLDRConverter.METAZONE_ID_PREFIX + meta; + } + } + return null; + } + + private void fillInAbbrs(String key, Map map) { + fillInAbbrs(TZ_STD_LONG_KEY, TZ_STD_SHORT_KEY, map); + fillInAbbrs(TZ_DST_LONG_KEY, TZ_DST_SHORT_KEY, map); + fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map); + + // If the standard std is "Standard Time" and daylight std is "Summer Time", + // replace the standard std with the generic std to avoid using + // the same abbrivation except for Australia time zone names. + String std = map.get(TZ_STD_SHORT_KEY); + String dst = map.get(TZ_DST_SHORT_KEY); + String gen = map.get(TZ_GEN_SHORT_KEY); + if (std != null) { + if (dst == null) { + // if dst is null, create long and short names from the standard + // std. ("Something Standard Time" to "Something Daylight Time", + // or "Someting Time" to "Something Summer Time") + String name = map.get(TZ_STD_LONG_KEY); + if (name != null) { + if (name.contains("Standard Time")) { + name = name.replace("Standard Time", "Daylight Time"); + } else if (name.endsWith("Mean Time")) { + name = name.replace("Mean Time", "Summer Time"); + } else if (name.endsWith(" Time")) { + name = name.replace(" Time", " Summer Time"); + } + map.put(TZ_DST_LONG_KEY, name); + fillInAbbrs(TZ_DST_LONG_KEY, TZ_DST_SHORT_KEY, map); + } + } + if (gen == null) { + String name = map.get(TZ_STD_LONG_KEY); + if (name != null) { + if (name.endsWith("Standard Time")) { + name = name.replace("Standard Time", "Time"); + } else if (name.endsWith("Mean Time")) { + name = name.replace("Mean Time", "Time"); + } + map.put(TZ_GEN_LONG_KEY, name); + fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map); + } + } + } + } + + private void fillInAbbrs(String longKey, String shortKey, Map map) { + String abbr = map.get(shortKey); + if (abbr == null) { + String name = map.get(longKey); + if (name != null) { + abbr = toAbbr(name); + if (abbr != null) { + map.put(shortKey, abbr); + } + } + } + } + + private String toAbbr(String name) { + String[] substrs = name.split("\\s+"); + StringBuilder sb = new StringBuilder(); + for (String s : substrs) { + char c = s.charAt(0); + if (c >= 'A' && c <= 'Z') { + sb.append(c); + } + } + return sb.length() > 0 ? sb.toString() : null; + } + private void convert(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb) { switch (cldrLetter) { case 'G': @@ -539,4 +723,13 @@ sb.append(c); } } + + private static boolean hasNulls(Object[] array) { + for (int i = 0; i < array.length; i++) { + if (array[i] == null) { + return true; + } + } + return false; + } } --- old/make/tools/src/build/tools/cldrconverter/BundleGenerator.java 2012-12-03 11:41:09.000000000 +0900 +++ new/make/tools/src/build/tools/cldrconverter/BundleGenerator.java 2012-12-03 11:41:09.000000000 +0900 @@ -30,8 +30,27 @@ import java.util.SortedSet; public interface BundleGenerator { + static enum BundleType { + PLAIN("java.util.ListResourceBundle"), + OPEN("sun.util.resources.OpenListResourceBundle"), + TIMEZONE("sun.util.resources.TimeZoneNamesBundle"); + + private final String pathName, className; + private BundleType(String name) { + pathName = name; + int x = name.lastIndexOf('.'); + className = name.substring(x + 1); + } + String getPathName() { + return pathName; + } + String getClassName() { + return className; + } + }; + public void generateBundle(String packageName, String baseName, String localeID, - boolean useJava, Map map, boolean open) throws IOException; + boolean useJava, Map map, BundleType type) throws IOException; public void generateMetaInfo(Map> metaInfo) throws IOException; } --- old/make/tools/src/build/tools/cldrconverter/CLDRConverter.java 2012-12-03 11:41:12.000000000 +0900 +++ new/make/tools/src/build/tools/cldrconverter/CLDRConverter.java 2012-12-03 11:41:11.000000000 +0900 @@ -25,6 +25,7 @@ package build.tools.cldrconverter; +import build.tools.cldrconverter.BundleGenerator.BundleType; import java.io.File; import java.nio.file.DirectoryStream; import java.nio.file.FileSystems; @@ -58,9 +59,8 @@ static final String CURRENCY_SYMBOL_PREFIX = "currency.symbol."; static final String CURRENCY_NAME_PREFIX = "currency.displayname."; static final String TIMEZONE_ID_PREFIX = "timezone.id."; - static final String TIMEZONE_NAME_PREFIX = "timezone.displayname."; + static final String ZONE_NAME_PREFIX = "timezone.displayname."; static final String METAZONE_ID_PREFIX = "metazone.id."; - static final String METAZONE_NAME_PREFIX = "metazone.displayname."; private static SupplementDataParseHandler handlerSuppl; static NumberingSystemsParseHandler handlerNumbering; @@ -236,7 +236,14 @@ if (sb.indexOf("root") == -1) { sb.append("root"); } - retList.add(new Bundle(id, sb.toString(), null, null)); + Bundle b = new Bundle(id, sb.toString(), null, null); + // Insert the bundle for en at the top so that it will get + // processed first. + if ("en".equals(id)) { + retList.add(0, b); + } else { + retList.add(b); + } } } } @@ -312,6 +319,7 @@ Map> metaInfo = new HashMap<>(); metaInfo.put("LocaleNames", new TreeSet()); metaInfo.put("CurrencyNames", new TreeSet()); + metaInfo.put("TimeZoneNames", new TreeSet()); metaInfo.put("CalendarData", new TreeSet()); metaInfo.put("FormatData", new TreeSet()); @@ -348,24 +356,28 @@ Map localeNamesMap = extractLocaleNames(targetMap, bundle.getID()); if (!localeNamesMap.isEmpty() || bundle.isRoot()) { metaInfo.get("LocaleNames").add(toLanguageTag(bundle.getID())); - bundleGenerator.generateBundle("util", "LocaleNames", bundle.getID(), true, localeNamesMap, true); + bundleGenerator.generateBundle("util", "LocaleNames", bundle.getID(), true, localeNamesMap, BundleType.OPEN); } } if (bundleTypes.contains(Bundle.Type.CURRENCYNAMES)) { Map currencyNamesMap = extractCurrencyNames(targetMap, bundle.getID(), bundle.getCurrencies()); if (!currencyNamesMap.isEmpty() || bundle.isRoot()) { metaInfo.get("CurrencyNames").add(toLanguageTag(bundle.getID())); - bundleGenerator.generateBundle("util", "CurrencyNames", bundle.getID(), true, currencyNamesMap, true); + bundleGenerator.generateBundle("util", "CurrencyNames", bundle.getID(), true, currencyNamesMap, BundleType.OPEN); } } if (bundleTypes.contains(Bundle.Type.TIMEZONENAMES)) { Map zoneNamesMap = extractZoneNames(targetMap, bundle.getID()); + if (!zoneNamesMap.isEmpty() || bundle.isRoot()) { + metaInfo.get("TimeZoneNames").add(toLanguageTag(bundle.getID())); + bundleGenerator.generateBundle("util", "TimeZoneNames", bundle.getID(), true, zoneNamesMap, BundleType.TIMEZONE); + } } if (bundleTypes.contains(Bundle.Type.CALENDARDATA)) { Map calendarDataMap = extractCalendarData(targetMap, bundle.getID()); if (!calendarDataMap.isEmpty() || bundle.isRoot()) { metaInfo.get("CalendarData").add(toLanguageTag(bundle.getID())); - bundleGenerator.generateBundle("util", "CalendarData", bundle.getID(), true, calendarDataMap, false); + bundleGenerator.generateBundle("util", "CalendarData", bundle.getID(), true, calendarDataMap, BundleType.PLAIN); } } if (bundleTypes.contains(Bundle.Type.FORMATDATA)) { @@ -373,9 +385,10 @@ // LocaleData.getAvailableLocales depends on having FormatData bundles around if (!formatDataMap.isEmpty() || bundle.isRoot()) { metaInfo.get("FormatData").add(toLanguageTag(bundle.getID())); - bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, false); + bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, BundleType.OPEN); } } + // For testing SortedSet allLocales = new TreeSet<>(); allLocales.addAll(metaInfo.get("CurrencyNames")); @@ -431,6 +444,7 @@ private KeyComparator() { } + @Override public int compare(String o1, String o2) { int len1 = o1.length(); int len2 = o2.length(); @@ -476,7 +490,26 @@ } private static Map extractZoneNames(Map map, String id) { - return null; + Map names = new HashMap<>(); + for (String tzid : handlerMetaZones.keySet()) { + String tzKey = TIMEZONE_ID_PREFIX + tzid; + Object data = map.get(tzKey); + if (data instanceof String[]) { + names.put(tzid, data); + } else { + String meta = handlerMetaZones.get(tzid); + if (meta != null) { + String metaKey = METAZONE_ID_PREFIX + meta; + data = map.get(metaKey); + if (data instanceof String[]) { + // Keep the metazone prefix here. + names.put(metaKey, data); + names.put(tzid, meta); + } + } + } + } + return names; } private static Map extractCalendarData(Map map, String id) { @@ -494,11 +527,19 @@ copyIfPresent(map, prefix + "standalone.MonthNames", formatData); copyIfPresent(map, prefix + "MonthAbbreviations", formatData); copyIfPresent(map, prefix + "standalone.MonthAbbreviations", formatData); + copyIfPresent(map, prefix + "MonthNarrow", formatData); + copyIfPresent(map, prefix + "standalone.MonthNarrows", formatData); copyIfPresent(map, prefix + "DayNames", formatData); + copyIfPresent(map, prefix + "standalone.DayNames", formatData); copyIfPresent(map, prefix + "DayAbbreviations", formatData); + copyIfPresent(map, prefix + "standalone.DayAbbreviations", formatData); + copyIfPresent(map, prefix + "DayNarrows", formatData); + copyIfPresent(map, prefix + "standalone.DayNarrows", formatData); copyIfPresent(map, prefix + "AmPmMarkers", formatData); + copyIfPresent(map, prefix + "narrow.AmPmMarkers", formatData); + copyIfPresent(map, prefix + "long.Eras", formatData); copyIfPresent(map, prefix + "Eras", formatData); - copyIfPresent(map, prefix + "short.Eras", formatData); + copyIfPresent(map, prefix + "narrow.Eras", formatData); copyIfPresent(map, prefix + "TimePatterns", formatData); copyIfPresent(map, prefix + "DatePatterns", formatData); copyIfPresent(map, prefix + "DateTimePatterns", formatData); @@ -560,7 +601,6 @@ if (x == 0 || escapeSpace) { outBuffer.append('\\'); } - outBuffer.append(' '); break; case '\\': @@ -584,7 +624,7 @@ outBuffer.append('f'); break; default: - if (!USE_UTF8 && ((aChar < 0x0020) || (aChar > 0x007e))) { + if (aChar < 0x0020 || (!USE_UTF8 && aChar > 0x007e)) { formatter.format("\\u%04x", (int)aChar); } else { if (specialSaveChars.indexOf(aChar) != -1) { --- old/make/tools/src/build/tools/cldrconverter/LDMLParseHandler.java 2012-12-03 11:41:14.000000000 +0900 +++ new/make/tools/src/build/tools/cldrconverter/LDMLParseHandler.java 2012-12-03 11:41:14.000000000 +0900 @@ -155,6 +155,9 @@ case "abbreviated": pushStringArrayEntry(qName, attributes, prefix + "MonthAbbreviations/" + getContainerKey(), 13); break; + case "narrow": + pushStringArrayEntry(qName, attributes, prefix + "MonthNarrows/" + getContainerKey(), 13); + break; default: pushIgnoredContainer(qName); break; @@ -191,6 +194,9 @@ case "abbreviated": pushStringArrayEntry(qName, attributes, prefix + "DayAbbreviations/" + getContainerKey(), 7); break; + case "narrow": + pushStringArrayEntry(qName, attributes, prefix + "DayNarrows/" + getContainerKey(), 7); + break; default: pushIgnoredContainer(qName); break; @@ -219,25 +225,36 @@ case "dayPeriodWidth": // for FormatData // create string array entry for am/pm. only keeping wide - if ("wide".equals(attributes.getValue("type"))) { + switch (attributes.getValue("type")) { + case "wide": pushStringArrayEntry(qName, attributes, "AmPmMarkers/" + getContainerKey(), 2); - } else { + break; + case "narrow": + pushStringArrayEntry(qName, attributes, "narrow.AmPmMarkers/" + getContainerKey(), 2); + break; + default: pushIgnoredContainer(qName); + break; } break; case "dayPeriod": // for FormatData // add to string array entry of AmPmMarkers element - switch (attributes.getValue("type")) { - case "am": - pushStringArrayElement(qName, attributes, 0); - break; - case "pm": - pushStringArrayElement(qName, attributes, 1); - break; - default: + if (attributes.getValue("alt") == null) { + switch (attributes.getValue("type")) { + case "am": + pushStringArrayElement(qName, attributes, 0); + break; + case "pm": + pushStringArrayElement(qName, attributes, 1); + break; + default: + pushIgnoredContainer(qName); + break; + } + } else { + // discard alt values pushIgnoredContainer(qName); - break; } break; case "eraNames": @@ -269,7 +286,7 @@ assert currentContainer instanceof IgnoredContainer; pushIgnoredContainer(qName); } else { - String key = currentCalendarType.keyElementName() + "short.Eras"; + String key = currentCalendarType.keyElementName() + "narrow.Eras"; pushStringArrayEntry(qName, attributes, key, currentCalendarType.getEraLength(qName)); } break; @@ -301,15 +318,15 @@ break; case "zone": { - String zone = attributes.getValue("type"); + String tzid = attributes.getValue("type"); // Olson tz id zonePrefix = CLDRConverter.TIMEZONE_ID_PREFIX; - put(zonePrefix + zone, new HashMap()); - pushKeyContainer(qName, attributes, zone); + put(zonePrefix + tzid, new HashMap()); + pushKeyContainer(qName, attributes, tzid); } break; case "metazone": { - String zone = attributes.getValue("type"); + String zone = attributes.getValue("type"); // LDML meta zone id zonePrefix = CLDRConverter.METAZONE_ID_PREFIX; put(zonePrefix + zone, new HashMap()); pushKeyContainer(qName, attributes, zone); @@ -323,16 +340,12 @@ zoneNameStyle = "short"; pushContainer(qName, attributes); break; - case "generic": // not used in JDK - pushIgnoredContainer(qName); - break; - case "standard": // standard time - pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "standard." + zoneNameStyle); - break; - case "daylight": - pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "daylight." + zoneNameStyle); + case "generic": // generic name + case "standard": // standard time name + case "daylight": // daylight saving (summer) time name + pushStringEntry(qName, attributes, CLDRConverter.ZONE_NAME_PREFIX + qName + "." + zoneNameStyle); break; - case "exemplarCity": + case "exemplarCity": // not used in JDK pushIgnoredContainer(qName); break; @@ -530,6 +543,7 @@ case "timeZoneNames": zonePrefix = null; break; + case "generic": case "standard": case "daylight": if (zonePrefix != null && (currentContainer instanceof Entry)) { --- old/make/tools/src/build/tools/cldrconverter/MetaZonesParseHandler.java 2012-12-03 11:41:17.000000000 +0900 +++ new/make/tools/src/build/tools/cldrconverter/MetaZonesParseHandler.java 2012-12-03 11:41:16.000000000 +0900 @@ -46,8 +46,9 @@ return null; } + // metaZone: ID -> metazone + // per locale: ID -> names, metazone -> names @Override - @SuppressWarnings("fallthrough") public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { switch (qName) { case "timezone": --- old/make/tools/src/build/tools/cldrconverter/ResourceBundleGenerator.java 2012-12-03 11:41:19.000000000 +0900 +++ new/make/tools/src/build/tools/cldrconverter/ResourceBundleGenerator.java 2012-12-03 11:41:18.000000000 +0900 @@ -28,14 +28,16 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.Formatter; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.SortedSet; class ResourceBundleGenerator implements BundleGenerator { - @Override public void generateBundle(String packageName, String baseName, String localeID, boolean useJava, - Map map, boolean open) throws IOException { + Map map, BundleType type) throws IOException { String suffix = useJava ? ".java" : ".properties"; String lang = CLDRConverter.getLanguageCode(localeID); String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator @@ -67,6 +69,28 @@ encoding = "iso-8859-1"; } + Formatter fmt = null; + if (type == BundleType.TIMEZONE) { + fmt = new Formatter(); + Set metaKeys = new HashSet<>(); + for (String key : map.keySet()) { + if (key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) { + String meta = key.substring(CLDRConverter.METAZONE_ID_PREFIX.length()); + String[] value; + value = (String[]) map.get(key); + fmt.format(" final String[] %s = new String[] {\n", meta); + for (String s : value) { + fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava)); + } + fmt.format(" };\n"); + metaKeys.add(key); + } + } + for (String key : metaKeys) { + map.remove(key); + } + } + try (PrintWriter out = new PrintWriter(file, encoding)) { // Output copyright headers out.println(CopyrightHeaders.getOpenJDKCopyright()); @@ -74,16 +98,15 @@ if (useJava) { out.println("package sun." + packageName + ";\n"); - if (open) { - out.println("import sun.util.resources.OpenListResourceBundle;\n"); - out.println("public class " + baseName + ("root".equals(localeID) ? "" : "_" + localeID) + " extends OpenListResourceBundle {"); - } else { - out.println("import java.util.ListResourceBundle;\n"); - out.println("public class " + baseName + ("root".equals(localeID) ? "" : "_" + localeID) + " extends ListResourceBundle {"); - } + out.printf("import %s;\n\n", type.getPathName()); + out.printf("public class %s%s extends %s {\n", baseName, "root".equals(localeID) ? "" : "_" + localeID, type.getClassName()); + out.println(" @Override\n" + - " protected final Object[][] getContents() {\n" + - " final Object[][] data = new Object[][] {"); + " protected final Object[][] getContents() {"); + if (fmt != null) { + out.print(fmt.toString()); + } + out.println(" final Object[][] data = new Object[][] {"); } for (String key : map.keySet()) { if (useJava) { @@ -91,7 +114,11 @@ if (value == null) { CLDRConverter.warning("null value for " + key); } else if (value instanceof String) { - out.println(" { \"" + key + "\", \"" + CLDRConverter.saveConvert((String) value, useJava) + "\" },"); + if (type == BundleType.TIMEZONE) { + out.printf(" { \"%s\", %s },\n", key, CLDRConverter.saveConvert((String) value, useJava)); + } else { + out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.saveConvert((String) value, useJava)); + } } else if (value instanceof String[]) { String[] values = (String[]) value; out.println(" { \"" + key + "\",\n new String[] {"); --- old/src/share/classes/java/text/DateFormatSymbols.java 2012-12-03 11:41:21.000000000 +0900 +++ new/src/share/classes/java/text/DateFormatSymbols.java 2012-12-03 11:41:21.000000000 +0900 @@ -688,7 +688,16 @@ } ResourceBundle resource = adapter.getLocaleData().getDateFormatData(locale); - eras = resource.getStringArray("Eras"); + // JRE and CLDR use different keys + // JRE: Eras, short.Eras and narrow.Eras + // CLDR: long.Eras, Eras and narrow.Eras + if (resource.containsKey("Eras")) { + eras = resource.getStringArray("Eras"); + } else if (resource.containsKey("long.Eras")) { + eras = resource.getStringArray("long.Eras"); + } else if (resource.containsKey("short.Eras")) { + eras = resource.getStringArray("short.Eras"); + } months = resource.getStringArray("MonthNames"); shortMonths = resource.getStringArray("MonthAbbreviations"); ampms = resource.getStringArray("AmPmMarkers"); --- old/src/share/classes/java/text/SimpleDateFormat.java 2012-12-03 11:41:24.000000000 +0900 +++ new/src/share/classes/java/text/SimpleDateFormat.java 2012-12-03 11:41:23.000000000 +0900 @@ -48,12 +48,13 @@ import java.util.Locale; import java.util.Map; import java.util.SimpleTimeZone; +import java.util.SortedMap; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.calendar.CalendarUtils; import sun.util.calendar.ZoneInfoFile; +import sun.util.locale.provider.LocaleProviderAdapter; /** * SimpleDateFormat is a concrete class for formatting and @@ -1593,6 +1594,17 @@ private int matchString(String text, int start, int field, Map data, CalendarBuilder calb) { if (data != null) { + // TODO: make this default when it's in the spec. + if (data instanceof SortedMap) { + for (String name : data.keySet()) { + if (text.regionMatches(true, start, name, 0, name.length())) { + calb.set(field, data.get(name)); + return start + name.length(); + } + } + return -start; + } + String bestMatch = null; for (String name : data.keySet()) { @@ -1803,7 +1815,7 @@ boolean obeyCount, boolean[] ambiguousYear, ParsePosition origPos, boolean useFollowingMinusSignAsDelimiter, CalendarBuilder calb) { - Number number = null; + Number number; int value = 0; ParsePosition pos = new ParsePosition(0); pos.index = start; @@ -1876,9 +1888,7 @@ return index; } } else { - Map map = calendar.getDisplayNames(field, - Calendar.ALL_STYLES, - locale); + Map map = getDisplayNamesMap(field, locale); if ((index = matchString(text, start, field, map, calb)) > 0) { return index; } @@ -1940,7 +1950,7 @@ // count >= 3 // i.e., MMM or MMMM // Want to be able to parse both short and long forms. // Try count == 4 first: - int newStart = 0; + int newStart; if ((newStart = matchString(text, start, Calendar.MONTH, formatData.getMonths(), calb)) > 0) { return newStart; @@ -1951,9 +1961,7 @@ return index; } } else { - Map map = calendar.getDisplayNames(field, - Calendar.ALL_STYLES, - locale); + Map map = getDisplayNamesMap(field, locale); if ((index = matchString(text, start, field, map, calb)) > 0) { return index; } @@ -1979,7 +1987,7 @@ if (useDateFormatSymbols) { // Want to be able to parse both short and long forms. // Try count == 4 (DDDD) first: - int newStart = 0; + int newStart; if ((newStart=matchString(text, start, Calendar.DAY_OF_WEEK, formatData.getWeekdays(), calb)) > 0) { return newStart; @@ -2008,7 +2016,7 @@ return index; } } else { - Map map = calendar.getDisplayNames(field, Calendar.ALL_STYLES, locale); + Map map = getDisplayNamesMap(field, locale); if ((index = matchString(text, start, field, map, calb)) > 0) { return index; } @@ -2098,7 +2106,7 @@ break parsing; } - int sign = 0; + int sign; char c = text.charAt(pos.index); if (c == 'Z') { calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0); @@ -2340,6 +2348,21 @@ && formatData.equals(that.formatData)); } + private static final int[] REST_OF_STYLES = { + Calendar.SHORT_STANDALONE, Calendar.LONG_FORMAT, Calendar.LONG_STANDALONE, + }; + private Map getDisplayNamesMap(int field, Locale locale) { + Map map = calendar.getDisplayNames(field, Calendar.SHORT_FORMAT, locale); + // Get all SHORT and LONG styles (avoid NARROW styles). + for (int style : REST_OF_STYLES) { + Map m = calendar.getDisplayNames(field, style, locale); + if (m != null) { + map.putAll(m); + } + } + return map; + } + /** * After reading an object from the input stream, the format * pattern in the object is verified. --- old/src/share/classes/java/util/Calendar.java 2012-12-03 11:41:26.000000000 +0900 +++ new/src/share/classes/java/util/Calendar.java 2012-12-03 11:41:25.000000000 +0900 @@ -53,9 +53,7 @@ import java.text.DateFormatSymbols; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.spi.CalendarDataProvider; import sun.util.BuddhistCalendar; -import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.calendar.ZoneInfo; import sun.util.locale.provider.CalendarDataUtility; @@ -746,6 +744,32 @@ /** * A style specifier for {@link #getDisplayName(int, int, Locale) * getDisplayName} and {@link #getDisplayNames(int, int, Locale) + * getDisplayNames} indicating a narrow name used for format. Narrow names + * are typically single character strings, such as "M" for Monday. + * + * @see #NARROW_STANDALONE + * @see #SHORT_FORMAT + * @see #LONG_FOTMAT + * @since 1.8 + */ + public static final int NARROW_FORMAT = 4; + + /** + * A style specifier for {@link #getDisplayName(int, int, Locale) + * getDisplayName} and {@link #getDisplayNames(int, int, Locale) + * getDisplayNames} indicating a narrow name independently. Narrow names + * are typically single character strings, such as "M" for Monday. + * + * @see #NARROW_FORMAT + * @see #SHORT_STANDALONE + * @see #LONG_STANDALONE + * @since 1.8 + */ + public static final int NARROW_STANDALONE = NARROW_FORMAT | STANDALONE_MASK; + + /** + * A style specifier for {@link #getDisplayName(int, int, Locale) + * getDisplayName} and {@link #getDisplayNames(int, int, Locale) * getDisplayNames} indicating a short name used for format. * * @see #SHORT_STANDALONE @@ -1472,30 +1496,31 @@ * @param style * the style applied to the string representation; one of {@link * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, - * {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}. + * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE}, + * {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE}. * @param locale * the locale for the string representation * (any calendar types specified by {@code locale} are ignored) * @return the string representation of the given - * field in the given style, or - * null if no string representation is + * {@code field} in the given {@code style}, or + * {@code null} if no string representation is * applicable. * @exception IllegalArgumentException - * if field or style is invalid, - * or if this Calendar is non-lenient and any + * if {@code field} or {@code style} is invalid, + * or if this {@code Calendar} is non-lenient and any * of the calendar fields have invalid values * @exception NullPointerException - * if locale is null + * if {@code locale} is null * @since 1.6 */ public String getDisplayName(int field, int style, Locale locale) { - if (!checkDisplayNameParams(field, style, SHORT, LONG, locale, + if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale, ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } - // the standalone styles are supported only through CalendarDataProviders. - if (isStandaloneStyle(style)) { + // the standalone and narrow styles are supported only through CalendarDataProviders. + if (isStandaloneStyle(style) || isNarrowStyle(style)) { return CalendarDataUtility.retrieveFieldValueName(getCalendarType(), field, get(field), style, locale); @@ -1513,26 +1538,30 @@ } /** - * Returns a Map containing all names of the calendar - * field in the given style and - * locale and their corresponding field values. For - * example, if this Calendar is a {@link + * Returns a {@code Map} containing all names of the calendar + * {@code field} in the given {@code style} and + * {@code locale} and their corresponding field values. For + * example, if this {@code Calendar} is a {@link * GregorianCalendar}, the returned map would contain "Jan" to * {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the * {@linkplain #SHORT short} style in an English locale. * + *

Narrow names may not be unique due to use of single characters, + * such as "S" for Sunday and Saturday. In that case narrow names are not + * included in the returned {@code Map}. + * *

The values of other calendar fields may be taken into * account to determine a set of display names. For example, if - * this Calendar is a lunisolar calendar system and + * this {@code Calendar} is a lunisolar calendar system and * the year value given by the {@link #YEAR} field has a leap * month, this method would return month names containing the leap * month name, and month names are mapped to their values specific * for the year. * *

The default implementation supports display names contained in - * a {@link DateFormatSymbols}. For example, if field - * is {@link #MONTH} and style is {@link - * #ALL_STYLES}, this method returns a Map containing + * a {@link DateFormatSymbols}. For example, if {@code field} + * is {@link #MONTH} and {@code style} is {@link + * #ALL_STYLES}, this method returns a {@code Map} containing * all strings returned by {@link DateFormatSymbols#getShortMonths()} * and {@link DateFormatSymbols#getMonths()}. * @@ -1541,30 +1570,31 @@ * @param style * the style applied to the string representation; one of {@link * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, - * {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}. + * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE}, + * {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE} * @param locale * the locale for the display names - * @return a Map containing all display names in - * style and locale and their - * field values, or null if no display names - * are defined for field + * @return a {@code Map} containing all display names in + * {@code style} and {@code locale} and their + * field values, or {@code null} if no display names + * are defined for {@code field} * @exception IllegalArgumentException - * if field or style is invalid, - * or if this Calendar is non-lenient and any + * if {@code field} or {@code style} is invalid, + * or if this {@code Calendar} is non-lenient and any * of the calendar fields have invalid values * @exception NullPointerException - * if locale is null + * if {@code locale} is null * @since 1.6 */ public Map getDisplayNames(int field, int style, Locale locale) { - if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale, + if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale, ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } if (style == ALL_STYLES || isStandaloneStyle(style)) { return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale); } - // SHORT or LONG + // SHORT, LONG, or NARROW return getDisplayNamesImpl(field, style, locale); } @@ -1599,6 +1629,12 @@ private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) { int baseStyle = getBaseStyle(style); // ignore the standalone mask + + // DateFormatSymbols doesn't support any narrow names. + if (baseStyle == NARROW_FORMAT) { + return null; + } + String[] strings = null; switch (field) { case ERA: @@ -1948,6 +1984,10 @@ return (style & STANDALONE_MASK) != 0; } + boolean isNarrowStyle(int style) { + return style == NARROW_FORMAT || style == NARROW_STANDALONE; + } + /** * Returns the pseudo-time-stamp for two fields, given their * individual pseudo-time-stamps. If either of the fields --- old/src/share/classes/java/util/JapaneseImperialCalendar.java 2012-12-03 11:41:29.000000000 +0900 +++ new/src/share/classes/java/util/JapaneseImperialCalendar.java 2012-12-03 11:41:28.000000000 +0900 @@ -946,8 +946,9 @@ set(field, getRolledValue(internalGet(field), amount, min, max)); } + @Override public String getDisplayName(int field, int style, Locale locale) { - if (!checkDisplayNameParams(field, style, SHORT, LONG, locale, + if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale, ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } @@ -956,11 +957,12 @@ // "GanNen" is supported only in the LONG style. if (field == YEAR - && (getBaseStyle(style) == SHORT || fieldValue != 1 || get(ERA) == 0)) { + && (getBaseStyle(style) != LONG || fieldValue != 1 || get(ERA) == 0)) { return null; } - String name = CalendarDataUtility.retrieveFieldValueName("japanese", field, fieldValue, style, locale); + String name = CalendarDataUtility.retrieveFieldValueName(getCalendarType(), field, + fieldValue, style, locale); // If the ERA value is null, then // try to get its name or abbreviation from the Era instance. if (name == null && field == ERA && fieldValue < eras.length) { @@ -970,27 +972,37 @@ return name; } + @Override public Map getDisplayNames(int field, int style, Locale locale) { - if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale, + if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale, ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } - Map names = CalendarDataUtility.retrieveFieldValueNames("japanese", field, style, locale); + Map names; + names = CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale); // If strings[] has fewer than eras[], get more names from eras[]. - if (field == ERA) { - int size = names.size(); - if (style == ALL_STYLES) { - size /= 2; // SHORT and LONG - } - if (size < eras.length) { - int baseStyle = getBaseStyle(style); - for (int i = size; i < eras.length; i++) { - Era era = eras[i]; - if (baseStyle == ALL_STYLES || baseStyle == SHORT) { - names.put(era.getAbbreviation(), i); + if (names != null) { + if (field == ERA) { + int size = names.size(); + if (style == ALL_STYLES) { + Set values = new HashSet<>(); + // count unique era values + for (String key : names.keySet()) { + values.add(names.get(key)); } - if (baseStyle == ALL_STYLES || baseStyle == LONG) { - names.put(era.getName(), i); + size = values.size(); + } + if (size < eras.length) { + int baseStyle = getBaseStyle(style); + for (int i = size; i < eras.length; i++) { + Era era = eras[i]; + if (baseStyle == ALL_STYLES || baseStyle == SHORT + || baseStyle == NARROW_FORMAT) { + names.put(era.getAbbreviation(), i); + } + if (baseStyle == ALL_STYLES || baseStyle == LONG) { + names.put(era.getName(), i); + } } } } --- old/src/share/classes/java/util/TimeZone.java 2012-12-03 11:41:32.000000000 +0900 +++ new/src/share/classes/java/util/TimeZone.java 2012-12-03 11:41:31.000000000 +0900 @@ -43,12 +43,12 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.concurrent.ConcurrentHashMap; -import sun.misc.SharedSecrets; import sun.misc.JavaAWTAccess; +import sun.misc.SharedSecrets; import sun.security.action.GetPropertyAction; -import sun.util.locale.provider.TimeZoneNameUtility; import sun.util.calendar.ZoneInfo; import sun.util.calendar.ZoneInfoFile; +import sun.util.locale.provider.TimeZoneNameUtility; /** * TimeZone represents a time zone offset, and also figures out daylight @@ -399,28 +399,23 @@ if (style != SHORT && style != LONG) { throw new IllegalArgumentException("Illegal style: " + style); } - String id = getID(); - String[] names = getDisplayNames(id, locale); - if (names == null) { - if (id.startsWith("GMT") && id.length() > 3) { - char sign = id.charAt(3); - if (sign == '+' || sign == '-') { - return id; - } - } - int offset = getRawOffset(); - if (daylight) { - offset += getDSTSavings(); - } - return ZoneInfoFile.toCustomID(offset); + String name = TimeZoneNameUtility.retrieveDisplayName(id, daylight, style, locale); + if (name != null) { + return name; } - int index = daylight ? 3 : 1; - if (style == SHORT) { - index++; + if (id.startsWith("GMT") && id.length() > 3) { + char sign = id.charAt(3); + if (sign == '+' || sign == '-') { + return id; + } } - return names[index]; + int offset = getRawOffset(); + if (daylight) { + offset += getDSTSavings(); + } + return ZoneInfoFile.toCustomID(offset); } private static class DisplayNames { @@ -429,9 +424,12 @@ // Map(key=id, value=SoftReference(Map(key=locale, value=displaynames))) private static final Map>> CACHE = new ConcurrentHashMap<>(); + + private DisplayNames() { + } } - private static final String[] getDisplayNames(String id, Locale locale) { + private static String[] getDisplayNames(String id, Locale locale) { Map>> displayNames = DisplayNames.CACHE; SoftReference> ref = displayNames.get(id); @@ -631,14 +629,14 @@ } private static synchronized TimeZone setDefaultZone() { - TimeZone tz = null; + TimeZone tz; // get the time zone ID from the system properties String zoneID = AccessController.doPrivileged( new GetPropertyAction("user.timezone")); // if the time zone ID is not set (yet), perform the // platform to Java time zone ID mapping. - if (zoneID == null || zoneID.equals("")) { + if (zoneID == null || zoneID.isEmpty()) { String country = AccessController.doPrivileged( new GetPropertyAction("user.country")); String javaHome = AccessController.doPrivileged( @@ -670,8 +668,9 @@ assert tz != null; final String id = zoneID; - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Void run() { System.setProperty("user.timezone", id); return null; } --- old/src/share/classes/java/util/spi/CalendarNameProvider.java 2012-12-03 11:41:34.000000000 +0900 +++ new/src/share/classes/java/util/spi/CalendarNameProvider.java 2012-12-03 11:41:34.000000000 +0900 @@ -174,7 +174,8 @@ *

{@code style} gives the style of the string representation. It is one * of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), * {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} - * ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}. + * ({@link Calendar#LONG LONG}), {@link Calendar#LONG_STANDALONE}, + * {@link Calendar#NARROW_FORMAT}, or {@link Calendar#NARROW_STANDALONE}. * *

For example, the following call will return {@code "Sunday"}. *

@@ -195,8 +196,10 @@
      *              the string representation style: one of {@link
      *              Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
      *              {@link Calendar#SHORT_STANDALONE}, {@link
-     *              Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or
-     *              {@link Calendar#LONG_STANDALONE}
+     *              Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}),
+     *              {@link Calendar#LONG_STANDALONE},
+     *              {@link Calendar#NARROW_FORMAT},
+     *              or {@link Calendar#NARROW_STANDALONE}
      * @param locale
      *              the desired locale
      * @return the string representation of the {@code field value}, or {@code
@@ -226,8 +229,11 @@
      * 

{@code style} gives the style of the string representation. It must be * one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link * Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link - * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link - * Calendar#LONG_STANDALONE}. + * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), {@link + * Calendar#LONG_STANDALONE}, {@link Calendar#NARROW_FORMAT}, or + * {@link Calendar#NARROW_STANDALONE}. Note that narrow names may + * not be unique due to use of single characters, such as "S" for Sunday + * and Saturday, and that no narrow names are included in that case. * *

For example, the following call will return a {@code Map} containing * {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link @@ -247,8 +253,9 @@ * {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} * ({@link Calendar#SHORT SHORT}), {@link * Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} - * ({@link Calendar#LONG LONG}), or {@link - * Calendar#LONG_STANDALONE}. + * ({@link Calendar#LONG LONG}), {@link Calendar#LONG_STANDALONE}, + * {@link Calendar#NARROW_FORMAT}, + * or {@link Calendar#NARROW_STANDALONE} * @param locale * the desired locale * @return a {@code Map} containing all display names of {@code field} in --- old/src/share/classes/java/util/spi/TimeZoneNameProvider.java 2012-12-03 11:41:37.000000000 +0900 +++ new/src/share/classes/java/util/spi/TimeZoneNameProvider.java 2012-12-03 11:41:37.000000000 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, 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 @@ -77,4 +77,34 @@ * @see java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale) */ public abstract String getDisplayName(String ID, boolean daylight, int style, Locale locale); + + /** + * Returns a generic name for the given time zone {@code ID} that's suitable + * for presentation to the user in the specified {@code locale}. Generic + * time zone names are neutral from standard time and daylight saving + * time. For example, "PT" is the short generic name of time zone ID {@code + * America/Los_Angeles}, while its short standard time and daylight saving + * time names are "PST" and "PDT", respectively. Refer to + * {@link #getDisplayName(String, boolean, int, Locale) getDisplayName} + * for valid time zone IDs. + * + *

The default implementation of this method returns {@code null}. + * + * @param ID a time zone ID string + * @param style either {@link java.util.TimeZone#LONG TimeZone.LONG} or + * {@link java.util.TimeZone#SHORT TimeZone.SHORT} + * @param locale the desired locale + * @return the human-readable generic name of the given time zone in the + * given locale, or {@code null} if it's not available. + * @exception IllegalArgumentException if style is invalid, + * or locale isn't one of the locales returned from + * {@link LocaleServiceProvider#getAvailableLocales() + * getAvailableLocales()}. + * @exception NullPointerException if ID or locale + * is {@code null} + * @since 1.8 + */ + public String getGenericDisplayName(String ID, int style, Locale locale) { + return null; + } } --- old/src/share/classes/sun/text/resources/FormatData.java 2012-12-03 11:41:40.000000000 +0900 +++ new/src/share/classes/sun/text/resources/FormatData.java 2012-12-03 11:41:39.000000000 +0900 @@ -50,6 +50,20 @@ * Overrides ListResourceBundle */ protected final Object[][] getContents() { + final String[] buddhistEras = new String[] { // Thai Buddhist calendar era strings + "BC", // BC + "B.E." // Buddhist Era + }; + + // Japanese imperial calendar era abbreviations + final String[] japaneseEraAbbrs = new String[] { + "", + "M", + "T", + "S", + "H", + }; + return new Object[][] { { "MonthNames", new String[] { @@ -107,29 +121,49 @@ "Sat" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "M", + "T", + "W", + "T", + "F", + "S", + } + }, { "AmPmMarkers", new String[] { "AM", // am marker "PM" // pm marker } }, + { "narrow.AmPmMarkers", + new String[] { + "a", // am marker + "p" // pm marker + } + }, { "Eras", new String[] { // era strings for GregorianCalendar "BC", "AD" } }, - { "buddhist.Eras", - new String[] { // Thai Buddhist calendar era strings - "BC", // BC - "B.E." // Buddhist Era + { "narrow.Eras", + new String[] { + "B", + "A", } }, + { "buddhist.Eras", + buddhistEras + }, { "buddhist.short.Eras", - new String[] { // Thai Buddhist calendar era strings - "BC", // BC - "B.E." // Buddhist Era - } + buddhistEras + }, + { "buddhist.narrow.Eras", + buddhistEras }, { "japanese.Eras", new String[] { // Japanese imperial calendar era strings @@ -141,13 +175,10 @@ } }, { "japanese.short.Eras", - new String[] { // Japanese imperial calendar era abbreviations - "", - "M", - "T", - "S", - "H", - } + japaneseEraAbbrs + }, + { "japanese.narrow.Eras", + japaneseEraAbbrs }, { "japanese.FirstYear", new String[] { // Japanese imperial calendar year name --- old/src/share/classes/sun/text/resources/ar/FormatData_ar.java 2012-12-03 11:41:42.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ar/FormatData_ar.java 2012-12-03 11:41:41.000000000 +0900 @@ -107,6 +107,17 @@ "\u0633" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u062d", + "\u0646", + "\u062b", + "\u0631", + "\u062e", + "\u062c", + "\u0633", + } + }, { "AmPmMarkers", new String[] { "\u0635", // am marker --- old/src/share/classes/sun/text/resources/be/FormatData_be.java 2012-12-03 11:41:44.000000000 +0900 +++ new/src/share/classes/sun/text/resources/be/FormatData_be.java 2012-12-03 11:41:44.000000000 +0900 @@ -85,6 +85,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "\u0441", + "\u043b", + "\u0441", + "\u043a", + "\u043c", + "\u0447", + "\u043b", + "\u0436", + "\u0432", + "\u043a", + "\u043b", + "\u0441", + "", + } + }, { "DayNames", new String[] { "\u043d\u044f\u0434\u0437\u0435\u043b\u044f", // Sunday @@ -107,6 +124,17 @@ "\u0441\u0431" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u043d", + "\u043f", + "\u0430", + "\u0441", + "\u0447", + "\u043f", + "\u0441", + } + }, { "Eras", new String[] { // era strings "\u0434\u0430 \u043d.\u0435.", --- old/src/share/classes/sun/text/resources/bg/FormatData_bg.java 2012-12-03 11:41:47.000000000 +0900 +++ new/src/share/classes/sun/text/resources/bg/FormatData_bg.java 2012-12-03 11:41:46.000000000 +0900 @@ -107,6 +107,17 @@ "\u0421\u0431" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u043d", + "\u043f", + "\u0432", + "\u0441", + "\u0447", + "\u043f", + "\u0441", + } + }, { "Eras", new String[] { // era strings "\u043f\u0440.\u043d.\u0435.", --- old/src/share/classes/sun/text/resources/ca/FormatData_ca.java 2012-12-03 11:41:50.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ca/FormatData_ca.java 2012-12-03 11:41:49.000000000 +0900 @@ -119,6 +119,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "g", + "f", + "m", + "a", + "m", + "j", + "j", + "a", + "s", + "o", + "n", + "d", + "", + } + }, { "DayNames", new String[] { "diumenge", // Sunday @@ -141,6 +158,28 @@ "ds." // abb Saturday } }, + { "DayNarrows", + new String[] { + "G", + "L", // Note: contributed item in CDLR + "T", + "C", + "J", + "V", + "S", + } + }, + { "standalone.DayNarrows", + new String[] { + "g", + "l", + "t", + "c", + "j", + "v", + "s", + } + }, { "NumberElements", new String[] { ",", // decimal separator --- old/src/share/classes/sun/text/resources/cs/FormatData_cs.java 2012-12-03 11:41:53.000000000 +0900 +++ new/src/share/classes/sun/text/resources/cs/FormatData_cs.java 2012-12-03 11:41:52.000000000 +0900 @@ -141,6 +141,17 @@ "So" // abb Saturday } }, + { "DayNarrows", + new String[] { + "N", + "P", + "\u00da", + "S", + "\u010c", + "P", + "S", + } + }, { "AmPmMarkers", new String[] { "dop.", // am marker --- old/src/share/classes/sun/text/resources/da/FormatData_da.java 2012-12-03 11:41:55.000000000 +0900 +++ new/src/share/classes/sun/text/resources/da/FormatData_da.java 2012-12-03 11:41:54.000000000 +0900 @@ -124,6 +124,17 @@ "l\u00f8" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "M", + "T", + "O", + "T", + "F", + "L", + } + }, { "NumberElements", new String[] { ",", // decimal separator --- old/src/share/classes/sun/text/resources/de/FormatData_de.java 2012-12-03 11:42:00.000000000 +0900 +++ new/src/share/classes/sun/text/resources/de/FormatData_de.java 2012-12-03 11:41:59.000000000 +0900 @@ -124,6 +124,17 @@ "Sa" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "M", + "D", + "M", + "D", + "F", + "S", + } + }, { "Eras", new String[] { // era strings "v. Chr.", --- old/src/share/classes/sun/text/resources/el/FormatData_el.java 2012-12-03 11:42:02.000000000 +0900 +++ new/src/share/classes/sun/text/resources/el/FormatData_el.java 2012-12-03 11:42:01.000000000 +0900 @@ -124,6 +124,17 @@ "\u03a3\u03b1\u03b2" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u039a", + "\u0394", + "\u03a4", + "\u03a4", + "\u03a0", + "\u03a0", + "\u03a3", + } + }, { "AmPmMarkers", new String[] { "\u03c0\u03bc", // am marker --- old/src/share/classes/sun/text/resources/es/FormatData_es.java 2012-12-03 11:42:05.000000000 +0900 +++ new/src/share/classes/sun/text/resources/es/FormatData_es.java 2012-12-03 11:42:04.000000000 +0900 @@ -104,6 +104,17 @@ "s\u00e1b" // abb Saturday } }, + { "DayNarrows", + new String[] { + "D", + "L", + "M", + "X", + "J", + "V", + "S", + } + }, { "NumberPatterns", new String[] { "#,##0.###;-#,##0.###", // decimal pattern --- old/src/share/classes/sun/text/resources/et/FormatData_et.java 2012-12-03 11:42:08.000000000 +0900 +++ new/src/share/classes/sun/text/resources/et/FormatData_et.java 2012-12-03 11:42:07.000000000 +0900 @@ -104,6 +104,17 @@ "L" // abb Saturday } }, + { "DayNarrows", + new String[] { + "P", + "E", + "T", + "K", + "N", + "R", + "L", + } + }, { "Eras", new String[] { // era strings "e.m.a.", --- old/src/share/classes/sun/text/resources/fi/FormatData_fi.java 2012-12-03 11:42:10.000000000 +0900 +++ new/src/share/classes/sun/text/resources/fi/FormatData_fi.java 2012-12-03 11:42:10.000000000 +0900 @@ -116,6 +116,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "T", + "H", + "M", + "H", + "T", + "K", + "H", + "E", + "S", + "L", + "M", + "J", + "", + } + }, { "DayNames", new String[] { "sunnuntai", // Sunday @@ -138,6 +155,28 @@ "la" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "M", + "T", + "K", + "T", + "P", + "L", + } + }, + { "standalone.DayNarrows", + new String[] { + "S", + "M", + "T", + "K", + "T", + "P", + "L", + } + }, { "NumberElements", new String[] { ",", // decimal separator @@ -181,6 +220,12 @@ "ip." // pm marker } }, + { "narrow.AmPmMarkers", + new String[] { + "ap.", + "ip.", + } + }, }; } } --- old/src/share/classes/sun/text/resources/fr/FormatData_fr.java 2012-12-03 11:42:13.000000000 +0900 +++ new/src/share/classes/sun/text/resources/fr/FormatData_fr.java 2012-12-03 11:42:12.000000000 +0900 @@ -104,6 +104,17 @@ "sam." // abb Saturday } }, + { "DayNarrows", + new String[] { + "D", + "L", + "M", + "M", + "J", + "V", + "S", + } + }, { "Eras", new String[] { // era strings "BC", --- old/src/share/classes/sun/text/resources/hi/FormatData_hi_IN.java 2012-12-03 11:42:16.000000000 +0900 +++ new/src/share/classes/sun/text/resources/hi/FormatData_hi_IN.java 2012-12-03 11:42:15.000000000 +0900 @@ -99,6 +99,17 @@ "\u0936\u0928\u093f" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u0930", + "\u0938\u094b", + "\u092e\u0902", + "\u092c\u0941", + "\u0917\u0941", + "\u0936\u0941", + "\u0936", + } + }, { "AmPmMarkers", new String[] { "\u092a\u0942\u0930\u094d\u0935\u093e\u0939\u094d\u0928", // am marker --- old/src/share/classes/sun/text/resources/hr/FormatData_hr.java 2012-12-03 11:42:18.000000000 +0900 +++ new/src/share/classes/sun/text/resources/hr/FormatData_hr.java 2012-12-03 11:42:18.000000000 +0900 @@ -116,6 +116,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "1.", + "2.", + "3.", + "4.", + "5.", + "6.", + "7.", + "8.", + "9.", + "10.", + "11.", + "12.", + "", + } + }, { "DayNames", new String[] { "nedjelja", // Sunday @@ -138,6 +155,28 @@ "sub" // abb Saturday } }, + { "DayNarrows", + new String[] { + "N", + "P", + "U", + "S", + "\u010c", + "P", + "S", + } + }, + { "standalone.DayNarrows", + new String[] { + "n", + "p", + "u", + "s", + "\u010d", + "p", + "s", + } + }, { "NumberElements", new String[] { ",", // decimal separator --- old/src/share/classes/sun/text/resources/hu/FormatData_hu.java 2012-12-03 11:42:22.000000000 +0900 +++ new/src/share/classes/sun/text/resources/hu/FormatData_hu.java 2012-12-03 11:42:21.000000000 +0900 @@ -104,6 +104,17 @@ "Szo" // abb Saturday } }, + { "DayNarrows", + new String[] { + "V", + "H", + "K", + "Sz", + "Cs", + "P", + "Sz", + } + }, { "AmPmMarkers", new String[] { "DE", // am marker --- old/src/share/classes/sun/text/resources/is/FormatData_is.java 2012-12-03 11:42:25.000000000 +0900 +++ new/src/share/classes/sun/text/resources/is/FormatData_is.java 2012-12-03 11:42:24.000000000 +0900 @@ -82,6 +82,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "j", + "f", + "m", + "a", + "m", + "j", + "j", + "\u00e1", + "s", + "o", + "n", + "d", + "", + } + }, { "DayNames", new String[] { "sunnudagur", // Sunday @@ -104,6 +121,28 @@ "lau." // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "M", + "\u00de", + "M", + "F", + "F", + "L", + } + }, + { "standalone.DayNarrows", + new String[] { + "s", + "m", + "\u00fe", + "m", + "f", + "f", + "l", + } + }, { "NumberElements", new String[] { ",", // decimal separator --- old/src/share/classes/sun/text/resources/it/FormatData_it.java 2012-12-03 11:42:28.000000000 +0900 +++ new/src/share/classes/sun/text/resources/it/FormatData_it.java 2012-12-03 11:42:27.000000000 +0900 @@ -121,6 +121,17 @@ "sab" // abb Saturday } }, + { "DayNarrows", + new String[] { + "D", + "L", + "M", + "M", + "G", + "V", + "S", + } + }, { "Eras", new String[] { // era strings "BC", --- old/src/share/classes/sun/text/resources/iw/FormatData_iw.java 2012-12-03 11:42:31.000000000 +0900 +++ new/src/share/classes/sun/text/resources/iw/FormatData_iw.java 2012-12-03 11:42:30.000000000 +0900 @@ -121,6 +121,28 @@ "\u05e9" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u05d0", + "\u05d1", + "\u05d2", + "\u05d3", + "\u05d4", + "\u05d5", + "\u05e9", + } + }, + { "standalone.DayNarrows", + new String[] { + "\u05d0", + "\u05d1", + "\u05d2", + "\u05d3", + "\u05d4", + "\u05d5", + "\u05e9", + } + }, { "Eras", new String[] { // era strings "\u05dc\u05e1\u05d4\"\u05e0", --- old/src/share/classes/sun/text/resources/ja/FormatData_ja.java 2012-12-03 11:42:33.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ja/FormatData_ja.java 2012-12-03 11:42:33.000000000 +0900 @@ -104,6 +104,17 @@ "\u571f" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u65e5", + "\u6708", + "\u706b", + "\u6c34", + "\u6728", + "\u91d1", + "\u571f", + } + }, { "AmPmMarkers", new String[] { "\u5348\u524d", // am marker --- old/src/share/classes/sun/text/resources/ko/FormatData_ko.java 2012-12-03 11:42:36.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ko/FormatData_ko.java 2012-12-03 11:42:35.000000000 +0900 @@ -104,6 +104,17 @@ "\ud1a0" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\uc77c", + "\uc6d4", + "\ud654", + "\uc218", + "\ubaa9", + "\uae08", + "\ud1a0", + } + }, { "AmPmMarkers", new String[] { "\uc624\uc804", // am marker --- old/src/share/classes/sun/text/resources/lt/FormatData_lt.java 2012-12-03 11:42:39.000000000 +0900 +++ new/src/share/classes/sun/text/resources/lt/FormatData_lt.java 2012-12-03 11:42:38.000000000 +0900 @@ -99,6 +99,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "S", + "V", + "K", + "B", + "G", + "B", + "L", + "R", + "R", + "S", + "L", + "G", + "", + } + }, { "DayNames", new String[] { "Sekmadienis", // Sunday @@ -121,6 +138,28 @@ "\u0160t" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "P", + "A", + "T", + "K", + "P", + "\u0160", + } + }, + { "standalone.DayNarrows", + new String[] { + "S", + "P", + "A", + "T", + "K", + "P", + "\u0160", + } + }, { "Eras", new String[] { // era strings "pr.Kr.", --- old/src/share/classes/sun/text/resources/lv/FormatData_lv.java 2012-12-03 11:42:42.000000000 +0900 +++ new/src/share/classes/sun/text/resources/lv/FormatData_lv.java 2012-12-03 11:42:41.000000000 +0900 @@ -121,6 +121,17 @@ "S" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "P", + "O", + "T", + "C", + "P", + "S", + } + }, { "Eras", new String[] { // era strings "pm\u0113", --- old/src/share/classes/sun/text/resources/mk/FormatData_mk.java 2012-12-03 11:42:45.000000000 +0900 +++ new/src/share/classes/sun/text/resources/mk/FormatData_mk.java 2012-12-03 11:42:44.000000000 +0900 @@ -104,6 +104,17 @@ "\u0441\u0430\u0431." // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u043d", + "\u043f", + "\u0432", + "\u0441", + "\u0447", + "\u043f", + "\u0441", + } + }, { "Eras", new String[] { // era strings "\u043f\u0440.\u043d.\u0435.", --- old/src/share/classes/sun/text/resources/ms/FormatData_ms.java 2012-12-03 11:42:47.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ms/FormatData_ms.java 2012-12-03 11:42:47.000000000 +0900 @@ -81,6 +81,23 @@ "", } }, + { "standalone.MonthNarrows", + new String[] { + "J", + "F", + "M", + "A", + "M", + "J", + "J", + "O", + "S", + "O", + "N", + "D", + "", + } + }, { "DayNames", new String[] { "Ahad", @@ -103,6 +120,28 @@ "Sab", } }, + { "DayNarrows", + new String[] { + "A", + "I", + "S", + "R", + "K", + "J", + "S", + } + }, + { "standalone.DayNarrows", + new String[] { + "A", + "I", + "S", + "R", + "K", + "J", + "S", + } + }, { "Eras", new String[] { "BCE", --- old/src/share/classes/sun/text/resources/mt/FormatData_mt.java 2012-12-03 11:42:50.000000000 +0900 +++ new/src/share/classes/sun/text/resources/mt/FormatData_mt.java 2012-12-03 11:42:49.000000000 +0900 @@ -103,6 +103,17 @@ "Sib", } }, + { "DayNarrows", + new String[] { + "\u0126", + "T", + "T", + "E", + "\u0126", + "\u0120", + "S", + } + }, { "AmPmMarkers", new String[] { "QN", --- old/src/share/classes/sun/text/resources/nl/FormatData_nl.java 2012-12-03 11:42:53.000000000 +0900 +++ new/src/share/classes/sun/text/resources/nl/FormatData_nl.java 2012-12-03 11:42:52.000000000 +0900 @@ -104,6 +104,17 @@ "za" // abb Saturday } }, + { "DayNarrows", + new String[] { + "Z", + "M", + "D", + "W", + "D", + "V", + "Z", + } + }, { "Eras", new String[] { // era strings for GregorianCalendar "v. Chr.", --- old/src/share/classes/sun/text/resources/pl/FormatData_pl.java 2012-12-03 11:42:55.000000000 +0900 +++ new/src/share/classes/sun/text/resources/pl/FormatData_pl.java 2012-12-03 11:42:55.000000000 +0900 @@ -121,6 +121,17 @@ "So" // abb Saturday } }, + { "DayNarrows", + new String[] { + "N", + "P", + "W", + "\u015a", + "C", + "P", + "S", + } + }, { "Eras", new String[] { // era strings "p.n.e.", --- old/src/share/classes/sun/text/resources/pt/FormatData_pt.java 2012-12-03 11:42:58.000000000 +0900 +++ new/src/share/classes/sun/text/resources/pt/FormatData_pt.java 2012-12-03 11:42:57.000000000 +0900 @@ -104,6 +104,17 @@ "S\u00e1b" // abb Saturday } }, + { "DayNarrows", + new String[] { + "D", + "S", + "T", + "Q", + "Q", + "S", + "S", + } + }, { "NumberElements", new String[] { ",", // decimal al separator --- old/src/share/classes/sun/text/resources/ro/FormatData_ro.java 2012-12-03 11:43:01.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ro/FormatData_ro.java 2012-12-03 11:43:00.000000000 +0900 @@ -82,6 +82,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "I", + "F", + "M", + "A", + "M", + "I", + "I", + "A", + "S", + "O", + "N", + "D", + "", + } + }, { "DayNames", new String[] { "duminic\u0103", // Sunday @@ -104,6 +121,29 @@ "S" // abb Saturday } }, + // commented out DayNarrows because most names are contributed. +// { "DayNarrows", +// new String[] { +// "D", +// "", +// "", +// "", +// "", +// "", +// "", +// } +// }, + { "standalone.DayNarrows", + new String[] { + "D", + "L", + "M", + "M", + "J", + "V", + "S", + } + }, { "Eras", new String[] { // era strings "d.C.", --- old/src/share/classes/sun/text/resources/ru/FormatData_ru.java 2012-12-03 11:43:04.000000000 +0900 +++ new/src/share/classes/sun/text/resources/ru/FormatData_ru.java 2012-12-03 11:43:03.000000000 +0900 @@ -138,6 +138,28 @@ "\u0421\u0431" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u0412", + "\u041f\u043d", + "\u0412\u0442", + "\u0421", + "\u0427", + "\u041f", + "\u0421", // contributed item in CLDR + } + }, + { "standalone.DayNarrows", + new String[] { + "\u0412", + "\u041f", + "\u0412", + "\u0421", + "\u0427", + "\u041f", + "\u0421", + } + }, { "Eras", new String[] { // era strings "\u0434\u043e \u043d.\u044d.", --- old/src/share/classes/sun/text/resources/sk/FormatData_sk.java 2012-12-03 11:43:07.000000000 +0900 +++ new/src/share/classes/sun/text/resources/sk/FormatData_sk.java 2012-12-03 11:43:06.000000000 +0900 @@ -138,6 +138,17 @@ "So" // abb Saturday } }, + { "DayNarrows", + new String[] { + "N", + "P", + "U", + "S", + "\u0160", + "P", + "S", + } + }, { "Eras", new String[] { // era strings "pred n.l.", --- old/src/share/classes/sun/text/resources/sl/FormatData_sl.java 2012-12-03 11:43:10.000000000 +0900 +++ new/src/share/classes/sun/text/resources/sl/FormatData_sl.java 2012-12-03 11:43:09.000000000 +0900 @@ -121,6 +121,17 @@ "Sob" // abb Saturday } }, + { "DayNarrows", + new String[] { + "n", + "p", + "t", + "s", + "\u010d", + "p", + "s", + } + }, { "Eras", new String[] { // era strings "pr.n.\u0161.", --- old/src/share/classes/sun/text/resources/sq/FormatData_sq.java 2012-12-03 11:43:13.000000000 +0900 +++ new/src/share/classes/sun/text/resources/sq/FormatData_sq.java 2012-12-03 11:43:12.000000000 +0900 @@ -104,6 +104,17 @@ "Sht" // abb Saturday } }, + { "DayNarrows", + new String[] { + "D", + "H", + "M", + "M", + "E", + "P", + "S", + } + }, { "AmPmMarkers", new String[] { "PD", // am marker --- old/src/share/classes/sun/text/resources/sr/FormatData_sr.java 2012-12-03 11:43:16.000000000 +0900 +++ new/src/share/classes/sun/text/resources/sr/FormatData_sr.java 2012-12-03 11:43:15.000000000 +0900 @@ -103,12 +103,35 @@ "\u0441\u0443\u0431", } }, + { "DayNarrows", + new String[] { + "\u043d", + "\u043f", + "\u0443", + "\u0441", + "\u0447", + "\u043f", + "\u0441", + } + }, { "Eras", new String[] { "\u043f. \u043d. \u0435.", "\u043d. \u0435", } }, + { "short.Eras", + new String[] { + "\u043f. \u043d. \u0435.", + "\u043d. \u0435.", + } + }, + { "narrow.Eras", + new String[] { + "\u043f.\u043d.\u0435.", + "\u043d.\u0435.", + } + }, { "NumberPatterns", new String[] { "#,##0.###", --- old/src/share/classes/sun/text/resources/sv/FormatData_sv.java 2012-12-03 11:43:18.000000000 +0900 +++ new/src/share/classes/sun/text/resources/sv/FormatData_sv.java 2012-12-03 11:43:17.000000000 +0900 @@ -82,6 +82,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "J", + "F", + "M", + "A", + "M", + "J", + "J", + "A", + "S", + "O", + "N", + "D", + "", + } + }, { "DayNames", new String[] { "s\u00f6ndag", // Sunday @@ -104,12 +121,46 @@ "l\u00f6" // abb Saturday } }, + { "DayNarrows", + new String[] { + "S", + "M", + "T", + "O", + "T", + "F", + "L", + } + }, + { "standalone.DayNarrows", + new String[] { + "S", + "M", + "T", + "O", + "T", + "F", + "L", + } + }, + { "narrow.Eras", + new String[] { + "f.Kr.", + "e.Kr.", + } + }, { "AmPmMarkers", new String[] { "fm", // am marker "em" // pm marker } }, + { "narrow.AmPmMarkers", + new String[] { + "f", + "e", + } + }, { "NumberElements", new String[] { ",", // decimal separator --- old/src/share/classes/sun/text/resources/th/FormatData_th.java 2012-12-03 11:43:21.000000000 +0900 +++ new/src/share/classes/sun/text/resources/th/FormatData_th.java 2012-12-03 11:43:20.000000000 +0900 @@ -99,6 +99,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "\u0e21.\u0e04.", + "\u0e01.\u0e1e.", + "\u0e21\u0e35.\u0e04.", + "\u0e40\u0e21.\u0e22.", + "\u0e1e.\u0e04.", + "\u0e21\u0e34.\u0e22.", + "\u0e01.\u0e04.", + "\u0e2a.\u0e04.", + "\u0e01.\u0e22.", + "\u0e15.\u0e04.", + "\u0e1e.\u0e22.", + "\u0e18.\u0e04.", + "", + } + }, { "DayNames", new String[] { "\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c", // Sunday @@ -121,6 +138,17 @@ "\u0e2a." // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u0e2d", + "\u0e08", + "\u0e2d", + "\u0e1e", + "\u0e1e", + "\u0e28", + "\u0e2a", + } + }, { "AmPmMarkers", new String[] { "\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07", // am marker @@ -145,6 +173,12 @@ "\u0e04.\u0e28." } }, + { "narrow.Eras", + new String[] { + "\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.", + "\u0e04.\u0e28.", + } + }, { "buddhist.TimePatterns", timePatterns }, --- old/src/share/classes/sun/text/resources/tr/FormatData_tr.java 2012-12-03 11:43:24.000000000 +0900 +++ new/src/share/classes/sun/text/resources/tr/FormatData_tr.java 2012-12-03 11:43:23.000000000 +0900 @@ -82,6 +82,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "O", + "\u015e", + "M", + "N", + "M", + "H", + "T", + "A", + "E", + "E", + "K", + "A", + "", + } + }, { "DayNames", new String[] { "Pazar", // Sunday @@ -104,6 +121,17 @@ "Cmt" // abb Saturday } }, + { "DayNarrows", + new String[] { + "P", + "P", + "S", + "\u00c7", + "P", + "C", + "C", + } + }, { "NumberPatterns", new String[] { "#,##0.###;-#,##0.###", // decimal pattern --- old/src/share/classes/sun/text/resources/uk/FormatData_uk.java 2012-12-03 11:43:26.000000000 +0900 +++ new/src/share/classes/sun/text/resources/uk/FormatData_uk.java 2012-12-03 11:43:26.000000000 +0900 @@ -138,6 +138,17 @@ "\u0441\u0431" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u041d", + "\u041f", + "\u0412", + "\u0421", + "\u0427", + "\u041f", + "\u0421", + } + }, { "Eras", new String[] { // era strings "\u0434\u043e \u043d.\u0435.", --- old/src/share/classes/sun/text/resources/vi/FormatData_vi.java 2012-12-03 11:43:30.000000000 +0900 +++ new/src/share/classes/sun/text/resources/vi/FormatData_vi.java 2012-12-03 11:43:29.000000000 +0900 @@ -106,6 +106,17 @@ "Th 7" // abb Saturday } }, + { "DayNarrows", + new String[] { + "CN", + "T2", + "T3", + "T4", + "T5", + "T6", + "T7", + } + }, { "AmPmMarkers", new String[] { "SA", // am marker --- old/src/share/classes/sun/text/resources/zh/FormatData_zh.java 2012-12-03 11:43:32.000000000 +0900 +++ new/src/share/classes/sun/text/resources/zh/FormatData_zh.java 2012-12-03 11:43:31.000000000 +0900 @@ -82,6 +82,23 @@ "" // abb month 13 if applicable } }, + { "standalone.MonthNarrows", + new String[] { + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708", + "", + } + }, { "DayNames", new String[] { "\u661f\u671f\u65e5", // Sunday @@ -104,6 +121,17 @@ "\u661f\u671f\u516d" // abb Saturday } }, + { "DayNarrows", + new String[] { + "\u65e5", + "\u4e00", + "\u4e8c", + "\u4e09", + "\u56db", + "\u4e94", + "\u516d", + } + }, { "AmPmMarkers", new String[] { "\u4e0a\u5348", // am marker --- old/src/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java 2012-12-03 11:43:34.000000000 +0900 +++ new/src/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java 2012-12-03 11:43:34.000000000 +0900 @@ -89,11 +89,6 @@ } @Override - public TimeZoneNameProvider getTimeZoneNameProvider() { - return null; - } - - @Override public Locale[] getAvailableLocales() { Set all = createLanguageTagSet("All"); Locale[] locs = new Locale[all.size()]; --- old/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java 2012-12-03 11:43:37.000000000 +0900 +++ new/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java 2012-12-03 11:43:36.000000000 +0900 @@ -25,7 +25,6 @@ package sun.util.locale.provider; -import java.util.Calendar; import static java.util.Calendar.*; import java.util.Locale; import java.util.Map; --- old/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java 2012-12-03 11:43:40.000000000 +0900 +++ new/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java 2012-12-03 11:43:39.000000000 +0900 @@ -52,7 +52,7 @@ @Override public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { String name = null; - String key = getKey(calendarType, field, style); + String key = getResourceKey(calendarType, field, style); if (key != null) { ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); if (rb.containsKey(key)) { @@ -64,9 +64,10 @@ name = strings[value]; // If name is empty in standalone, try its `format' style. if (name.length() == 0 - && (style == SHORT_STANDALONE || style == LONG_STANDALONE)) { + && (style == SHORT_STANDALONE || style == LONG_STANDALONE + || style == NARROW_STANDALONE)) { name = getDisplayName(calendarType, field, value, - style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT, + getBaseStyle(style), locale); } } @@ -80,10 +81,9 @@ Map names; if (style == ALL_STYLES) { names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale); - if (field != AM_PM) { - for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) { - names.putAll(getDisplayNamesImpl(calendarType, field, st, locale)); - } + for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE, + NARROW_FORMAT, NARROW_STANDALONE }) { + names.putAll(getDisplayNamesImpl(calendarType, field, st, locale)); } } else { // specific style @@ -94,26 +94,28 @@ private Map getDisplayNamesImpl(String calendarType, int field, int style, Locale locale) { - String key = getKey(calendarType, field, style); + String key = getResourceKey(calendarType, field, style); Map map = new TreeMap<>(LengthBasedComparator.INSTANCE); if (key != null) { ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); if (rb.containsKey(key)) { String[] strings = rb.getStringArray(key); - if (field == YEAR) { - if (strings.length > 0) { - map.put(strings[0], 1); - } - } else { - int base = (field == DAY_OF_WEEK) ? 1 : 0; - for (int i = 0; i < strings.length; i++) { - String name = strings[i]; - // Ignore any empty string (some standalone month names - // are not defined) - if (name.length() == 0) { - continue; + if (!hasDuplicates(strings)) { + if (field == YEAR) { + if (strings.length > 0) { + map.put(strings[0], 1); + } + } else { + int base = (field == DAY_OF_WEEK) ? 1 : 0; + for (int i = 0; i < strings.length; i++) { + String name = strings[i]; + // Ignore any empty string (some standalone month names + // are not defined) + if (name.length() == 0) { + continue; + } + map.put(name, base + i); } - map.put(name, base + i); } } } @@ -121,6 +123,10 @@ return map; } + private int getBaseStyle(int style) { + return style & ~(SHORT_STANDALONE - SHORT_FORMAT); + } + /** * Comparator implementation for TreeMap which iterates keys from longest * to shortest. @@ -180,55 +186,92 @@ return langtags; } - private int getIntData(String key, Locale locale) { - ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getCalendarData(locale); - if (rb.containsKey(key)) { - String firstday = rb.getString(key); - return Integer.parseInt(firstday); - } - // Note that the base bundle of CLDR doesn't have the Calendar week parameters. - return 0; + private boolean hasDuplicates(String[] strings) { + int len = strings.length; + for (int i = 0; i < len - 1; i++) { + String a = strings[i]; + if (a != null) { + for (int j = i + 1; j < len; j++) { + if (a.equals(strings[j])) { + return true; + } + } + } + } + return false; } - private String getKey(String type, int field, int style) { - boolean standalone = (style & 0x8000) != 0; - style &= ~0x8000; + private String getResourceKey(String type, int field, int style) { + int baseStyle = getBaseStyle(style); + boolean isStandalone = (style != baseStyle); if ("gregory".equals(type)) { type = null; } - + boolean isNarrow = (baseStyle == NARROW_FORMAT); StringBuilder key = new StringBuilder(); switch (field) { case ERA: if (type != null) { key.append(type).append('.'); } - if (style == SHORT) { - key.append("short."); + if (isNarrow) { + key.append("narrow."); + } else { + // JRE and CLDR use different resource key conventions + // due to historical reasons. (JRE DateFormatSymbols.getEras returns + // abbreviations while other getShort*() return abbreviations.) + if (this.type == LocaleProviderAdapter.Type.JRE) { + if (baseStyle == SHORT) { + key.append("short."); + } + } else { // CLDR + if (baseStyle == LONG) { + key.append("long."); + } + } } key.append("Eras"); break; case YEAR: - key.append(type).append(".FirstYear"); + if (!isNarrow) { + key.append(type).append(".FirstYear"); + } break; case MONTH: - if (standalone) { + if (isStandalone) { key.append("standalone."); } - key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames"); + key.append("Month").append(toStyleName(baseStyle)); break; case DAY_OF_WEEK: - key.append(style == SHORT ? "DayAbbreviations" : "DayNames"); + // support standalone narrow day names + if (isStandalone && isNarrow) { + key.append("standalone."); + } + key.append("Day").append(toStyleName(baseStyle)); break; case AM_PM: + if (isNarrow) { + key.append("narrow."); + } key.append("AmPmMarkers"); break; } return key.length() > 0 ? key.toString() : null; } + + private String toStyleName(int baseStyle) { + switch (baseStyle) { + case SHORT: + return "Abbreviations"; + case NARROW_FORMAT: + return "Narrows"; + } + return "Names"; + } } --- old/src/share/classes/sun/util/locale/provider/LocaleResources.java 2012-12-03 11:43:43.000000000 +0900 +++ new/src/share/classes/sun/util/locale/provider/LocaleResources.java 2012-12-03 11:43:42.000000000 +0900 @@ -46,7 +46,7 @@ import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import sun.util.resources.OpenListResourceBundle; +import sun.util.resources.TimeZoneNamesBundle; /** * Central accessor to locale-dependent resources. @@ -67,11 +67,11 @@ this.locale = locale; } - public OpenListResourceBundle getTimeZoneNames() { - OpenListResourceBundle tznames = (OpenListResourceBundle) cache.get("TimeZoneNames"); + public TimeZoneNamesBundle getTimeZoneNames() { + TimeZoneNamesBundle tznames = (TimeZoneNamesBundle) cache.get("TimeZoneNames"); if (tznames == null) { tznames = adapter.getLocaleData().getTimeZoneNames(locale); - OpenListResourceBundle olrb = (OpenListResourceBundle) cache.putIfAbsent("TimeZoneNames", tznames); + TimeZoneNamesBundle olrb = (TimeZoneNamesBundle) cache.putIfAbsent("TimeZoneNames", tznames); if (olrb != null) { tznames = olrb; } --- old/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java 2012-12-03 11:43:46.000000000 +0900 +++ new/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java 2012-12-03 11:43:45.000000000 +0900 @@ -604,5 +604,12 @@ assert tznp != null; return tznp.getDisplayName(ID, daylight, style, locale); } + + @Override + public String getGenericDisplayName(String ID, int style, Locale locale) { + TimeZoneNameProvider tznp = getImpl(locale); + assert tznp != null; + return tznp.getGenericDisplayName(ID, style, locale); + } } } --- old/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java 2012-12-03 11:43:49.000000000 +0900 +++ new/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java 2012-12-03 11:43:48.000000000 +0900 @@ -25,11 +25,14 @@ package sun.util.locale.provider; +import java.util.LinkedHashSet; import java.util.Locale; -import java.util.ResourceBundle; +import java.util.Map; import java.util.Set; import java.util.TimeZone; import java.util.spi.TimeZoneNameProvider; +import sun.util.calendar.ZoneInfo; +import sun.util.resources.TimeZoneNamesBundle; /** * Concrete implementation of the @@ -96,21 +99,67 @@ */ @Override public String getDisplayName(String id, boolean daylight, int style, Locale locale) { + String[] names = getDisplayNameArray(id, 5, locale); + if (names != null) { + int index = daylight ? 3 : 1; + if (style == TimeZone.SHORT) { + index++; + } + return names[index]; + } + return null; + } + + @Override + public String getGenericDisplayName(String id, int style, Locale locale) { + String[] names = getDisplayNameArray(id, 7, locale); + if (names != null && names.length >= 7) { + return names[(style == TimeZone.LONG) ? 5 : 6]; + } + return null; + } + + private String[] getDisplayNameArray(String id, int n, Locale locale) { if (id == null || locale == null) { throw new NullPointerException(); } + LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type); + TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames(); + return rb.containsKey(id) ? rb.getStringArray(id, n) : null; + } + /** + * Returns a String[][] as the DateFormatSymbols.getZoneStrings() value for + * the given locale. This method is package private. + * + * @param locale a Locale for time zone names + * @return an array of time zone names arrays + */ + String[][] getZoneStrings(Locale locale) { LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type); - ResourceBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames(); - if (rb.containsKey(id)) { - String[] names = rb.getStringArray(id); - int index = daylight ? 3 : 1; - if (style == TimeZone.SHORT) { - index++; + TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames(); + Set keyset = rb.keySet(); + // Use a LinkedHashSet to preseve the order + Set value = new LinkedHashSet<>(); + for (String key : keyset) { + value.add(rb.getStringArray(key)); + } + + // Add aliases data for CLDR + if (type == LocaleProviderAdapter.Type.CLDR) { + // Note: TimeZoneNamesBundle creates a String[] on each getStringArray call. + Map aliases = ZoneInfo.getAliasTable(); + for (String alias : aliases.keySet()) { + if (!keyset.contains(alias)) { + String tzid = aliases.get(alias); + if (keyset.contains(tzid)) { + String[] val = rb.getStringArray(tzid); + val[0] = alias; + value.add(val); + } } - return names[index]; } - - return null; + } + return value.toArray(new String[0][]); } } --- old/src/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java 2012-12-03 11:43:52.000000000 +0900 +++ new/src/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java 2012-12-03 11:43:51.000000000 +0900 @@ -26,28 +26,28 @@ package sun.util.locale.provider; import java.lang.ref.SoftReference; -import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.spi.TimeZoneNameProvider; import sun.util.calendar.ZoneInfo; import sun.util.resources.OpenListResourceBundle; +import sun.util.resources.TimeZoneNamesBundle; /** * Utility class that deals with the localized time zone names * * @author Naoto Sato + * @author Masayoshi Okutsu */ public final class TimeZoneNameUtility { /** * cache to hold time zone resource bundles. Keyed by Locale */ - private static ConcurrentHashMap> cachedBundles = + private static ConcurrentHashMap> cachedBundles = new ConcurrentHashMap<>(); /** @@ -73,15 +73,19 @@ } private static String[][] loadZoneStrings(Locale locale) { + // If the provider is a TimeZoneNameProviderImpl, call its getZoneStrings + // in order to avoid per-ID retrieval. + LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(TimeZoneNameProvider.class, locale); + TimeZoneNameProvider provider = adapter.getTimeZoneNameProvider(); + if (provider instanceof TimeZoneNameProviderImpl) { + return ((TimeZoneNameProviderImpl)provider).getZoneStrings(locale); + } + + // Performs per-ID retrieval. List zones = new LinkedList<>(); OpenListResourceBundle rb = getBundle(locale); - Enumeration keys = rb.getKeys(); - String[] names; - - while(keys.hasMoreElements()) { - String key = keys.nextElement(); - - names = retrieveDisplayNames(rb, key, locale); + for (String key : rb.keySet()) { + String[] names = retrieveDisplayNamesImpl(key, locale); if (names != null) { zones.add(names); } @@ -95,24 +99,50 @@ * Retrieve display names for a time zone ID. */ public static String[] retrieveDisplayNames(String id, Locale locale) { - OpenListResourceBundle rb = getBundle(locale); - return retrieveDisplayNames(rb, id, locale); - } - - private static String[] retrieveDisplayNames(OpenListResourceBundle rb, - String id, Locale locale) { if (id == null || locale == null) { throw new NullPointerException(); } + return retrieveDisplayNamesImpl(id, locale); + } + + /** + * Retrieves a generic time zone display name for a time zone ID. + * + * @param id time zone ID + * @param style TimeZone.LONG or TimeZone.SHORT + * @param locale desired Locale + * @return the requested generic time zone display name, or null if not found. + */ + public static String retrieveGenericDisplayName(String id, int style, Locale locale) { + LocaleServiceProviderPool pool = + LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class); + return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, "generic", style, id); + } + + /** + * Retrieves a standard or daylight-saving time name for the given time zone ID. + * + * @param id time zone ID + * @param daylight true for a daylight saving time name, or false for a standard time name + * @param style TimeZone.LONG or TimeZone.SHORT + * @param locale desired Locale + * @return the requested time zone name, or null if not found. + */ + public static String retrieveDisplayName(String id, boolean daylight, int style, Locale locale) { + LocaleServiceProviderPool pool = + LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class); + return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, daylight ? "dst" : "std", style, id); + } + private static String[] retrieveDisplayNamesImpl(String id, Locale locale) { LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class); - return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, id); + return pool.getLocalizedObject(TimeZoneNameArrayGetter.INSTANCE, locale, id); } - private static OpenListResourceBundle getBundle(Locale locale) { - OpenListResourceBundle rb; - SoftReference data = cachedBundles.get(locale); + private static TimeZoneNamesBundle getBundle(Locale locale) { + TimeZoneNamesBundle rb; + SoftReference data = cachedBundles.get(locale); if (data == null || ((rb = data.get()) == null)) { rb = LocaleProviderAdapter.forJRE().getLocaleData().getTimeZoneNames(locale); @@ -127,19 +157,18 @@ * Obtains a localized time zone strings from a TimeZoneNameProvider * implementation. */ - private static class TimeZoneNameGetter + private static class TimeZoneNameArrayGetter implements LocaleServiceProviderPool.LocalizedObjectGetter{ - private static final TimeZoneNameGetter INSTANCE = - new TimeZoneNameGetter(); + private static final TimeZoneNameArrayGetter INSTANCE = + new TimeZoneNameArrayGetter(); @Override public String[] getObject(TimeZoneNameProvider timeZoneNameProvider, - Locale locale, - String requestID, - Object... params) { + Locale locale, + String requestID, + Object... params) { assert params.length == 0; - String queryID = requestID; // First, try to get names with the request ID String[] names = buildZoneStrings(timeZoneNameProvider, locale, requestID); @@ -150,21 +179,15 @@ if (aliases != null) { // Check whether this id is an alias, if so, // look for the standard id. - if (aliases.containsKey(queryID)) { - String prevID = queryID; - while ((queryID = aliases.get(queryID)) != null) { - prevID = queryID; - } - queryID = prevID; + String canonicalID = aliases.get(requestID); + if (canonicalID != null) { + names = buildZoneStrings(timeZoneNameProvider, locale, canonicalID); } - - names = buildZoneStrings(timeZoneNameProvider, locale, queryID); - if (names == null) { // There may be a case that a standard id has become an // alias. so, check the aliases backward. names = examineAliases(timeZoneNameProvider, locale, - queryID, aliases, aliases.entrySet()); + canonicalID == null ? requestID : canonicalID, aliases); } } } @@ -178,20 +201,18 @@ private static String[] examineAliases(TimeZoneNameProvider tznp, Locale locale, String id, - Map aliases, - Set> aliasesSet) { + Map aliases) { if (aliases.containsValue(id)) { - for (Map.Entry entry : aliasesSet) { + for (Map.Entry entry : aliases.entrySet()) { if (entry.getValue().equals(id)) { String alias = entry.getKey(); String[] names = buildZoneStrings(tznp, locale, alias); if (names != null) { return names; - } else { - names = examineAliases(tznp, locale, alias, aliases, aliasesSet); - if (names != null) { - return names; - } + } + names = examineAliases(tznp, locale, alias, aliases); + if (names != null) { + return names; } } } @@ -201,7 +222,7 @@ } private static String[] buildZoneStrings(TimeZoneNameProvider tznp, - Locale locale, String id) { + Locale locale, String id) { String[] names = new String[5]; for (int i = 1; i <= 4; i ++) { @@ -220,6 +241,77 @@ } } + private static class TimeZoneNameGetter + implements LocaleServiceProviderPool.LocalizedObjectGetter { + private static final TimeZoneNameGetter INSTANCE = + new TimeZoneNameGetter(); + + @Override + public String getObject(TimeZoneNameProvider timeZoneNameProvider, + Locale locale, + String requestID, + Object... params) { + assert params.length == 2; + int style = (int) params[0]; + String tzid = (String) params[1]; + String value = getName(timeZoneNameProvider, locale, requestID, style, tzid); + if (value == null) { + Map aliases = ZoneInfo.getAliasTable(); + if (aliases != null) { + String canonicalID = aliases.get(tzid); + if (canonicalID != null) { + value = getName(timeZoneNameProvider, locale, requestID, style, canonicalID); + } + if (value == null) { + value = examineAliases(timeZoneNameProvider, locale, requestID, + canonicalID != null ? canonicalID : tzid, style, aliases); + } + } + } + + return value; + } + + private static String examineAliases(TimeZoneNameProvider tznp, Locale locale, + String requestID, String tzid, int style, + Map aliases) { + if (aliases.containsValue(tzid)) { + for (Map.Entry entry : aliases.entrySet()) { + if (entry.getValue().equals(tzid)) { + String alias = entry.getKey(); + String name = getName(tznp, locale, requestID, style, alias); + if (name != null) { + return name; + } + name = examineAliases(tznp, locale, requestID, alias, style, aliases); + if (name != null) { + return name; + } + } + } + } + return null; + } + + private static String getName(TimeZoneNameProvider timeZoneNameProvider, + Locale locale, String requestID, int style, String tzid) { + String value = null; + switch (requestID) { + case "std": + value = timeZoneNameProvider.getDisplayName(tzid, false, style, locale); + break; + case "dst": + value = timeZoneNameProvider.getDisplayName(tzid, true, style, locale); + break; + case "generic": + value = timeZoneNameProvider.getGenericDisplayName(tzid, style, locale); + break; + } + return value; + } + } + // No instantiation private TimeZoneNameUtility() { } --- old/src/share/classes/sun/util/resources/LocaleData.java 2012-12-03 11:43:55.000000000 +0900 +++ new/src/share/classes/sun/util/resources/LocaleData.java 2012-12-03 11:43:54.000000000 +0900 @@ -46,9 +46,9 @@ import java.util.List; import java.util.Locale; import java.util.ResourceBundle; +import sun.util.locale.provider.LocaleDataMetaInfo; import sun.util.locale.provider.LocaleProviderAdapter; import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE; -import sun.util.locale.provider.LocaleDataMetaInfo; /** * Provides information about and access to resource bundles in the @@ -94,8 +94,8 @@ * Gets a time zone names resource bundle, using privileges * to allow accessing a sun.* package. */ - public OpenListResourceBundle getTimeZoneNames(Locale locale) { - return (OpenListResourceBundle) getBundle(type.getUtilResourcesPackage() + ".TimeZoneNames", locale); + public TimeZoneNamesBundle getTimeZoneNames(Locale locale) { + return (TimeZoneNamesBundle) getBundle(type.getUtilResourcesPackage() + ".TimeZoneNames", locale); } /** @@ -158,30 +158,33 @@ /* Get the locale string list from LocaleDataMetaInfo class. */ String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName); - if (localeString == null || localeString.length() == 0) { - return candidates; - } - - for (Iterator l = candidates.iterator(); l.hasNext(); ) { - Locale loc = l.next(); - String lstr; - if (loc.getScript().length() > 0) { - lstr = loc.toLanguageTag().replace('-', '_'); - } else { - lstr = loc.toString(); - int idx = lstr.indexOf("_#"); - if (idx >= 0) { - lstr = lstr.substring(0, idx); + if (localeString != null && localeString.length() != 0) { + for (Iterator l = candidates.iterator(); l.hasNext();) { + Locale loc = l.next(); + String lstr; + if (loc.getScript().length() > 0) { + lstr = loc.toLanguageTag().replace('-', '_'); + } else { + lstr = loc.toString(); + int idx = lstr.indexOf("_#"); + if (idx >= 0) { + lstr = lstr.substring(0, idx); + } + } + /* Every locale string in the locale string list returned from + the above getSupportedLocaleString is enclosed + within two white spaces so that we could check some locale + such as "en". + */ + if (lstr.length() != 0 && localeString.indexOf(" " + lstr + " ") == -1) { + l.remove(); } } - /* Every locale string in the locale string list returned from - the above getSupportedLocaleString is enclosed - within two white spaces so that we could check some locale - such as "en". - */ - if (lstr.length() != 0 && localeString.indexOf(" " + lstr + " ") == -1) { - l.remove(); - } + } + // Force fallback to Locale.ENGLISH for CLDR time zone names support + if (locale.getLanguage() != "en" + && baseName.contains(CLDR) && baseName.endsWith("TimeZoneNames")) { + candidates.add(candidates.size() - 1, Locale.ENGLISH); } return candidates; } --- old/src/share/classes/sun/util/resources/OpenListResourceBundle.java 2012-12-03 11:43:58.000000000 +0900 +++ new/src/share/classes/sun/util/resources/OpenListResourceBundle.java 2012-12-03 11:43:57.000000000 +0900 @@ -67,6 +67,7 @@ } // Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification. + @Override public Object handleGetObject(String key) { if (key == null) { throw new NullPointerException(); @@ -79,6 +80,7 @@ /** * Implementation of ResourceBundle.getKeys. */ + @Override public Enumeration getKeys() { ResourceBundle parent = this.parent; return new ResourceBundleEnumeration(handleGetKeys(), @@ -86,7 +88,8 @@ } /** - * Returns a set of keys provided in this resource bundle + * Returns a set of keys provided in this resource bundle, + * including no parents. */ public Set handleGetKeys() { loadLookupTablesIfNecessary(); @@ -99,7 +102,7 @@ if (keyset != null) { return keyset; } - Set ks = new HashSet<>(); + Set ks = createSet(); ks.addAll(handleGetKeys()); if (parent != null) { ks.addAll(parent.keySet()); @@ -113,13 +116,6 @@ } /** - * Returns the parent bundle - */ - public OpenListResourceBundle getParent() { - return (OpenListResourceBundle)parent; - } - - /** * See ListResourceBundle class description. */ abstract protected Object[][] getContents(); @@ -160,10 +156,14 @@ * Lets subclasses provide specialized Map implementations. * Default uses HashMap. */ - protected Map createMap(int size) { + protected Map createMap(int size) { return new HashMap<>(size); } + protected Set createSet() { + return new HashSet<>(); + } + private volatile Map lookup = null; private volatile Set keyset; } --- old/src/share/classes/sun/util/resources/TimeZoneNames.java 2012-12-03 11:44:01.000000000 +0900 +++ new/src/share/classes/sun/util/resources/TimeZoneNames.java 2012-12-03 11:43:59.000000000 +0900 @@ -43,160 +43,238 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { protected final Object[][] getContents() { + // Note: generic names came from CLDR with some adjustments. String ACT[] = new String[] {"Acre Time", "ACT", - "Acre Summer Time", "ACST"}; + "Acre Summer Time", "ACST", + "Acre Time", "ACT"}; String ADELAIDE[] = new String[] {"Central Standard Time (South Australia)", "CST", - "Central Summer Time (South Australia)", "CST"}; + "Central Summer Time (South Australia)", "CST", + "Central Time (South Australia)", "CT"}; String AGT[] = new String[] {"Argentine Time", "ART", - "Argentine Summer Time", "ARST"}; + "Argentine Summer Time", "ARST", + "Argentine Time", "ART"}; String AKST[] = new String[] {"Alaska Standard Time", "AKST", - "Alaska Daylight Time", "AKDT"}; + "Alaska Daylight Time", "AKDT", + "Alaska Time", "AKT"}; String AMT[] = new String[] {"Amazon Time", "AMT", - "Amazon Summer Time", "AMST"}; + "Amazon Summer Time", "AMST", + "Amazon Time", "AMT"}; String ARAST[] = new String[] {"Arabia Standard Time", "AST", - "Arabia Daylight Time", "ADT"}; + "Arabia Daylight Time", "ADT", + "Arabia Time", "AT"}; String ARMT[] = new String[] {"Armenia Time", "AMT", - "Armenia Summer Time", "AMST"}; + "Armenia Summer Time", "AMST", + "Armenia Time", "AMT"}; String AST[] = new String[] {"Atlantic Standard Time", "AST", - "Atlantic Daylight Time", "ADT"}; + "Atlantic Daylight Time", "ADT", + "Atlantic Time", "AT"}; String BDT[] = new String[] {"Bangladesh Time", "BDT", - "Bangladesh Summer Time", "BDST"}; + "Bangladesh Summer Time", "BDST", + "Bangladesh Time", "BDT"}; String BRISBANE[] = new String[] {"Eastern Standard Time (Queensland)", "EST", - "Eastern Summer Time (Queensland)", "EST"}; + "Eastern Summer Time (Queensland)", "EST", + "Eastern Time (Queensland)", "ET"}; String BROKEN_HILL[] = new String[] {"Central Standard Time (South Australia/New South Wales)", "CST", - "Central Summer Time (South Australia/New South Wales)", "CST"}; + "Central Summer Time (South Australia/New South Wales)", "CST", + "Central Time (South Australia/New South Wales)", "CT"}; String BRT[] = new String[] {"Brasilia Time", "BRT", - "Brasilia Summer Time", "BRST"}; + "Brasilia Summer Time", "BRST", + "Brasilia Time", "BRT"}; String BTT[] = new String[] {"Bhutan Time", "BTT", - "Bhutan Summer Time", "BTST"}; + "Bhutan Summer Time", "BTST", + "Bhutan Time", "BTT"}; String CAT[] = new String[] {"Central African Time", "CAT", - "Central African Summer Time", "CAST"}; + "Central African Summer Time", "CAST", + "Central Africa Time", "CAT"}; String CET[] = new String[] {"Central European Time", "CET", - "Central European Summer Time", "CEST"}; + "Central European Summer Time", "CEST", + "Central European Time", "CET"}; String CHAST[] = new String[] {"Chatham Standard Time", "CHAST", - "Chatham Daylight Time", "CHADT"}; + "Chatham Daylight Time", "CHADT", + "Chatham Time", "CHAT"}; String CHUT[] = new String[] {"Chuuk Time", "CHUT", - "Chuuk Summer Time", "CHUST"}; + "Chuuk Summer Time", "CHUST", + "Chuuk Time", "CHUT"}; String CIT[] = new String[] {"Central Indonesia Time", "CIT", - "Central Indonesia Summer Time", "CIST"}; + "Central Indonesia Summer Time", "CIST", + "Central Indonesia Time", "CIT"}; String CLT[] = new String[] {"Chile Time", "CLT", - "Chile Summer Time", "CLST"}; + "Chile Summer Time", "CLST", + "Chile Time", "CLT"}; String CST[] = new String[] {"Central Standard Time", "CST", - "Central Daylight Time", "CDT"}; + "Central Daylight Time", "CDT", + "Central Time", "CT"}; String CTT[] = new String[] {"China Standard Time", "CST", - "China Daylight Time", "CDT"}; + "China Daylight Time", "CDT", + "China Time", "CT"}; String CUBA[] = new String[] {"Cuba Standard Time", "CST", - "Cuba Daylight Time", "CDT"}; + "Cuba Daylight Time", "CDT", + "Cuba Time", "CT"}; String DARWIN[] = new String[] {"Central Standard Time (Northern Territory)", "CST", - "Central Summer Time (Northern Territory)", "CST"}; + "Central Summer Time (Northern Territory)", "CST", + "Central Time (Northern Territory)", "CT"}; String DUBLIN[] = new String[] {"Greenwich Mean Time", "GMT", - "Irish Summer Time", "IST"}; + "Irish Summer Time", "IST", + "Irish Time", "IT"}; String EAT[] = new String[] {"Eastern African Time", "EAT", - "Eastern African Summer Time", "EAST"}; + "Eastern African Summer Time", "EAST", + "Eastern Africa Time", "EAT"}; String EASTER[] = new String[] {"Easter Is. Time", "EAST", - "Easter Is. Summer Time", "EASST"}; + "Easter Is. Summer Time", "EASST", + "Easter Is. Time", "EAST"}; String EET[] = new String[] {"Eastern European Time", "EET", - "Eastern European Summer Time", "EEST"}; + "Eastern European Summer Time", "EEST", + "Eastern European Time", "EET"}; String EGT[] = new String[] {"Eastern Greenland Time", "EGT", - "Eastern Greenland Summer Time", "EGST"}; + "Eastern Greenland Summer Time", "EGST", + "Eastern Greenland Time", "EGT"}; String EST[] = new String[] {"Eastern Standard Time", "EST", - "Eastern Daylight Time", "EDT"}; + "Eastern Daylight Time", "EDT", + "Eastern Time", "ET"}; String EST_NSW[] = new String[] {"Eastern Standard Time (New South Wales)", "EST", - "Eastern Summer Time (New South Wales)", "EST"}; + "Eastern Summer Time (New South Wales)", "EST", + "Eastern Time (New South Wales)", "ET"}; String FET[] = new String[] {"Further-eastern European Time", "FET", - "Further-eastern European Summer Time", "FEST"}; + "Further-eastern European Summer Time", "FEST", + "Further-eastern European Time", "FET"}; String GHMT[] = new String[] {"Ghana Mean Time", "GMT", - "Ghana Summer Time", "GHST"}; + "Ghana Summer Time", "GHST", + "Ghana Mean Time", "GMT"}; String GAMBIER[] = new String[] {"Gambier Time", "GAMT", - "Gambier Summer Time", "GAMST"}; + "Gambier Summer Time", "GAMST", + "Gambier Time", "GAMT"}; String GMT[] = new String[] {"Greenwich Mean Time", "GMT", + "Greenwich Mean Time", "GMT", "Greenwich Mean Time", "GMT"}; String GMTBST[] = new String[] {"Greenwich Mean Time", "GMT", - "British Summer Time", "BST"}; + "British Summer Time", "BST", + "British Time", "BT"}; String GST[] = new String[] {"Gulf Standard Time", "GST", - "Gulf Daylight Time", "GDT"}; + "Gulf Daylight Time", "GDT", + "Gulf Time", "GT"}; String HAST[] = new String[] {"Hawaii-Aleutian Standard Time", "HAST", - "Hawaii-Aleutian Daylight Time", "HADT"}; + "Hawaii-Aleutian Daylight Time", "HADT", + "Hawaii-Aleutian Time", "HAT"}; String HKT[] = new String[] {"Hong Kong Time", "HKT", - "Hong Kong Summer Time", "HKST"}; + "Hong Kong Summer Time", "HKST", + "Hong Kong Time", "HKT"}; String HST[] = new String[] {"Hawaii Standard Time", "HST", - "Hawaii Daylight Time", "HDT"}; + "Hawaii Daylight Time", "HDT", + "Hawaii Time", "HT"}; String ICT[] = new String[] {"Indochina Time", "ICT", - "Indochina Summer Time", "ICST"}; + "Indochina Summer Time", "ICST", + "Indochina Time", "ICT"}; String IRT[] = new String[] {"Iran Standard Time", "IRST", - "Iran Daylight Time", "IRDT"}; + "Iran Daylight Time", "IRDT", + "Iran Time", "IRT"}; String ISRAEL[] = new String[] {"Israel Standard Time", "IST", - "Israel Daylight Time", "IDT"}; + "Israel Daylight Time", "IDT", + "Israel Time", "IT"}; String IST[] = new String[] {"India Standard Time", "IST", - "India Daylight Time", "IDT"}; + "India Daylight Time", "IDT", + "India Time", "IT"}; String JST[] = new String[] {"Japan Standard Time", "JST", - "Japan Daylight Time", "JDT"}; + "Japan Daylight Time", "JDT", + "Japan Time", "JT"}; String KST[] = new String[] {"Korea Standard Time", "KST", - "Korea Daylight Time", "KDT"}; + "Korea Daylight Time", "KDT", + "Korea Time", "KT"}; String LORD_HOWE[] = new String[] {"Lord Howe Standard Time", "LHST", - "Lord Howe Summer Time", "LHST"}; + "Lord Howe Summer Time", "LHST", + "Lord Howe Time", "LHT"}; String MHT[] = new String[] {"Marshall Islands Time", "MHT", - "Marshall Islands Summer Time", "MHST"}; + "Marshall Islands Summer Time", "MHST", + "Marshall Islands Time", "MHT"}; String MSK[] = new String[] {"Moscow Standard Time", "MSK", - "Moscow Daylight Time", "MSD"}; + "Moscow Daylight Time", "MSD", + "Moscow Time", "MT"}; String MST[] = new String[] {"Mountain Standard Time", "MST", - "Mountain Daylight Time", "MDT"}; + "Mountain Daylight Time", "MDT", + "Mountain Time", "MT"}; String MYT[] = new String[] {"Malaysia Time", "MYT", - "Malaysia Summer Time", "MYST"}; + "Malaysia Summer Time", "MYST", + "Malaysia Time", "MYT"}; String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT", - "Fernando de Noronha Summer Time", "FNST"}; + "Fernando de Noronha Summer Time", "FNST", + "Fernando de Noronha Time", "FNT"}; String NOVT[] = new String[] {"Novosibirsk Time", "NOVT", - "Novosibirsk Summer Time", "NOVST"}; + "Novosibirsk Summer Time", "NOVST", + "Novosibirsk Time", "NOVT"}; String NPT[] = new String[] {"Nepal Time", "NPT", - "Nepal Summer Time", "NPST"}; + "Nepal Summer Time", "NPST", + "Nepal Time", "NPT"}; String NST[] = new String[] {"Newfoundland Standard Time", "NST", - "Newfoundland Daylight Time", "NDT"}; + "Newfoundland Daylight Time", "NDT", + "Newfoundland Time", "NT"}; String NZST[] = new String[] {"New Zealand Standard Time", "NZST", - "New Zealand Daylight Time", "NZDT"}; + "New Zealand Daylight Time", "NZDT", + "New Zealand Time", "NZT"}; String PITCAIRN[] = new String[] {"Pitcairn Standard Time", "PST", - "Pitcairn Daylight Time", "PDT"}; + "Pitcairn Daylight Time", "PDT", + "Pitcairn Time", "PT"}; String PKT[] = new String[] {"Pakistan Time", "PKT", - "Pakistan Summer Time", "PKST"}; + "Pakistan Summer Time", "PKST", + "Pakistan Time", "PKT"}; String PONT[] = new String[] {"Pohnpei Time", "PONT", - "Pohnpei Summer Time", "PONST"}; + "Pohnpei Summer Time", "PONST", + "Ponape Time", "PONT"}; String PST[] = new String[] {"Pacific Standard Time", "PST", - "Pacific Daylight Time", "PDT"}; + "Pacific Daylight Time", "PDT", + "Pacific Time", "PT"}; String SAST[] = new String[] {"South Africa Standard Time", "SAST", - "South Africa Summer Time", "SAST"}; + "South Africa Summer Time", "SAST", + "South Africa Time", "SAT"}; String SBT[] = new String[] {"Solomon Is. Time", "SBT", - "Solomon Is. Summer Time", "SBST"}; + "Solomon Is. Summer Time", "SBST", + "Solomon Is. Time", "SBT"}; String SGT[] = new String[] {"Singapore Time", "SGT", - "Singapore Summer Time", "SGST"}; + "Singapore Summer Time", "SGST", + "Singapore Time", "SGT"}; String SLST[] = new String[] {"Greenwich Mean Time", "GMT", - "Sierra Leone Summer Time", "SLST"}; + "Sierra Leone Summer Time", "SLST", + "Sierra Leone Time", "SLT"}; String TASMANIA[] = new String[] {"Eastern Standard Time (Tasmania)", "EST", - "Eastern Summer Time (Tasmania)", "EST"}; + "Eastern Summer Time (Tasmania)", "EST", + "Eastern Time (Tasmania)", "ET"}; String TMT[] = new String[] {"Turkmenistan Time", "TMT", - "Turkmenistan Summer Time", "TMST"}; + "Turkmenistan Summer Time", "TMST", + "Turkmenistan Time", "TMT"}; String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT", - "Ulaanbaatar Summer Time", "ULAST"}; + "Ulaanbaatar Summer Time", "ULAST", + "Ulaanbaatar Time", "ULAT"}; String WART[] = new String[] {"Western Argentine Time", "WART", - "Western Argentine Summer Time", "WARST"}; + "Western Argentine Summer Time", "WARST", + "Western Argentine Time", "WART"}; String WAT[] = new String[] {"Western African Time", "WAT", - "Western African Summer Time", "WAST"}; + "Western African Summer Time", "WAST", + "Western African Time", "WAT"}; String WET[] = new String[] {"Western European Time", "WET", - "Western European Summer Time", "WEST"}; + "Western European Summer Time", "WEST", + "Western European Time", "WET"}; String WIT[] = new String[] {"West Indonesia Time", "WIT", - "West Indonesia Summer Time", "WIST"}; + "West Indonesia Summer Time", "WIST", + "West Indonesia Time", "WIT"}; String WST_AUS[] = new String[] {"Western Standard Time (Australia)", "WST", - "Western Summer Time (Australia)", "WST"}; + "Western Summer Time (Australia)", "WST", + "Western Time (Australia)", "WT"}; String SAMOA[] = new String[] {"Samoa Standard Time", "SST", - "Samoa Daylight Time", "SDT"}; + "Samoa Daylight Time", "SDT", + "Samoa Time", "ST"}; String WST_SAMOA[] = new String[] {"West Samoa Time", "WST", - "West Samoa Daylight Time", "WSDT"}; + "West Samoa Daylight Time", "WSDT", + "West Samoa Time", "WST"}; String ChST[] = new String[] {"Chamorro Standard Time", "ChST", - "Chamorro Daylight Time", "ChDT"}; + "Chamorro Daylight Time", "ChDT", + "Chamorro Time", "ChT"}; String VICTORIA[] = new String[] {"Eastern Standard Time (Victoria)", "EST", - "Eastern Summer Time (Victoria)", "EST"}; + "Eastern Summer Time (Victoria)", "EST", + "Eastern Time (Victoria)", "ET"}; String UTC[] = new String[] {"Coordinated Universal Time", "UTC", + "Coordinated Universal Time", "UTC", "Coordinated Universal Time", "UTC"}; String UZT[] = new String[] {"Uzbekistan Time", "UZT", - "Uzbekistan Summer Time", "UZST"}; + "Uzbekistan Summer Time", "UZST", + "Uzbekistan Time", "UZT"}; return new Object[][] { {"America/Los_Angeles", PST}, @@ -309,7 +387,8 @@ {"America/Argentina/Ushuaia", AGT}, {"America/Aruba", AST}, {"America/Asuncion", new String[] {"Paraguay Time", "PYT", - "Paraguay Summer Time", "PYST"}}, + "Paraguay Summer Time", "PYST", + "Paraguay Time", "PYT"}}, {"America/Atikokan", EST}, {"America/Atka", HAST}, {"America/Bahia", BRT}, @@ -320,17 +399,20 @@ {"America/Blanc-Sablon", AST}, {"America/Boa_Vista", AMT}, {"America/Bogota", new String[] {"Colombia Time", "COT", - "Colombia Summer Time", "COST"}}, + "Colombia Summer Time", "COST", + "Colombia Time", "COT"}}, {"America/Boise", MST}, {"America/Buenos_Aires", AGT}, {"America/Cambridge_Bay", MST}, {"America/Campo_Grande", AMT}, {"America/Cancun", CST}, {"America/Caracas", new String[] {"Venezuela Time", "VET", - "Venezuela Summer Time", "VEST"}}, + "Venezuela Summer Time", "VEST", + "Venezuela Time", "VET"}}, {"America/Catamarca", AGT}, {"America/Cayenne", new String[] {"French Guiana Time", "GFT", - "French Guiana Summer Time", "GFST"}}, + "French Guiana Summer Time", "GFST", + "French Guiana Time", "GFT"}}, {"America/Cayman", EST}, {"America/Chihuahua", MST}, {"America/Creston", MST}, @@ -352,16 +434,19 @@ {"America/Fortaleza", BRT}, {"America/Glace_Bay", AST}, {"America/Godthab", new String[] {"Western Greenland Time", "WGT", - "Western Greenland Summer Time", "WGST"}}, + "Western Greenland Summer Time", "WGST", + "Western Greenland Time", "WGT"}}, {"America/Goose_Bay", AST}, {"America/Grand_Turk", EST}, {"America/Grenada", AST}, {"America/Guadeloupe", AST}, {"America/Guatemala", CST}, {"America/Guayaquil", new String[] {"Ecuador Time", "ECT", - "Ecuador Summer Time", "ECST"}}, + "Ecuador Summer Time", "ECST", + "Ecuador Time", "ECT"}}, {"America/Guyana", new String[] {"Guyana Time", "GYT", - "Guyana Summer Time", "GYST"}}, + "Guyana Summer Time", "GYST", + "Guyana Time", "GYT"}}, {"America/Havana", CUBA}, {"America/Hermosillo", MST}, {"America/Indiana/Indianapolis", EST}, @@ -382,9 +467,11 @@ {"America/Knox_IN", CST}, {"America/Kralendijk", AST}, {"America/La_Paz", new String[] {"Bolivia Time", "BOT", - "Bolivia Summer Time", "BOST"}}, + "Bolivia Summer Time", "BOST", + "Bolivia Time", "BOT"}}, {"America/Lima", new String[] {"Peru Time", "PET", - "Peru Summer Time", "PEST"}}, + "Peru Summer Time", "PEST", + "Peru Time", "PET"}}, {"America/Louisville", EST}, {"America/Lower_Princes", AST}, {"America/Maceio", BRT}, @@ -398,13 +485,16 @@ {"America/Menominee", CST}, {"America/Merida", CST}, {"America/Metlakatla", new String[] {"Metlakatla Standard Time", "MeST", - "Metlakatla Daylight Time", "MeDT"}}, + "Metlakatla Daylight Time", "MeDT", + "Metlakatla Time", "MeT"}}, {"America/Mexico_City", CST}, {"America/Miquelon", new String[] {"Pierre & Miquelon Standard Time", "PMST", - "Pierre & Miquelon Daylight Time", "PMDT"}}, + "Pierre & Miquelon Daylight Time", "PMDT", + "Pierre & Miquelon Time", "PMT"}}, {"America/Moncton", AST}, {"America/Montevideo", new String[] {"Uruguay Time", "UYT", - "Uruguay Summer Time", "UYST"}}, + "Uruguay Summer Time", "UYST", + "Uruguay Time", "UYT"}}, {"America/Monterrey", CST}, {"America/Montreal", EST}, {"America/Montserrat", AST}, @@ -419,7 +509,8 @@ {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Suriname Time", "SRT", - "Suriname Summer Time", "SRST"}}, + "Suriname Summer Time", "SRST", + "Suriname Time", "SRT"}}, {"America/Port-au-Prince", EST}, {"America/Port_of_Spain", AST}, {"America/Porto_Acre", AMT}, @@ -459,113 +550,143 @@ {"America/Yellowknife", MST}, {"Antarctica/Casey", WST_AUS}, {"Antarctica/Davis", new String[] {"Davis Time", "DAVT", - "Davis Summer Time", "DAVST"}}, + "Davis Summer Time", "DAVST", + "Davis Time", "DAVT"}}, {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT", - "Dumont-d'Urville Summer Time", "DDUST"}}, + "Dumont-d'Urville Summer Time", "DDUST", + "Dumont-d'Urville Time", "DDUT"}}, {"Antarctica/Macquarie", new String[] {"Macquarie Island Time", "MIST", - "Macquarie Island Summer Time", "MIST"}}, + "Macquarie Island Summer Time", "MIST", + "Macquarie Island Time", "MIST"}}, {"Antarctica/Mawson", new String[] {"Mawson Time", "MAWT", - "Mawson Summer Time", "MAWST"}}, + "Mawson Summer Time", "MAWST", + "Mawson Time", "MAWT"}}, {"Antarctica/McMurdo", NZST}, {"Antarctica/Palmer", CLT}, {"Antarctica/Rothera", new String[] {"Rothera Time", "ROTT", - "Rothera Summer Time", "ROTST"}}, + "Rothera Summer Time", "ROTST", + "Rothera Time", "ROTT"}}, {"Antarctica/South_Pole", NZST}, {"Antarctica/Syowa", new String[] {"Syowa Time", "SYOT", - "Syowa Summer Time", "SYOST"}}, + "Syowa Summer Time", "SYOST", + "Syowa Time", "SYOT"}}, {"Antarctica/Vostok", new String[] {"Vostok Time", "VOST", - "Vostok Summer Time", "VOSST"}}, + "Vostok Summer Time", "VOSST", + "Vostok Time", "VOST"}}, {"Arctic/Longyearbyen", CET}, {"Asia/Aden", ARAST}, {"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT", - "Alma-Ata Summer Time", "ALMST"}}, + "Alma-Ata Summer Time", "ALMST", + "Alma-Ata Time", "ALMT"}}, {"Asia/Amman", EET}, {"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT", - "Anadyr Summer Time", "ANAST"}}, + "Anadyr Summer Time", "ANAST", + "Anadyr Time", "ANAT"}}, {"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT", - "Aqtau Summer Time", "AQTST"}}, + "Aqtau Summer Time", "AQTST", + "Aqtau Time", "AQTT"}}, {"Asia/Aqtobe", new String[] {"Aqtobe Time", "AQTT", - "Aqtobe Summer Time", "AQTST"}}, + "Aqtobe Summer Time", "AQTST", + "Aqtobe Time", "AQTT"}}, {"Asia/Ashgabat", TMT}, {"Asia/Ashkhabad", TMT}, {"Asia/Baghdad", ARAST}, {"Asia/Bahrain", ARAST}, {"Asia/Baku", new String[] {"Azerbaijan Time", "AZT", - "Azerbaijan Summer Time", "AZST"}}, + "Azerbaijan Summer Time", "AZST", + "Azerbaijan Time", "AZT"}}, {"Asia/Bangkok", ICT}, {"Asia/Beirut", EET}, {"Asia/Bishkek", new String[] {"Kirgizstan Time", "KGT", - "Kirgizstan Summer Time", "KGST"}}, + "Kirgizstan Summer Time", "KGST", + "Kirgizstan Time", "KGT"}}, {"Asia/Brunei", new String[] {"Brunei Time", "BNT", - "Brunei Summer Time", "BNST"}}, + "Brunei Summer Time", "BNST", + "Brunei Time", "BNT"}}, {"Asia/Calcutta", IST}, {"Asia/Choibalsan", new String[] {"Choibalsan Time", "CHOT", - "Choibalsan Summer Time", "CHOST"}}, + "Choibalsan Summer Time", "CHOST", + "Choibalsan Time", "CHOT"}}, {"Asia/Chongqing", CTT}, {"Asia/Chungking", CTT}, {"Asia/Colombo", IST}, {"Asia/Dacca", BDT}, {"Asia/Dhaka", BDT}, {"Asia/Dili", new String[] {"Timor-Leste Time", "TLT", - "Timor-Leste Summer Time", "TLST"}}, + "Timor-Leste Summer Time", "TLST", + "Timor-Leste Time", "TLT"}}, {"Asia/Damascus", EET}, {"Asia/Dubai", GST}, {"Asia/Dushanbe", new String[] {"Tajikistan Time", "TJT", - "Tajikistan Summer Time", "TJST"}}, + "Tajikistan Summer Time", "TJST", + "Tajikistan Time", "TJT"}}, {"Asia/Gaza", EET}, {"Asia/Harbin", CTT}, {"Asia/Hebron", EET}, {"Asia/Ho_Chi_Minh", ICT}, {"Asia/Hong_Kong", HKT}, {"Asia/Hovd", new String[] {"Hovd Time", "HOVT", - "Hovd Summer Time", "HOVST"}}, + "Hovd Summer Time", "HOVST", + "Hovd Time", "HOVT"}}, {"Asia/Irkutsk", new String[] {"Irkutsk Time", "IRKT", - "Irkutsk Summer Time", "IRKST"}}, + "Irkutsk Summer Time", "IRKST", + "Irkutsk Time", "IRKT"}}, {"Asia/Istanbul", EET}, {"Asia/Jakarta", WIT}, {"Asia/Jayapura", new String[] {"East Indonesia Time", "EIT", - "East Indonesia Summer Time", "EIST"}}, + "East Indonesia Summer Time", "EIST", + "East Indonesia Time", "EIT"}}, {"Asia/Kabul", new String[] {"Afghanistan Time", "AFT", - "Afghanistan Summer Time", "AFST"}}, + "Afghanistan Summer Time", "AFST", + "Afghanistan Time", "AFT"}}, {"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamchatski Time", "PETT", - "Petropavlovsk-Kamchatski Summer Time", "PETST"}}, + "Petropavlovsk-Kamchatski Summer Time", "PETST", + "Petropavlovsk-Kamchatski Time", "PETT"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, {"Asia/Kathmandu", NPT}, {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT", - "Krasnoyarsk Summer Time", "KRAST"}}, + "Krasnoyarsk Summer Time", "KRAST", + "Krasnoyarsk Time", "KRAT"}}, {"Asia/Kuala_Lumpur", MYT}, {"Asia/Kuching", MYT}, {"Asia/Kuwait", ARAST}, {"Asia/Macao", CTT}, {"Asia/Macau", CTT}, {"Asia/Magadan", new String[] {"Magadan Time", "MAGT", - "Magadan Summer Time", "MAGST"}}, + "Magadan Summer Time", "MAGST", + "Magadan Time", "MAGT"}}, {"Asia/Makassar", CIT}, {"Asia/Manila", new String[] {"Philippines Time", "PHT", - "Philippines Summer Time", "PHST"}}, + "Philippines Summer Time", "PHST", + "Philippines Time", "PHT"}}, {"Asia/Muscat", GST}, {"Asia/Nicosia", EET}, {"Asia/Novokuznetsk", NOVT}, {"Asia/Novosibirsk", NOVT}, {"Asia/Oral", new String[] {"Oral Time", "ORAT", - "Oral Summer Time", "ORAST"}}, + "Oral Summer Time", "ORAST", + "Oral Time", "ORAT"}}, {"Asia/Omsk", new String[] {"Omsk Time", "OMST", - "Omsk Summer Time", "OMSST"}}, + "Omsk Summer Time", "OMSST", + "Omsk Time", "OMST"}}, {"Asia/Phnom_Penh", ICT}, {"Asia/Pontianak", WIT}, {"Asia/Pyongyang", KST}, {"Asia/Qatar", ARAST}, {"Asia/Qyzylorda", new String[] {"Qyzylorda Time", "QYZT", - "Qyzylorda Summer Time", "QYZST"}}, + "Qyzylorda Summer Time", "QYZST", + "Qyzylorda Time", "QYZT"}}, {"Asia/Rangoon", new String[] {"Myanmar Time", "MMT", - "Myanmar Summer Time", "MMST"}}, + "Myanmar Summer Time", "MMST", + "Myanmar Time", "MMT"}}, {"Asia/Riyadh", ARAST}, {"Asia/Saigon", ICT}, {"Asia/Sakhalin", new String[] {"Sakhalin Time", "SAKT", - "Sakhalin Summer Time", "SAKST"}}, + "Sakhalin Summer Time", "SAKST", + "Sakhalin Time", "SAKT"}}, {"Asia/Samarkand", UZT}, {"Asia/Seoul", KST}, {"Asia/Singapore", SGT}, @@ -573,7 +694,8 @@ {"Asia/Tel_Aviv", ISRAEL}, {"Asia/Tashkent", UZT}, {"Asia/Tbilisi", new String[] {"Georgia Time", "GET", - "Georgia Summer Time", "GEST"}}, + "Georgia Summer Time", "GEST", + "Georgia Time", "GET"}}, {"Asia/Tehran", IRT}, {"Asia/Thimbu", BTT}, {"Asia/Thimphu", BTT}, @@ -583,28 +705,35 @@ {"Asia/Urumqi", CTT}, {"Asia/Vientiane", ICT}, {"Asia/Vladivostok", new String[] {"Vladivostok Time", "VLAT", - "Vladivostok Summer Time", "VLAST"}}, + "Vladivostok Summer Time", "VLAST", + "Vladivostok Time", "VLAT"}}, {"Asia/Yakutsk", new String[] {"Yakutsk Time", "YAKT", - "Yakutsk Summer Time", "YAKST"}}, + "Yakutsk Summer Time", "YAKST", + "Yakutsk Time", "YAKT"}}, {"Asia/Yekaterinburg", new String[] {"Yekaterinburg Time", "YEKT", - "Yekaterinburg Summer Time", "YEKST"}}, + "Yekaterinburg Summer Time", "YEKST", + "Yekaterinburg Time", "YEKT"}}, {"Asia/Yerevan", ARMT}, {"Atlantic/Azores", new String[] {"Azores Time", "AZOT", - "Azores Summer Time", "AZOST"}}, + "Azores Summer Time", "AZOST", + "Azores Time", "AZOT"}}, {"Atlantic/Bermuda", AST}, {"Atlantic/Canary", WET}, {"Atlantic/Cape_Verde", new String[] {"Cape Verde Time", "CVT", - "Cape Verde Summer Time", "CVST"}}, + "Cape Verde Summer Time", "CVST", + "Cape Verde Time", "CVT"}}, {"Atlantic/Faeroe", WET}, {"Atlantic/Faroe", WET}, {"Atlantic/Jan_Mayen", CET}, {"Atlantic/Madeira", WET}, {"Atlantic/Reykjavik", GMT}, {"Atlantic/South_Georgia", new String[] {"South Georgia Standard Time", "GST", - "South Georgia Daylight Time", "GDT"}}, + "South Georgia Daylight Time", "GDT", + "South Georgia Time", "GT"}}, {"Atlantic/St_Helena", GMT}, {"Atlantic/Stanley", new String[] {"Falkland Is. Time", "FKT", - "Falkland Is. Summer Time", "FKST"}}, + "Falkland Is. Summer Time", "FKST", + "Falkland Is. Time", "FKT"}}, {"Australia/ACT", EST_NSW}, {"Australia/Adelaide", ADELAIDE}, {"Australia/Brisbane", BRISBANE}, @@ -613,7 +742,8 @@ {"Australia/Currie", EST_NSW}, {"Australia/Darwin", DARWIN}, {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST", - "Central Western Summer Time (Australia)", "CWST"}}, + "Central Western Summer Time (Australia)", "CWST", + "Central Western Time (Australia)", "CWT"}}, {"Australia/Hobart", TASMANIA}, {"Australia/LHI", LORD_HOWE}, {"Australia/Lindeman", BRISBANE}, @@ -697,7 +827,8 @@ {"Europe/Riga", EET}, {"Europe/Rome", CET}, {"Europe/Samara", new String[] {"Samara Time", "SAMT", - "Samara Summer Time", "SAMST"}}, + "Samara Summer Time", "SAMST", + "Samara Time", "SAMT"}}, {"Europe/San_Marino", CET}, {"Europe/Sarajevo", CET}, {"Europe/Simferopol", EET}, @@ -713,7 +844,8 @@ {"Europe/Vienna", CET}, {"Europe/Vilnius", EET}, {"Europe/Volgograd", new String[] {"Volgograd Time", "VOLT", - "Volgograd Summer Time", "VOLST"}}, + "Volgograd Summer Time", "VOLST", + "Volgograd Time", "VOLT"}}, {"Europe/Warsaw", CET}, {"Europe/Zagreb", CET}, {"Europe/Zaporozhye", EET}, @@ -727,30 +859,39 @@ {"IST", IST}, {"Indian/Antananarivo", EAT}, {"Indian/Chagos", new String[] {"Indian Ocean Territory Time", "IOT", - "Indian Ocean Territory Summer Time", "IOST"}}, + "Indian Ocean Territory Summer Time", "IOST", + "Indian Ocean Territory Time", "IOT"}}, {"Indian/Christmas", new String[] {"Christmas Island Time", "CXT", - "Christmas Island Summer Time", "CXST"}}, + "Christmas Island Summer Time", "CXST", + "Christmas Island Time", "CIT"}}, {"Indian/Cocos", new String[] {"Cocos Islands Time", "CCT", - "Cocos Islands Summer Time", "CCST"}}, + "Cocos Islands Summer Time", "CCST", + "Cocos Islands Time", "CCT"}}, {"Indian/Comoro", EAT}, {"Indian/Kerguelen", new String[] {"French Southern & Antarctic Lands Time", "TFT", - "French Southern & Antarctic Lands Summer Time", "TFST"}}, + "French Southern & Antarctic Lands Summer Time", "TFST", + "French Southern & Antarctic Lands Time", "TFT"}}, {"Indian/Mahe", new String[] {"Seychelles Time", "SCT", - "Seychelles Summer Time", "SCST"}}, + "Seychelles Summer Time", "SCST", + "Seychelles Time", "SCT"}}, {"Indian/Maldives", new String[] {"Maldives Time", "MVT", - "Maldives Summer Time", "MVST"}}, + "Maldives Summer Time", "MVST", + "Maldives Time", "MVT"}}, {"Indian/Mauritius", new String[] {"Mauritius Time", "MUT", - "Mauritius Summer Time", "MUST"}}, + "Mauritius Summer Time", "MUST", + "Mauritius Time", "MUT"}}, {"Indian/Mayotte", EAT}, {"Indian/Reunion", new String[] {"Reunion Time", "RET", - "Reunion Summer Time", "REST"}}, + "Reunion Summer Time", "REST", + "Reunion Time", "RET"}}, {"Israel", ISRAEL}, {"Jamaica", EST}, {"Japan", JST}, {"Kwajalein", MHT}, {"Libya", EET}, {"MET", new String[] {"Middle Europe Time", "MET", - "Middle Europe Summer Time", "MEST"}}, + "Middle Europe Summer Time", "MEST", + "Middle Europe Time", "MET"}}, {"Mexico/BajaNorte", PST}, {"Mexico/BajaSur", MST}, {"Mexico/General", CST}, @@ -770,61 +911,82 @@ {"Pacific/Chuuk", CHUT}, {"Pacific/Easter", EASTER}, {"Pacific/Efate", new String[] {"Vanuatu Time", "VUT", - "Vanuatu Summer Time", "VUST"}}, + "Vanuatu Summer Time", "VUST", + "Vanuatu Time", "VUT"}}, {"Pacific/Enderbury", new String[] {"Phoenix Is. Time", "PHOT", - "Phoenix Is. Summer Time", "PHOST"}}, + "Phoenix Is. Summer Time", "PHOST", + "Phoenix Is. Time", "PHOT"}}, {"Pacific/Fakaofo", new String[] {"Tokelau Time", "TKT", - "Tokelau Summer Time", "TKST"}}, + "Tokelau Summer Time", "TKST", + "Tokelau Time", "TKT"}}, {"Pacific/Fiji", new String[] {"Fiji Time", "FJT", - "Fiji Summer Time", "FJST"}}, + "Fiji Summer Time", "FJST", + "Fiji Time", "FJT"}}, {"Pacific/Funafuti", new String[] {"Tuvalu Time", "TVT", - "Tuvalu Summer Time", "TVST"}}, + "Tuvalu Summer Time", "TVST", + "Tuvalu Time", "TVT"}}, {"Pacific/Galapagos", new String[] {"Galapagos Time", "GALT", - "Galapagos Summer Time", "GALST"}}, + "Galapagos Summer Time", "GALST", + "Galapagos Time", "GALT"}}, {"Pacific/Gambier", GAMBIER}, {"Pacific/Guadalcanal", SBT}, {"Pacific/Guam", ChST}, {"Pacific/Johnston", HST}, {"Pacific/Kiritimati", new String[] {"Line Is. Time", "LINT", - "Line Is. Summer Time", "LINST"}}, + "Line Is. Summer Time", "LINST", + "Line Is. Time", "LINT"}}, {"Pacific/Kosrae", new String[] {"Kosrae Time", "KOST", - "Kosrae Summer Time", "KOSST"}}, + "Kosrae Summer Time", "KOSST", + "Kosrae Time", "KOST"}}, {"Pacific/Kwajalein", MHT}, {"Pacific/Majuro", MHT}, {"Pacific/Marquesas", new String[] {"Marquesas Time", "MART", - "Marquesas Summer Time", "MARST"}}, + "Marquesas Summer Time", "MARST", + "Marquesas Time", "MART"}}, {"Pacific/Midway", SAMOA}, {"Pacific/Nauru", new String[] {"Nauru Time", "NRT", - "Nauru Summer Time", "NRST"}}, + "Nauru Summer Time", "NRST", + "Nauru Time", "NRT"}}, {"Pacific/Niue", new String[] {"Niue Time", "NUT", - "Niue Summer Time", "NUST"}}, + "Niue Summer Time", "NUST", + "Niue Time", "NUT"}}, {"Pacific/Norfolk", new String[] {"Norfolk Time", "NFT", - "Norfolk Summer Time", "NFST"}}, + "Norfolk Summer Time", "NFST", + "Norfolk Time", "NFT"}}, {"Pacific/Noumea", new String[] {"New Caledonia Time", "NCT", - "New Caledonia Summer Time", "NCST"}}, + "New Caledonia Summer Time", "NCST", + "New Caledonia Time", "NCT"}}, {"Pacific/Pago_Pago", SAMOA}, {"Pacific/Palau", new String[] {"Palau Time", "PWT", - "Palau Summer Time", "PWST"}}, + "Palau Summer Time", "PWST", + "Palau Time", "PWT"}}, {"Pacific/Pitcairn", PITCAIRN}, {"Pacific/Pohnpei", PONT}, {"Pacific/Ponape", PONT}, {"Pacific/Port_Moresby", new String[] {"Papua New Guinea Time", "PGT", - "Papua New Guinea Summer Time", "PGST"}}, + "Papua New Guinea Summer Time", "PGST", + "Papua New Guinea Time", "PGT"}}, {"Pacific/Rarotonga", new String[] {"Cook Is. Time", "CKT", - "Cook Is. Summer Time", "CKHST"}}, + "Cook Is. Summer Time", "CKHST", + "Cook Is. Time", "CKT"}}, {"Pacific/Saipan", ChST}, {"Pacific/Samoa", SAMOA}, {"Pacific/Tahiti", new String[] {"Tahiti Time", "TAHT", - "Tahiti Summer Time", "TAHST"}}, + "Tahiti Summer Time", "TAHST", + "Tahiti Time", "TAHT"}}, {"Pacific/Tarawa", new String[] {"Gilbert Is. Time", "GILT", - "Gilbert Is. Summer Time", "GILST"}}, + "Gilbert Is. Summer Time", "GILST", + "Gilbert Is. Time", "GILT"}}, {"Pacific/Tongatapu", new String[] {"Tonga Time", "TOT", - "Tonga Summer Time", "TOST"}}, + "Tonga Summer Time", "TOST", + "Tonga Time", "TOT"}}, {"Pacific/Truk", CHUT}, {"Pacific/Wake", new String[] {"Wake Time", "WAKT", - "Wake Summer Time", "WAKST"}}, + "Wake Summer Time", "WAKST", + "Wake Time", "WAKT"}}, {"Pacific/Wallis", new String[] {"Wallis & Futuna Time", "WFT", - "Wallis & Futuna Summer Time", "WFST"}}, + "Wallis & Futuna Summer Time", "WFST", + "Wallis & Futuna Time", "WFT"}}, {"Pacific/Yap", CHUT}, {"Poland", CET}, {"PRC", CTT}, --- old/src/share/classes/sun/util/resources/TimeZoneNamesBundle.java 2012-12-03 11:44:03.000000000 +0900 +++ new/src/share/classes/sun/util/resources/TimeZoneNamesBundle.java 2012-12-03 11:44:03.000000000 +0900 @@ -42,6 +42,9 @@ import java.util.Map; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.MissingResourceException; +import java.util.Set; /** * Subclass of ResourceBundle with special @@ -58,6 +61,26 @@ public abstract class TimeZoneNamesBundle extends OpenListResourceBundle { /** + * Returns a String array containing time zone names. The String array has + * at most size elements. + * + * @param key the time zone ID for which names are obtained + * @param size the requested size of array for names + * @return a String array containing names + */ + public String[] getStringArray(String key, int size) { + String[] names = handleGetObject(key, size); + if ((names == null || names.length != size) && parent != null) { + names = ((TimeZoneNamesBundle)parent).getStringArray(key, size); + } + if (names == null) { + throw new MissingResourceException("no time zone names", getClass().getName(), key); + } + return names; + + } + + /** * Maps time zone IDs to locale-specific names. * The value returned is an array of five strings: *

    @@ -71,13 +94,17 @@ * getContents implementations, while the time zone * ID is inserted into the returned array by this method. */ + @Override public Object handleGetObject(String key) { + return handleGetObject(key, 5); + } + + private String[] handleGetObject(String key, int n) { String[] contents = (String[]) super.handleGetObject(key); if (contents == null) { return null; } - - int clen = contents.length; + int clen = Math.min(n, contents.length); String[] tmpobj = new String[clen+1]; tmpobj[0] = key; System.arraycopy(contents, 0, tmpobj, 1, clen); @@ -85,14 +112,24 @@ } /** - * Use LinkedHashMap to preserve order of bundle entries. + * Use LinkedHashMap to preserve the order of bundle entries. */ @Override - protected Map createMap(int size) { + protected Map createMap(int size) { return new LinkedHashMap<>(size); } /** + * Use LinkedHashSet to preserve the key order. + * @param the type of elements + * @return a Set + */ + @Override + protected Set createSet() { + return new LinkedHashSet<>(); + } + + /** * Provides key/value mappings for a specific * resource bundle. Each entry of the array * returned must be an array with two elements: --- /dev/null 2012-11-19 14:27:30.693760882 +0900 +++ new/test/java/util/Calendar/GenericTimeZoneNamesTest.java 2012-12-03 11:44:05.000000000 +0900 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2012, 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. + */ + +import java.util.*; +import sun.util.locale.provider.TimeZoneNameUtility; + +public class GenericTimeZoneNamesTest { + private static final String[] PT = { + "America/Los_Angeles", "US/Pacific", "PST" + }; + + private static int errors = 0; + + public static void main(String[] args) { + for (String tag : args) { + Locale locale = Locale.forLanguageTag(tag); + for (String tzid : PT) { + test(tzid, TimeZone.LONG, locale, "Pacific Time"); + test(tzid, TimeZone.SHORT, locale, "PT"); + } + } + + if (errors != 0) { + throw new RuntimeException("test failed"); + } + } + + private static void test(String tzid, int style, Locale locale, String expected) { + // No public API to get generic time zone names (JDK 8) + String got = TimeZoneNameUtility.retrieveGenericDisplayName(tzid, style, locale); + if (!expected.equals(got)) { + System.err.printf("test: tzid=%s, locale=%s, style=%d, got=\"%s\", expected=\"%s\"%n", + tzid, locale, style, got, expected); + errors++; + } + } +} --- /dev/null 2012-11-19 14:27:30.693760882 +0900 +++ new/test/java/util/Calendar/GenericTimeZoneNamesTest.sh 2012-12-03 11:44:07.000000000 +0900 @@ -0,0 +1,40 @@ +# +# Copyright (c) 2012, 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 8003267 +# @summary Unit test for generic time zone names support +# @compile -XDignore.symbol.file GenericTimeZoneNamesTest.java +# @run shell GenericTimeZoneNamesTest.sh + +# This test is locale data-dependent and assumes that both JRE and CLDR +# have the same geneic time zone names in English. + +echo "Locale providers: default" +# TODO: The purpose of ja-JP is to make sure the fallback for generic +# names works. Remove ja-JP when adding generic names to localized +# resources. +${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" GenericTimeZoneNamesTest en-US ja-JP + +echo "Locale providers: CLDR" +${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" -Djava.locale.providers=CLDR GenericTimeZoneNamesTest en-US --- /dev/null 2012-11-19 14:27:30.693760882 +0900 +++ new/test/java/util/Calendar/NarrowNamesTest.java 2012-12-03 11:44:09.000000000 +0900 @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2012, 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. + */ + +import java.util.*; +import static java.util.GregorianCalendar.*; + +public class NarrowNamesTest { + private static final Locale US = Locale.US; + private static final Locale JAJPJP = new Locale("ja", "JP", "JP"); + private static final Locale THTH = new Locale("th", "TH"); + + private static final String RESET_INDEX = "RESET_INDEX"; + + private static int errors = 0; + + // This test is locale data-dependent. + public static void main(String[] args) { + test(US, ERA, "B", + ERA, BC, YEAR, 1); + test(US, ERA, "A", + ERA, AD, YEAR, 2012); + test(US, DAY_OF_WEEK, "S", + YEAR, 2012, MONTH, DECEMBER, DAY_OF_MONTH, 23); + test(US, AM_PM, "a", + HOUR_OF_DAY, 10); + test(US, AM_PM, "p", + HOUR_OF_DAY, 23); + test(JAJPJP, DAY_OF_WEEK, "\u65e5", + YEAR, 24, MONTH, DECEMBER, DAY_OF_MONTH, 23); + test(THTH, MONTH, NARROW_STANDALONE, "\u0e18.\u0e04.", + YEAR, 2555, MONTH, DECEMBER, DAY_OF_MONTH, 5); + test(THTH, DAY_OF_WEEK, "\u0e1e", + YEAR, 2555, MONTH, DECEMBER, DAY_OF_MONTH, 5); + + testMap(US, DAY_OF_WEEK, ALL_STYLES, // shouldn't include any narrow names + "", // 1-based indexing for DAY_OF_WEEK + "Sunday", // Sunday + "Monday", // Monday + "Tuesday", // Tuesday + "Wednesday", // Wednesday + "Thursday", // Thursday + "Friday", // Friday + "Saturday", // Saturday + RESET_INDEX, + "", // 1-based indexing for DAY_OF_WEEK + "Sun", // abb Sunday + "Mon", // abb Monday + "Tue", // abb Tuesday + "Wed", // abb Wednesday + "Thu", // abb Thursday + "Fri", // abb Friday + "Sat" // abb Saturday + ); + testMap(US, DAY_OF_WEEK, NARROW_FORMAT); // expect null + testMap(US, AM_PM, ALL_STYLES, + "AM", "PM", + RESET_INDEX, + "a", "p"); + testMap(JAJPJP, DAY_OF_WEEK, NARROW_STANDALONE); // expect null + testMap(JAJPJP, DAY_OF_WEEK, NARROW_FORMAT, + "", // 1-based indexing for DAY_OF_WEEK + "\u65e5", + "\u6708", + "\u706b", + "\u6c34", + "\u6728", + "\u91d1", + "\u571f"); + testMap(THTH, MONTH, NARROW_FORMAT); // expect null + testMap(THTH, MONTH, NARROW_STANDALONE, + "\u0e21.\u0e04.", + "\u0e01.\u0e1e.", + "\u0e21\u0e35.\u0e04.", + "\u0e40\u0e21.\u0e22.", + "\u0e1e.\u0e04.", + "\u0e21\u0e34.\u0e22.", + "\u0e01.\u0e04.", + "\u0e2a.\u0e04.", + "\u0e01.\u0e22.", + "\u0e15.\u0e04.", + "\u0e1e.\u0e22.", + "\u0e18.\u0e04."); + + if (errors != 0) { + throw new RuntimeException("test failed"); + } + } + + private static void test(Locale locale, int field, String expected, int... data) { + test(locale, field, NARROW_FORMAT, expected, data); + } + + private static void test(Locale locale, int field, int style, String expected, int... fieldValuePairs) { + Calendar cal = Calendar.getInstance(locale); + cal.clear(); + for (int i = 0; i < fieldValuePairs.length;) { + int f = fieldValuePairs[i++]; + int v = fieldValuePairs[i++]; + cal.set(f, v); + } + String got = cal.getDisplayName(field, style, locale); + if (!expected.equals(got)) { + System.err.printf("test: locale=%s, field=%d, value=%d, style=%d, got=\"%s\", expected=\"%s\"%n", + locale, field, cal.get(field), style, got, expected); + errors++; + } + } + + private static void testMap(Locale locale, int field, int style, String... expected) { + Map expectedMap = null; + if (expected.length > 0) { + expectedMap = new TreeMap<>(LengthBasedComparator.INSTANCE); + int index = 0; + for (int i = 0; i < expected.length; i++) { + if (expected[i].isEmpty()) { + index++; + continue; + } + if (expected[i] == RESET_INDEX) { + index = 0; + continue; + } + expectedMap.put(expected[i], index++); + } + } + Calendar cal = Calendar.getInstance(locale); + Map got = cal.getDisplayNames(field, style, locale); + if (!(expectedMap == null && got == null) + && !expectedMap.equals(got)) { + System.err.printf("testMap: locale=%s, field=%d, style=%d, expected=%s, got=%s%n", + locale, field, style, expectedMap, got); + errors++; + } + } + + /** + * Comparator implementation for TreeMap which iterates keys from longest + * to shortest. + */ + private static class LengthBasedComparator implements Comparator { + private static final LengthBasedComparator INSTANCE = new LengthBasedComparator(); + + private LengthBasedComparator() { + } + + @Override + public int compare(String o1, String o2) { + int n = o2.length() - o1.length(); + return (n == 0) ? o1.compareTo(o2) : n; + } + } +} --- /dev/null 2012-11-19 14:27:30.693760882 +0900 +++ new/test/java/util/Calendar/NarrowNamesTest.sh 2012-12-03 11:44:11.000000000 +0900 @@ -0,0 +1,37 @@ +# +# Copyright (c) 2012, 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 8000983 +# @summary Unit test for narrow names support +# @build NarrowNamesTest +# @run shell NarrowNamesTest.sh + +# This test is locale data-dependent and assumes that both JRE and CLDR +# have the same narrow names. + +for P in "JRE,SPI" "CLDR" +do + echo "Locale providers: $P" + ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" -Djava.locale.providers="${P}" NarrowNamesTest +done --- old/test/java/util/PluggableLocale/GenericTest.java 2012-12-03 11:44:14.000000000 +0900 +++ new/test/java/util/PluggableLocale/GenericTest.java 2012-12-03 11:44:13.000000000 +0900 @@ -41,6 +41,7 @@ com.bar.CurrencyNameProviderImpl2 currencyNP2 = new com.bar.CurrencyNameProviderImpl2(); com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl(); com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl(); + com.bar.GenericTimeZoneNameProviderImpl tzGenNP = new com.bar.GenericTimeZoneNameProviderImpl(); com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl(); com.bar.CalendarNameProviderImpl calNameP = new com.bar.CalendarNameProviderImpl(); @@ -73,6 +74,7 @@ expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales())); expected.addAll(Arrays.asList(localeNP.getAvailableLocales())); expected.addAll(Arrays.asList(tzNP.getAvailableLocales())); + expected.addAll(Arrays.asList(tzGenNP.getAvailableLocales())); expected.addAll(Arrays.asList(calDataP.getAvailableLocales())); expected.addAll(Arrays.asList(calNameP.getAvailableLocales())); if (!result.equals(expected)) { --- old/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java 2012-12-03 11:44:17.000000000 +0900 +++ new/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java 2012-12-03 11:44:16.000000000 +0900 @@ -40,6 +40,7 @@ TimeZoneNameProviderTest() { test1(); test2(); + test3(); aliasTest(); } @@ -92,6 +93,7 @@ final String pattern = "z"; final Locale OSAKA = new Locale("ja", "JP", "osaka"); final Locale KYOTO = new Locale("ja", "JP", "kyoto"); + final Locale GENERIC = new Locale("ja", "JP", "generic"); final String[] TIMEZONES = { "GMT", "America/Los_Angeles", "SystemV/PST8", @@ -157,6 +159,29 @@ } } + void test3() { + final String[] TZNAMES = { + LATIME, PST, PST8PDT, US_PACIFIC, + TOKYOTIME, JST, JAPAN, + }; + for (String tzname : TZNAMES) { + TimeZone tz = TimeZone.getTimeZone(tzname); + for (int style : new int[] { TimeZone.LONG, TimeZone.SHORT }) { + String osakaStd = tz.getDisplayName(false, style, OSAKA); + if (osakaStd != null) { + // No API for getting generic time zone names + String generic = TimeZoneNameUtility.retrieveGenericDisplayName(tzname, + style, GENERIC); + String expected = "Generic " + osakaStd; + if (!expected.equals(generic)) { + throw new RuntimeException("Wrong generic name: got=\"" + generic + + "\", expected=\"" + expected + "\""); + } + } + } + } + } + final String LATIME = "America/Los_Angeles"; final String PST = "PST"; final String PST8PDT = "PST8PDT"; --- old/test/java/util/PluggableLocale/TimeZoneNameProviderTest.sh 2012-12-03 11:44:19.000000000 +0900 +++ new/test/java/util/PluggableLocale/TimeZoneNameProviderTest.sh 2012-12-03 11:44:19.000000000 +0900 @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, 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 @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 4052440 +# @bug 4052440 8003267 # @summary TimeZoneNameProvider tests # @run shell ExecTest.sh bar TimeZoneNameProviderTest true --- /dev/null 2012-11-19 14:27:30.693760882 +0900 +++ new/test/java/util/PluggableLocale/providersrc/GenericTimeZoneNameProviderImpl.java 2012-12-03 11:44:28.000000000 +0900 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012, 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. + */ +/* + * + */ + +package com.bar; + +import java.util.*; +import java.util.spi.*; + +import com.foobar.Utils; + +/** + * Implementation class for getGenericTimeZoneName which returns "Generic "+. + */ +public class GenericTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl { + static final Locale jaJPGeneric = new Locale("ja", "JP", "generic"); + static final Locale OSAKA = new Locale("ja", "JP", "osaka"); + + static Locale[] avail = { + jaJPGeneric + }; + + @Override + public Locale[] getAvailableLocales() { + return avail; + } + + @Override + public String getGenericDisplayName(String id, int style, Locale locale) { + if (!jaJPGeneric.equals(locale)) { + return null; + } + String std = super.getDisplayName(id, false, style, OSAKA); + return (std != null) ? "Generic " + std : null; + } +} --- old/test/java/util/PluggableLocale/providersrc/Makefile 2012-12-03 11:44:32.000000000 +0900 +++ new/test/java/util/PluggableLocale/providersrc/Makefile 2012-12-03 11:44:30.000000000 +0900 @@ -38,6 +38,7 @@ CurrencyNameProviderImpl.java \ CurrencyNameProviderImpl2.java \ TimeZoneNameProviderImpl.java \ + GenericTimeZoneNameProviderImpl.java \ LocaleNameProviderImpl.java \ CalendarDataProviderImpl.java \ CalendarNameProviderImpl.java \ --- old/test/java/util/PluggableLocale/providersrc/java.util.spi.TimeZoneNameProvider 2012-12-03 11:44:34.000000000 +0900 +++ new/test/java/util/PluggableLocale/providersrc/java.util.spi.TimeZoneNameProvider 2012-12-03 11:44:34.000000000 +0900 @@ -5,3 +5,4 @@ # implementation class # com.bar.TimeZoneNameProviderImpl +com.bar.GenericTimeZoneNameProviderImpl --- old/test/sun/text/resources/LocaleData 2012-12-03 11:44:37.000000000 +0900 +++ new/test/sun/text/resources/LocaleData 2012-12-03 11:44:36.000000000 +0900 @@ -7074,3 +7074,586 @@ # bug 7189611 CurrencyNames/es_VE/VEF=Bs.F. + +# rfe 8000983 (narrow names support) +FormatData//DayNarrows/0=S +FormatData//DayNarrows/1=M +FormatData//DayNarrows/2=T +FormatData//DayNarrows/3=W +FormatData//DayNarrows/4=T +FormatData//DayNarrows/5=F +FormatData//DayNarrows/6=S +FormatData//narrow.AmPmMarkers/0=a +FormatData//narrow.AmPmMarkers/1=p +FormatData//narrow.Eras/0=B +FormatData//narrow.Eras/1=A +FormatData//buddhist.narrow.Eras/0=BC +FormatData//buddhist.narrow.Eras/1=B.E. +FormatData//japanese.narrow.Eras/0= +FormatData//japanese.narrow.Eras/1=M +FormatData//japanese.narrow.Eras/2=T +FormatData//japanese.narrow.Eras/3=S +FormatData//japanese.narrow.Eras/4=H + +FormatData/ar/DayNarrows/0=\u062d +FormatData/ar/DayNarrows/1=\u0646 +FormatData/ar/DayNarrows/2=\u062b +FormatData/ar/DayNarrows/3=\u0631 +FormatData/ar/DayNarrows/4=\u062e +FormatData/ar/DayNarrows/5=\u062c +FormatData/ar/DayNarrows/6=\u0633 + +FormatData/be/standalone.MonthNarrows/0=\u0441 +FormatData/be/standalone.MonthNarrows/1=\u043b +FormatData/be/standalone.MonthNarrows/2=\u0441 +FormatData/be/standalone.MonthNarrows/3=\u043a +FormatData/be/standalone.MonthNarrows/4=\u043c +FormatData/be/standalone.MonthNarrows/5=\u0447 +FormatData/be/standalone.MonthNarrows/6=\u043b +FormatData/be/standalone.MonthNarrows/7=\u0436 +FormatData/be/standalone.MonthNarrows/8=\u0432 +FormatData/be/standalone.MonthNarrows/9=\u043a +FormatData/be/standalone.MonthNarrows/10=\u043b +FormatData/be/standalone.MonthNarrows/11=\u0441 +FormatData/be/standalone.MonthNarrows/12= +FormatData/be/DayNarrows/0=\u043d +FormatData/be/DayNarrows/1=\u043f +FormatData/be/DayNarrows/2=\u0430 +FormatData/be/DayNarrows/3=\u0441 +FormatData/be/DayNarrows/4=\u0447 +FormatData/be/DayNarrows/5=\u043f +FormatData/be/DayNarrows/6=\u0441 + +FormatData/bg/DayNarrows/0=\u043d +FormatData/bg/DayNarrows/1=\u043f +FormatData/bg/DayNarrows/2=\u0432 +FormatData/bg/DayNarrows/3=\u0441 +FormatData/bg/DayNarrows/4=\u0447 +FormatData/bg/DayNarrows/5=\u043f +FormatData/bg/DayNarrows/6=\u0441 + +FormatData/ca/standalone.MonthNarrows/0=g +FormatData/ca/standalone.MonthNarrows/1=f +FormatData/ca/standalone.MonthNarrows/2=m +FormatData/ca/standalone.MonthNarrows/3=a +FormatData/ca/standalone.MonthNarrows/4=m +FormatData/ca/standalone.MonthNarrows/5=j +FormatData/ca/standalone.MonthNarrows/6=j +FormatData/ca/standalone.MonthNarrows/7=a +FormatData/ca/standalone.MonthNarrows/8=s +FormatData/ca/standalone.MonthNarrows/9=o +FormatData/ca/standalone.MonthNarrows/10=n +FormatData/ca/standalone.MonthNarrows/11=d +FormatData/ca/standalone.MonthNarrows/12= +FormatData/ca/DayNarrows/0=G +# Note: "L" is a contribued item in CLDR +FormatData/ca/DayNarrows/1=L +FormatData/ca/DayNarrows/2=T +FormatData/ca/DayNarrows/3=C +FormatData/ca/DayNarrows/4=J +FormatData/ca/DayNarrows/5=V +FormatData/ca/DayNarrows/6=S +FormatData/ca/standalone.DayNarrows/0=g +FormatData/ca/standalone.DayNarrows/1=l +FormatData/ca/standalone.DayNarrows/2=t +FormatData/ca/standalone.DayNarrows/3=c +FormatData/ca/standalone.DayNarrows/4=j +FormatData/ca/standalone.DayNarrows/5=v +FormatData/ca/standalone.DayNarrows/6=s + +FormatData/cs/DayNarrows/0=N +FormatData/cs/DayNarrows/1=P +FormatData/cs/DayNarrows/2=\u00da +FormatData/cs/DayNarrows/3=S +FormatData/cs/DayNarrows/4=\u010c +FormatData/cs/DayNarrows/5=P +FormatData/cs/DayNarrows/6=S + +FormatData/da/DayNarrows/0=S +FormatData/da/DayNarrows/1=M +FormatData/da/DayNarrows/2=T +FormatData/da/DayNarrows/3=O +FormatData/da/DayNarrows/4=T +FormatData/da/DayNarrows/5=F +FormatData/da/DayNarrows/6=L + +FormatData/de/DayNarrows/0=S +FormatData/de/DayNarrows/1=M +FormatData/de/DayNarrows/2=D +FormatData/de/DayNarrows/3=M +FormatData/de/DayNarrows/4=D +FormatData/de/DayNarrows/5=F +FormatData/de/DayNarrows/6=S + +FormatData/el/DayNarrows/0=\u039a +FormatData/el/DayNarrows/1=\u0394 +FormatData/el/DayNarrows/2=\u03a4 +FormatData/el/DayNarrows/3=\u03a4 +FormatData/el/DayNarrows/4=\u03a0 +FormatData/el/DayNarrows/5=\u03a0 +FormatData/el/DayNarrows/6=\u03a3 + +FormatData/es/DayNarrows/0=D +FormatData/es/DayNarrows/1=L +FormatData/es/DayNarrows/2=M +FormatData/es/DayNarrows/3=X +FormatData/es/DayNarrows/4=J +FormatData/es/DayNarrows/5=V +FormatData/es/DayNarrows/6=S + +FormatData/et/DayNarrows/0=P +FormatData/et/DayNarrows/1=E +FormatData/et/DayNarrows/2=T +FormatData/et/DayNarrows/3=K +FormatData/et/DayNarrows/4=N +FormatData/et/DayNarrows/5=R +FormatData/et/DayNarrows/6=L + +FormatData/fi/standalone.MonthNarrows/0=T +FormatData/fi/standalone.MonthNarrows/1=H +FormatData/fi/standalone.MonthNarrows/2=M +FormatData/fi/standalone.MonthNarrows/3=H +FormatData/fi/standalone.MonthNarrows/4=T +FormatData/fi/standalone.MonthNarrows/5=K +FormatData/fi/standalone.MonthNarrows/6=H +FormatData/fi/standalone.MonthNarrows/7=E +FormatData/fi/standalone.MonthNarrows/8=S +FormatData/fi/standalone.MonthNarrows/9=L +FormatData/fi/standalone.MonthNarrows/10=M +FormatData/fi/standalone.MonthNarrows/11=J +FormatData/fi/standalone.MonthNarrows/12= +FormatData/fi/DayNarrows/0=S +FormatData/fi/DayNarrows/1=M +FormatData/fi/DayNarrows/2=T +FormatData/fi/DayNarrows/3=K +FormatData/fi/DayNarrows/4=T +FormatData/fi/DayNarrows/5=P +FormatData/fi/DayNarrows/6=L +FormatData/fi/standalone.DayNarrows/0=S +FormatData/fi/standalone.DayNarrows/1=M +FormatData/fi/standalone.DayNarrows/2=T +FormatData/fi/standalone.DayNarrows/3=K +FormatData/fi/standalone.DayNarrows/4=T +FormatData/fi/standalone.DayNarrows/5=P +FormatData/fi/standalone.DayNarrows/6=L +FormatData/fi/narrow.AmPmMarkers/0=ap. +FormatData/fi/narrow.AmPmMarkers/1=ip. + +FormatData/fr/DayNarrows/0=D +FormatData/fr/DayNarrows/1=L +FormatData/fr/DayNarrows/2=M +FormatData/fr/DayNarrows/3=M +FormatData/fr/DayNarrows/4=J +FormatData/fr/DayNarrows/5=V +FormatData/fr/DayNarrows/6=S + +FormatData/hi_IN/DayNarrows/0=\u0930 +FormatData/hi_IN/DayNarrows/1=\u0938\u094b +FormatData/hi_IN/DayNarrows/2=\u092e\u0902 +FormatData/hi_IN/DayNarrows/3=\u092c\u0941 +FormatData/hi_IN/DayNarrows/4=\u0917\u0941 +FormatData/hi_IN/DayNarrows/5=\u0936\u0941 +FormatData/hi_IN/DayNarrows/6=\u0936 + +FormatData/hr/standalone.MonthNarrows/0=1. +FormatData/hr/standalone.MonthNarrows/1=2. +FormatData/hr/standalone.MonthNarrows/2=3. +FormatData/hr/standalone.MonthNarrows/3=4. +FormatData/hr/standalone.MonthNarrows/4=5. +FormatData/hr/standalone.MonthNarrows/5=6. +FormatData/hr/standalone.MonthNarrows/6=7. +FormatData/hr/standalone.MonthNarrows/7=8. +FormatData/hr/standalone.MonthNarrows/8=9. +FormatData/hr/standalone.MonthNarrows/9=10. +FormatData/hr/standalone.MonthNarrows/10=11. +FormatData/hr/standalone.MonthNarrows/11=12. +FormatData/hr/standalone.MonthNarrows/12= +FormatData/hr/DayNarrows/0=N +FormatData/hr/DayNarrows/1=P +FormatData/hr/DayNarrows/2=U +FormatData/hr/DayNarrows/3=S +FormatData/hr/DayNarrows/4=\u010c +FormatData/hr/DayNarrows/5=P +FormatData/hr/DayNarrows/6=S +FormatData/hr/standalone.DayNarrows/0=n +FormatData/hr/standalone.DayNarrows/1=p +FormatData/hr/standalone.DayNarrows/2=u +FormatData/hr/standalone.DayNarrows/3=s +FormatData/hr/standalone.DayNarrows/4=\u010d +FormatData/hr/standalone.DayNarrows/5=p +FormatData/hr/standalone.DayNarrows/6=s + +FormatData/hu/DayNarrows/0=V +FormatData/hu/DayNarrows/1=H +FormatData/hu/DayNarrows/2=K +FormatData/hu/DayNarrows/3=Sz +FormatData/hu/DayNarrows/4=Cs +FormatData/hu/DayNarrows/5=P +FormatData/hu/DayNarrows/6=Sz + +FormatData/is/standalone.MonthNarrows/0=j +FormatData/is/standalone.MonthNarrows/1=f +FormatData/is/standalone.MonthNarrows/2=m +FormatData/is/standalone.MonthNarrows/3=a +FormatData/is/standalone.MonthNarrows/4=m +FormatData/is/standalone.MonthNarrows/5=j +FormatData/is/standalone.MonthNarrows/6=j +FormatData/is/standalone.MonthNarrows/7=\u00e1 +FormatData/is/standalone.MonthNarrows/8=s +FormatData/is/standalone.MonthNarrows/9=o +FormatData/is/standalone.MonthNarrows/10=n +FormatData/is/standalone.MonthNarrows/11=d +FormatData/is/standalone.MonthNarrows/12= +FormatData/is/DayNarrows/0=S +FormatData/is/DayNarrows/1=M +FormatData/is/DayNarrows/2=\u00de +FormatData/is/DayNarrows/3=M +FormatData/is/DayNarrows/4=F +FormatData/is/DayNarrows/5=F +FormatData/is/DayNarrows/6=L +FormatData/is/standalone.DayNarrows/0=s +FormatData/is/standalone.DayNarrows/1=m +FormatData/is/standalone.DayNarrows/2=\u00fe +FormatData/is/standalone.DayNarrows/3=m +FormatData/is/standalone.DayNarrows/4=f +FormatData/is/standalone.DayNarrows/5=f +FormatData/is/standalone.DayNarrows/6=l + +FormatData/it/DayNarrows/0=D +FormatData/it/DayNarrows/1=L +FormatData/it/DayNarrows/2=M +FormatData/it/DayNarrows/3=M +FormatData/it/DayNarrows/4=G +FormatData/it/DayNarrows/5=V +FormatData/it/DayNarrows/6=S + +FormatData/iw/DayNarrows/0=\u05d0 +FormatData/iw/DayNarrows/1=\u05d1 +FormatData/iw/DayNarrows/2=\u05d2 +FormatData/iw/DayNarrows/3=\u05d3 +FormatData/iw/DayNarrows/4=\u05d4 +FormatData/iw/DayNarrows/5=\u05d5 +FormatData/iw/DayNarrows/6=\u05e9 +FormatData/iw/standalone.DayNarrows/0=\u05d0 +FormatData/iw/standalone.DayNarrows/1=\u05d1 +FormatData/iw/standalone.DayNarrows/2=\u05d2 +FormatData/iw/standalone.DayNarrows/3=\u05d3 +FormatData/iw/standalone.DayNarrows/4=\u05d4 +FormatData/iw/standalone.DayNarrows/5=\u05d5 +FormatData/iw/standalone.DayNarrows/6=\u05e9 + +FormatData/ja/DayNarrows/0=\u65e5 +FormatData/ja/DayNarrows/1=\u6708 +FormatData/ja/DayNarrows/2=\u706b +FormatData/ja/DayNarrows/3=\u6c34 +FormatData/ja/DayNarrows/4=\u6728 +FormatData/ja/DayNarrows/5=\u91d1 +FormatData/ja/DayNarrows/6=\u571f + +FormatData/ko/DayNarrows/0=\uc77c +FormatData/ko/DayNarrows/1=\uc6d4 +FormatData/ko/DayNarrows/2=\ud654 +FormatData/ko/DayNarrows/3=\uc218 +FormatData/ko/DayNarrows/4=\ubaa9 +FormatData/ko/DayNarrows/5=\uae08 +FormatData/ko/DayNarrows/6=\ud1a0 + +FormatData/lt/standalone.MonthNarrows/0=S +FormatData/lt/standalone.MonthNarrows/1=V +FormatData/lt/standalone.MonthNarrows/2=K +FormatData/lt/standalone.MonthNarrows/3=B +FormatData/lt/standalone.MonthNarrows/4=G +FormatData/lt/standalone.MonthNarrows/5=B +FormatData/lt/standalone.MonthNarrows/6=L +FormatData/lt/standalone.MonthNarrows/7=R +FormatData/lt/standalone.MonthNarrows/8=R +FormatData/lt/standalone.MonthNarrows/9=S +FormatData/lt/standalone.MonthNarrows/10=L +FormatData/lt/standalone.MonthNarrows/11=G +FormatData/lt/standalone.MonthNarrows/12= + +FormatData/lt/DayNarrows/0=S +FormatData/lt/DayNarrows/1=P +FormatData/lt/DayNarrows/2=A +FormatData/lt/DayNarrows/3=T +FormatData/lt/DayNarrows/4=K +FormatData/lt/DayNarrows/5=P +FormatData/lt/DayNarrows/6=\u0160 +FormatData/lt/standalone.DayNarrows/0=S +FormatData/lt/standalone.DayNarrows/1=P +FormatData/lt/standalone.DayNarrows/2=A +FormatData/lt/standalone.DayNarrows/3=T +FormatData/lt/standalone.DayNarrows/4=K +FormatData/lt/standalone.DayNarrows/5=P +FormatData/lt/standalone.DayNarrows/6=\u0160 + +FormatData/lv/DayNarrows/0=S +FormatData/lv/DayNarrows/1=P +FormatData/lv/DayNarrows/2=O +FormatData/lv/DayNarrows/3=T +FormatData/lv/DayNarrows/4=C +FormatData/lv/DayNarrows/5=P +FormatData/lv/DayNarrows/6=S + +FormatData/mk/DayNarrows/0=\u043d +FormatData/mk/DayNarrows/1=\u043f +FormatData/mk/DayNarrows/2=\u0432 +FormatData/mk/DayNarrows/3=\u0441 +FormatData/mk/DayNarrows/4=\u0447 +FormatData/mk/DayNarrows/5=\u043f +FormatData/mk/DayNarrows/6=\u0441 + +FormatData/ms/standalone.MonthNarrows/0=J +FormatData/ms/standalone.MonthNarrows/1=F +FormatData/ms/standalone.MonthNarrows/2=M +FormatData/ms/standalone.MonthNarrows/3=A +FormatData/ms/standalone.MonthNarrows/4=M +FormatData/ms/standalone.MonthNarrows/5=J +FormatData/ms/standalone.MonthNarrows/6=J +FormatData/ms/standalone.MonthNarrows/7=O +FormatData/ms/standalone.MonthNarrows/8=S +FormatData/ms/standalone.MonthNarrows/9=O +FormatData/ms/standalone.MonthNarrows/10=N +FormatData/ms/standalone.MonthNarrows/11=D +FormatData/ms/standalone.MonthNarrows/12= +FormatData/ms/DayNarrows/0=A +FormatData/ms/DayNarrows/1=I +FormatData/ms/DayNarrows/2=S +FormatData/ms/DayNarrows/3=R +FormatData/ms/DayNarrows/4=K +FormatData/ms/DayNarrows/5=J +FormatData/ms/DayNarrows/6=S +FormatData/ms/standalone.DayNarrows/0=A +FormatData/ms/standalone.DayNarrows/1=I +FormatData/ms/standalone.DayNarrows/2=S +FormatData/ms/standalone.DayNarrows/3=R +FormatData/ms/standalone.DayNarrows/4=K +FormatData/ms/standalone.DayNarrows/5=J +FormatData/ms/standalone.DayNarrows/6=S + +FormatData/mt/DayNarrows/0=\u0126 +FormatData/mt/DayNarrows/1=T +FormatData/mt/DayNarrows/2=T +FormatData/mt/DayNarrows/3=E +FormatData/mt/DayNarrows/4=\u0126 +FormatData/mt/DayNarrows/5=\u0120 +FormatData/mt/DayNarrows/6=S + +FormatData/nl/DayNarrows/0=Z +FormatData/nl/DayNarrows/1=M +FormatData/nl/DayNarrows/2=D +FormatData/nl/DayNarrows/3=W +FormatData/nl/DayNarrows/4=D +FormatData/nl/DayNarrows/5=V +FormatData/nl/DayNarrows/6=Z + +FormatData/pl/DayNarrows/0=N +FormatData/pl/DayNarrows/1=P +FormatData/pl/DayNarrows/2=W +FormatData/pl/DayNarrows/3=\u015a +FormatData/pl/DayNarrows/4=C +FormatData/pl/DayNarrows/5=P +FormatData/pl/DayNarrows/6=S + +FormatData/pt/DayNarrows/0=D +FormatData/pt/DayNarrows/1=S +FormatData/pt/DayNarrows/2=T +FormatData/pt/DayNarrows/3=Q +FormatData/pt/DayNarrows/4=Q +FormatData/pt/DayNarrows/5=S +FormatData/pt/DayNarrows/6=S + +FormatData/ro/standalone.MonthNarrows/0=I +FormatData/ro/standalone.MonthNarrows/1=F +FormatData/ro/standalone.MonthNarrows/2=M +FormatData/ro/standalone.MonthNarrows/3=A +FormatData/ro/standalone.MonthNarrows/4=M +FormatData/ro/standalone.MonthNarrows/5=I +FormatData/ro/standalone.MonthNarrows/6=I +FormatData/ro/standalone.MonthNarrows/7=A +FormatData/ro/standalone.MonthNarrows/8=S +FormatData/ro/standalone.MonthNarrows/9=O +FormatData/ro/standalone.MonthNarrows/10=N +FormatData/ro/standalone.MonthNarrows/11=D +FormatData/ro/standalone.MonthNarrows/12= +# commented out DayNarrows due to mostly undefined +#FormatData/ro/DayNarrows/0=D +#FormatData/ro/DayNarrows/1= +#FormatData/ro/DayNarrows/2= +#FormatData/ro/DayNarrows/3= +#FormatData/ro/DayNarrows/4= +#FormatData/ro/DayNarrows/5= +#FormatData/ro/DayNarrows/6= +FormatData/ro/standalone.DayNarrows/0=D +FormatData/ro/standalone.DayNarrows/1=L +FormatData/ro/standalone.DayNarrows/2=M +FormatData/ro/standalone.DayNarrows/3=M +FormatData/ro/standalone.DayNarrows/4=J +FormatData/ro/standalone.DayNarrows/5=V +FormatData/ro/standalone.DayNarrows/6=S + +FormatData/ru/DayNarrows/0=\u0412 +FormatData/ru/DayNarrows/1=\u041f\u043d +FormatData/ru/DayNarrows/2=\u0412\u0442 +FormatData/ru/DayNarrows/3=\u0421 +FormatData/ru/DayNarrows/4=\u0427 +FormatData/ru/DayNarrows/5=\u041f +# Note: "sat" is an contributed item in CLDR. +FormatData/ru/DayNarrows/6=\u0421 + +FormatData/ru/standalone.DayNarrows/0=\u0412 +FormatData/ru/standalone.DayNarrows/1=\u041f +FormatData/ru/standalone.DayNarrows/2=\u0412 +FormatData/ru/standalone.DayNarrows/3=\u0421 +FormatData/ru/standalone.DayNarrows/4=\u0427 +FormatData/ru/standalone.DayNarrows/5=\u041f +FormatData/ru/standalone.DayNarrows/6=\u0421 + +FormatData/sk/DayNarrows/0=N +FormatData/sk/DayNarrows/1=P +FormatData/sk/DayNarrows/2=U +FormatData/sk/DayNarrows/3=S +FormatData/sk/DayNarrows/4=\u0160 +FormatData/sk/DayNarrows/5=P +FormatData/sk/DayNarrows/6=S + +FormatData/sl/DayNarrows/0=n +FormatData/sl/DayNarrows/1=p +FormatData/sl/DayNarrows/2=t +FormatData/sl/DayNarrows/3=s +FormatData/sl/DayNarrows/4=\u010d +FormatData/sl/DayNarrows/5=p +FormatData/sl/DayNarrows/6=s + +FormatData/sq/DayNarrows/0=D +FormatData/sq/DayNarrows/1=H +FormatData/sq/DayNarrows/2=M +FormatData/sq/DayNarrows/3=M +FormatData/sq/DayNarrows/4=E +FormatData/sq/DayNarrows/5=P +FormatData/sq/DayNarrows/6=S + +FormatData/sr/DayNarrows/0=\u043d +FormatData/sr/DayNarrows/1=\u043f +FormatData/sr/DayNarrows/2=\u0443 +FormatData/sr/DayNarrows/3=\u0441 +FormatData/sr/DayNarrows/4=\u0447 +FormatData/sr/DayNarrows/5=\u043f +FormatData/sr/DayNarrows/6=\u0441 +FormatData/sr/short.Eras/0=\u043f. \u043d. \u0435. +FormatData/sr/short.Eras/1=\u043d. \u0435. +FormatData/sr/narrow.Eras/0=\u043f.\u043d.\u0435. +FormatData/sr/narrow.Eras/1=\u043d.\u0435. + +FormatData/sv/standalone.MonthNarrows/0=J +FormatData/sv/standalone.MonthNarrows/1=F +FormatData/sv/standalone.MonthNarrows/2=M +FormatData/sv/standalone.MonthNarrows/3=A +FormatData/sv/standalone.MonthNarrows/4=M +FormatData/sv/standalone.MonthNarrows/5=J +FormatData/sv/standalone.MonthNarrows/6=J +FormatData/sv/standalone.MonthNarrows/7=A +FormatData/sv/standalone.MonthNarrows/8=S +FormatData/sv/standalone.MonthNarrows/9=O +FormatData/sv/standalone.MonthNarrows/10=N +FormatData/sv/standalone.MonthNarrows/11=D +FormatData/sv/standalone.MonthNarrows/12= +FormatData/sv/DayNarrows/0=S +FormatData/sv/DayNarrows/1=M +FormatData/sv/DayNarrows/2=T +FormatData/sv/DayNarrows/3=O +FormatData/sv/DayNarrows/4=T +FormatData/sv/DayNarrows/5=F +FormatData/sv/DayNarrows/6=L +FormatData/sv/standalone.DayNarrows/0=S +FormatData/sv/standalone.DayNarrows/1=M +FormatData/sv/standalone.DayNarrows/2=T +FormatData/sv/standalone.DayNarrows/3=O +FormatData/sv/standalone.DayNarrows/4=T +FormatData/sv/standalone.DayNarrows/5=F +FormatData/sv/standalone.DayNarrows/6=L +FormatData/sv/narrow.Eras/0=f.Kr. +FormatData/sv/narrow.Eras/1=e.Kr. +FormatData/sv/narrow.AmPmMarkers/0=f +FormatData/sv/narrow.AmPmMarkers/1=e + +FormatData/th/standalone.MonthNarrows/0=\u0e21.\u0e04. +FormatData/th/standalone.MonthNarrows/1=\u0e01.\u0e1e. +FormatData/th/standalone.MonthNarrows/2=\u0e21\u0e35.\u0e04. +FormatData/th/standalone.MonthNarrows/3=\u0e40\u0e21.\u0e22. +FormatData/th/standalone.MonthNarrows/4=\u0e1e.\u0e04. +FormatData/th/standalone.MonthNarrows/5=\u0e21\u0e34.\u0e22. +FormatData/th/standalone.MonthNarrows/6=\u0e01.\u0e04. +FormatData/th/standalone.MonthNarrows/7=\u0e2a.\u0e04. +FormatData/th/standalone.MonthNarrows/8=\u0e01.\u0e22. +FormatData/th/standalone.MonthNarrows/9=\u0e15.\u0e04. +FormatData/th/standalone.MonthNarrows/10=\u0e1e.\u0e22. +FormatData/th/standalone.MonthNarrows/11=\u0e18.\u0e04. +FormatData/th/standalone.MonthNarrows/12= +FormatData/th/DayNarrows/0=\u0e2d +FormatData/th/DayNarrows/1=\u0e08 +FormatData/th/DayNarrows/2=\u0e2d +FormatData/th/DayNarrows/3=\u0e1e +FormatData/th/DayNarrows/4=\u0e1e +FormatData/th/DayNarrows/5=\u0e28 +FormatData/th/DayNarrows/6=\u0e2a +FormatData/th/narrow.Eras/0=\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28. +FormatData/th/narrow.Eras/1=\u0e04.\u0e28. + +FormatData/tr/standalone.MonthNarrows/0=O +FormatData/tr/standalone.MonthNarrows/1=\u015e +FormatData/tr/standalone.MonthNarrows/2=M +FormatData/tr/standalone.MonthNarrows/3=N +FormatData/tr/standalone.MonthNarrows/4=M +FormatData/tr/standalone.MonthNarrows/5=H +FormatData/tr/standalone.MonthNarrows/6=T +FormatData/tr/standalone.MonthNarrows/7=A +FormatData/tr/standalone.MonthNarrows/8=E +FormatData/tr/standalone.MonthNarrows/9=E +FormatData/tr/standalone.MonthNarrows/10=K +FormatData/tr/standalone.MonthNarrows/11=A +FormatData/tr/standalone.MonthNarrows/12= +FormatData/tr/DayNarrows/0=P +FormatData/tr/DayNarrows/1=P +FormatData/tr/DayNarrows/2=S +FormatData/tr/DayNarrows/3=\u00c7 +FormatData/tr/DayNarrows/4=P +FormatData/tr/DayNarrows/5=C +FormatData/tr/DayNarrows/6=C + +FormatData/uk/DayNarrows/0=\u041d +FormatData/uk/DayNarrows/1=\u041f +FormatData/uk/DayNarrows/2=\u0412 +FormatData/uk/DayNarrows/3=\u0421 +FormatData/uk/DayNarrows/4=\u0427 +FormatData/uk/DayNarrows/5=\u041f +FormatData/uk/DayNarrows/6=\u0421 + +FormatData/vi/DayNarrows/0=CN +FormatData/vi/DayNarrows/1=T2 +FormatData/vi/DayNarrows/2=T3 +FormatData/vi/DayNarrows/3=T4 +FormatData/vi/DayNarrows/4=T5 +FormatData/vi/DayNarrows/5=T6 +FormatData/vi/DayNarrows/6=T7 + +FormatData/zh/standalone.MonthNarrows/0=1\u6708 +FormatData/zh/standalone.MonthNarrows/1=2\u6708 +FormatData/zh/standalone.MonthNarrows/2=3\u6708 +FormatData/zh/standalone.MonthNarrows/3=4\u6708 +FormatData/zh/standalone.MonthNarrows/4=5\u6708 +FormatData/zh/standalone.MonthNarrows/5=6\u6708 +FormatData/zh/standalone.MonthNarrows/6=7\u6708 +FormatData/zh/standalone.MonthNarrows/7=8\u6708 +FormatData/zh/standalone.MonthNarrows/8=9\u6708 +FormatData/zh/standalone.MonthNarrows/9=10\u6708 +FormatData/zh/standalone.MonthNarrows/10=11\u6708 +FormatData/zh/standalone.MonthNarrows/11=12\u6708 +FormatData/zh/standalone.MonthNarrows/12= +FormatData/zh/DayNarrows/0=\u65e5 +FormatData/zh/DayNarrows/1=\u4e00 +FormatData/zh/DayNarrows/2=\u4e8c +FormatData/zh/DayNarrows/3=\u4e09 +FormatData/zh/DayNarrows/4=\u56db +FormatData/zh/DayNarrows/5=\u4e94 +FormatData/zh/DayNarrows/6=\u516d --- old/test/sun/text/resources/LocaleDataTest.java 2012-12-03 11:44:40.000000000 +0900 +++ new/test/sun/text/resources/LocaleDataTest.java 2012-12-03 11:44:40.000000000 +0900 @@ -34,7 +34,7 @@ * 6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611 * 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787 * 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495 - * 7003124 7085757 7028073 7171028 7189611 + * 7003124 7085757 7028073 7171028 7189611 8000983 * @summary Verify locale data * */