src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java

Print this page
rev 6663 : imported patch 8008576

*** 30,52 **** --- 30,55 ---- import java.text.spi.DateFormatProvider; import java.text.spi.DateFormatSymbolsProvider; import java.text.spi.DecimalFormatSymbolsProvider; import java.text.spi.NumberFormatProvider; import java.util.Collections; + import java.util.Calendar; import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle.Control; import java.util.Set; + import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.spi.CalendarDataProvider; import java.util.spi.CalendarNameProvider; import java.util.spi.CurrencyNameProvider; import java.util.spi.LocaleNameProvider; import java.util.spi.TimeZoneNameProvider; + import sun.util.spi.CalendarProvider; /** * LocaleProviderAdapter implementation for the Mac OS X locale data * * @author Naoto Sato
*** 92,112 **** private static final int DN_TZ_LONG_STANDARD = 2; private static final int DN_TZ_LONG_DST = 3; private static final Set<Locale> supportedLocaleSet; static { ! Set<Locale> tmpSet = new HashSet<Locale>(); // Assuming the default locales do not include any extensions, so // no stripping is needed here. ! Locale l = Locale.forLanguageTag(getDefaultLocale(CAT_FORMAT).replaceAll("_","-")); tmpSet.addAll(Control.getNoFallbackControl(Control.FORMAT_DEFAULT).getCandidateLocales("", l)); ! l = Locale.forLanguageTag(getDefaultLocale(CAT_DISPLAY).replaceAll("_","-")); tmpSet.addAll(Control.getNoFallbackControl(Control.FORMAT_DEFAULT).getCandidateLocales("", l)); supportedLocaleSet = Collections.unmodifiableSet(tmpSet); } private final static Locale[] supportedLocale = supportedLocaleSet.toArray(new Locale[0]); public static DateFormatProvider getDateFormatProvider() { return new DateFormatProvider() { @Override public Locale[] getAvailableLocales() { --- 95,154 ---- private static final int DN_TZ_LONG_STANDARD = 2; private static final int DN_TZ_LONG_DST = 3; private static final Set<Locale> supportedLocaleSet; static { ! Set<Locale> tmpSet = new HashSet<>(); // Assuming the default locales do not include any extensions, so // no stripping is needed here. ! Locale l = convertPosixLocaleToJavaLocale(getDefaultLocale(CAT_FORMAT)); tmpSet.addAll(Control.getNoFallbackControl(Control.FORMAT_DEFAULT).getCandidateLocales("", l)); ! l = convertPosixLocaleToJavaLocale(getDefaultLocale(CAT_DISPLAY)); tmpSet.addAll(Control.getNoFallbackControl(Control.FORMAT_DEFAULT).getCandidateLocales("", l)); supportedLocaleSet = Collections.unmodifiableSet(tmpSet); } private final static Locale[] supportedLocale = supportedLocaleSet.toArray(new Locale[0]); + @SuppressWarnings("fallthrough") + private static Locale convertPosixLocaleToJavaLocale(String posix) { + // MacOSX may return ICU notation, here is the quote from CFLocale doc: + // "The corresponding value is a CFString containing the POSIX locale + // identifier as used by ICU, such as "ja_JP". If you have a variant + // locale or a different currency or calendar, it can be as complex as + // "en_US_POSIX@calendar=japanese;currency=EUR" or + // "az_Cyrl_AZ@calendar=buddhist;currency=JPY". + String[] tmp = posix.split("@"); + String langTag = tmp[0].replaceAll("_","-"); + if (tmp.length > 1) { + String[] ext = tmp[1].split(";"); + for (String keyval : ext) { + // We are only interested in "calendar" value for now. + if (keyval.startsWith("calendar=")) { + String calid = keyval.substring(keyval.indexOf('=')+1); + switch (calid) { + case "gregorian": + langTag += "-u-ca-gregory"; + break; + case "japanese": + // Tweak for ja_JP_JP + if (tmp[0].equals("ja_JP")) { + return JRELocaleConstants.JA_JP_JP; + } + + // fall through + + default: + langTag += "-u-ca-" + calid; + break; + } + } + } + } + + return Locale.forLanguageTag(langTag); + } + public static DateFormatProvider getDateFormatProvider() { return new DateFormatProvider() { @Override public Locale[] getAvailableLocales() {
*** 168,178 **** @Override public Locale[] getAvailableLocales() { if (isSupportedLocale(Locale.getDefault(Locale.Category.FORMAT))) { return supportedLocale; } - return new Locale[0]; } @Override public boolean isSupportedLocale(Locale locale) { --- 210,219 ----
*** 360,369 **** --- 401,434 ---- return null; } }; } + public static CalendarProvider getCalendarProvider() { + return new CalendarProvider() { + @Override + public Locale[] getAvailableLocales() { + return getSupportedCalendarLocales(); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return isSupportedCalendarLocale(locale); + } + + @Override + public Calendar getInstance(TimeZone zone, Locale locale) { + return new Calendar.Builder() + .setLocale(locale) + .setCalendarType(getCalendarID(locale.toLanguageTag()) + .replaceFirst("gregorian", "gregory")) + .setTimeZone(zone) + .build(); + } + }; + } + public static CurrencyNameProvider getCurrencyNameProvider() { return new CurrencyNameProvider() { @Override public Locale[] getAvailableLocales() { return supportedLocale;
*** 453,497 **** } return supportedLocale; } private static boolean isSupportedCalendarLocale(Locale locale) { - // special case for ja_JP_JP - if (JRELocaleConstants.JA_JP_JP.equals(locale)) { - return isJapaneseCalendar(); - } - Locale base = locale.stripExtensions(); if (!supportedLocaleSet.contains(base)) { return false; } ! String caltype = locale.getUnicodeLocaleType("ca"); ! if (caltype == null) { ! return true; ! } ! return caltype.replaceFirst("gregory", "gregorian").equals( ! getCalendarID(locale.toLanguageTag())); } private static boolean isJapaneseCalendar() { return getCalendarID("ja-JP").equals("japanese"); } private static Locale getCalendarLocale(Locale locale) { ! Locale.Builder lb = new Locale.Builder().setLocale(locale); ! String calid = getCalendarID(locale.toLanguageTag()); ! switch (calid) { ! case "gregorian": ! calid = "gregory"; ! // FALL THROUGH! ! case "japanese": ! case "buddhist": ! lb.setUnicodeLocaleKeyword("ca", calid); ! return lb.build(); ! default: return locale; } } // The following methods are copied from CLDRConverter build tool. --- 518,556 ---- } return supportedLocale; } private static boolean isSupportedCalendarLocale(Locale locale) { Locale base = locale.stripExtensions(); if (!supportedLocaleSet.contains(base)) { return false; } ! String requestedCalType = locale.getUnicodeLocaleType("ca"); ! String nativeCalType = ! getCalendarID(locale.toLanguageTag()).replaceFirst("gregorian", "gregory"); ! if (requestedCalType == null) { ! return Calendar.getAvailableCalendarTypes().contains(nativeCalType); ! } else { ! return requestedCalType.equals(nativeCalType); } + } private static boolean isJapaneseCalendar() { return getCalendarID("ja-JP").equals("japanese"); } private static Locale getCalendarLocale(Locale locale) { ! String nativeCalType = getCalendarID(locale.toLanguageTag()) ! .replaceFirst("gregorian", "gregory"); ! if (Calendar.getAvailableCalendarTypes().contains(nativeCalType)) { ! return new Locale.Builder() ! .setLocale(locale) ! .setUnicodeLocaleKeyword("ca", nativeCalType) ! .build(); ! } else { return locale; } } // The following methods are copied from CLDRConverter build tool.