src/share/classes/sun/util/resources/LocaleData.java
Print this page
rev 5615 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o Jigsaw. by Naoto Sato and Masayoshi Okutsu)
*** 1,7 ****
/*
! * Copyright (c) 1996, 2011, 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. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1996, 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. Oracle designates this
*** 38,154 ****
*
*/
package sun.util.resources;
- import java.io.File;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
! import java.util.StringTokenizer;
- import sun.util.LocaleDataMetaInfo;
-
/**
* Provides information about and access to resource bundles in the
! * sun.text.resources and sun.util.resources package.
*
* @author Asmus Freytag
* @author Mark Davis
*/
public class LocaleData {
! private static final String localeDataJarName = "localedata.jar";
!
! /**
! * Lazy load available locales.
! */
! private static class AvailableLocales {
! static final Locale[] localeList = createLocaleList();
}
/**
- * Returns a list of the installed locales. Currently, this simply returns
- * the list of locales for which a sun.text.resources.FormatData bundle
- * exists. This bundle family happens to be the one with the broadest
- * locale coverage in the JRE.
- */
- public static Locale[] getAvailableLocales() {
- return AvailableLocales.localeList.clone();
- }
-
- /**
* Gets a calendar data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static ResourceBundle getCalendarData(Locale locale) {
! return getBundle("sun.util.resources.CalendarData", locale);
}
/**
* Gets a currency names resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static OpenListResourceBundle getCurrencyNames(Locale locale) {
! return (OpenListResourceBundle)getBundle("sun.util.resources.CurrencyNames", locale);
}
/**
* Gets a locale names resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static OpenListResourceBundle getLocaleNames(Locale locale) {
! return (OpenListResourceBundle)getBundle("sun.util.resources.LocaleNames", locale);
}
/**
* Gets a time zone names resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static OpenListResourceBundle getTimeZoneNames(Locale locale) {
! return (OpenListResourceBundle)getBundle("sun.util.resources.TimeZoneNames", locale);
}
/**
* Gets a collation data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static ResourceBundle getCollationData(Locale locale) {
! return getBundle("sun.text.resources.CollationData", locale);
}
/**
* Gets a date format data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static ResourceBundle getDateFormatData(Locale locale) {
! return getBundle("sun.text.resources.FormatData", locale);
}
/**
* Gets a number format data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public static ResourceBundle getNumberFormatData(Locale locale) {
! return getBundle("sun.text.resources.FormatData", locale);
}
! private static ResourceBundle getBundle(final String baseName, final Locale locale) {
return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
public ResourceBundle run() {
return ResourceBundle.
getBundle(baseName, locale,
LocaleDataResourceBundleControl.getRBControlInstance());
}
});
}
! static class LocaleDataResourceBundleControl extends ResourceBundle.Control {
/* Singlton instance of ResourceBundle.Control. */
private static LocaleDataResourceBundleControl rbControlInstance =
new LocaleDataResourceBundleControl();
public static LocaleDataResourceBundleControl getRBControlInstance() {
--- 38,141 ----
*
*/
package sun.util.resources;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
! 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
! * sun.text.resources and sun.util.resources packages or in their corresponding
! * packages for CLDR.
*
* @author Asmus Freytag
* @author Mark Davis
*/
public class LocaleData {
+ private final LocaleProviderAdapter.Type type;
! public LocaleData(LocaleProviderAdapter.Type type) {
! this.type = type;
}
/**
* Gets a calendar data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public ResourceBundle getCalendarData(Locale locale) {
! return getBundle(type.getUtilResourcesPackage() + ".CalendarData", locale);
}
/**
* Gets a currency names resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public OpenListResourceBundle getCurrencyNames(Locale locale) {
! return (OpenListResourceBundle) getBundle(type.getUtilResourcesPackage() + ".CurrencyNames", locale);
}
/**
* Gets a locale names resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public OpenListResourceBundle getLocaleNames(Locale locale) {
! return (OpenListResourceBundle) getBundle(type.getUtilResourcesPackage() + ".LocaleNames", locale);
}
/**
* 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);
}
/**
* Gets a collation data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public ResourceBundle getCollationData(Locale locale) {
! return getBundle(type.getTextResourcesPackage() + ".CollationData", locale);
}
/**
* Gets a date format data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public ResourceBundle getDateFormatData(Locale locale) {
! return getBundle(type.getTextResourcesPackage() + ".FormatData", locale);
}
/**
* Gets a number format data resource bundle, using privileges
* to allow accessing a sun.* package.
*/
! public ResourceBundle getNumberFormatData(Locale locale) {
! return getBundle(type.getTextResourcesPackage() + ".FormatData", locale);
}
! public static ResourceBundle getBundle(final String baseName, final Locale locale) {
return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
+ @Override
public ResourceBundle run() {
return ResourceBundle.
getBundle(baseName, locale,
LocaleDataResourceBundleControl.getRBControlInstance());
}
});
}
! private static class LocaleDataResourceBundleControl extends ResourceBundle.Control {
/* Singlton instance of ResourceBundle.Control. */
private static LocaleDataResourceBundleControl rbControlInstance =
new LocaleDataResourceBundleControl();
public static LocaleDataResourceBundleControl getRBControlInstance() {
*** 169,185 ****
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
List<Locale> candidates = super.getCandidateLocales(baseName, locale);
/* Get the locale string list from LocaleDataMetaInfo class. */
String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName);
! if (localeString.length() == 0) {
return candidates;
}
for (Iterator<Locale> l = candidates.iterator(); l.hasNext(); ) {
Locale loc = l.next();
! String lstr = null;
if (loc.getScript().length() > 0) {
lstr = loc.toLanguageTag().replace('-', '_');
} else {
lstr = loc.toString();
int idx = lstr.indexOf("_#");
--- 156,172 ----
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
List<Locale> candidates = super.getCandidateLocales(baseName, locale);
/* Get the locale string list from LocaleDataMetaInfo class. */
String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName);
! if (localeString == null || localeString.length() == 0) {
return candidates;
}
for (Iterator<Locale> 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("_#");
*** 212,286 ****
if (baseName == null || locale == null) {
throw new NullPointerException();
}
return null;
}
- }
! /*
! * Returns true if the non European resources jar file exists in jre
! * extension directory.
! * @returns true if the jar file is there. Otherwise, returns false.
! */
! private static boolean isNonEuroLangSupported() {
! final String sep = File.separator;
! String localeDataJar =
! java.security.AccessController.doPrivileged(
! new sun.security.action.GetPropertyAction("java.home")) +
! sep + "lib" + sep + "ext" + sep + localeDataJarName;
! /* Peek at the installed extension directory to see if
! localedata.jar is installed or not.
*/
! final File f = new File(localeDataJar);
! boolean isNonEuroResJarExist =
! AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
! public Boolean run() {
! return Boolean.valueOf(f.exists());
}
! }).booleanValue();
!
! return isNonEuroResJarExist;
}
-
- /*
- * This method gets the locale string list from LocaleDataMetaInfo class and
- * then contructs the Locale array based on the locale string returned above.
- * @returns the Locale array for the supported locale of JRE.
- *
- */
- private static Locale[] createLocaleList() {
- String supportedLocaleString = LocaleDataMetaInfo.
- getSupportedLocaleString("sun.text.resources.FormatData");
-
- if (supportedLocaleString.length() == 0) {
- return null;
}
!
! /* Look for "|" and construct a new locale string list. */
! int barIndex = supportedLocaleString.indexOf("|");
! StringTokenizer localeStringTokenizer = null;
! if (isNonEuroLangSupported()) {
! localeStringTokenizer = new
! StringTokenizer(supportedLocaleString.substring(0, barIndex) +
! supportedLocaleString.substring(barIndex + 1));
! } else {
! localeStringTokenizer = new
! StringTokenizer(supportedLocaleString.substring(0, barIndex));
}
- Locale[] locales = new Locale[localeStringTokenizer.countTokens()];
- for (int i = 0; i < locales.length; i++) {
- String currentToken = localeStringTokenizer.nextToken().replace('_','-');
- if (currentToken.equals("ja-JP-JP")) {
- currentToken = "ja-JP-u-ca-japanese-x-lvariant-JP";
- } else if (currentToken.equals("th-TH-TH")) {
- currentToken = "th-TH-u-nu-thai-x-lvariant-TH";
- } else if (currentToken.equals("no-NO-NY")) {
- currentToken = "no-NO-x-lvariant-NY";
}
- locales[i] = Locale.forLanguageTag(currentToken);
- }
- return locales;
- }
-
}
--- 199,237 ----
if (baseName == null || locale == null) {
throw new NullPointerException();
}
return null;
}
! private static final String CLDR = ".cldr";
! /**
! * Changes baseName to its per-language package name and
! * calls the super class implementation. For example,
! * if the baseName is "sun.text.resources.FormatData" and locale is ja_JP,
! * the baseName is changed to "sun.text.resources.ja.FormatData". If
! * baseName contains "cldr", such as "sun.text.resources.cldr.FormatData",
! * the name is changed to "sun.text.resources.cldr.jp.FormatData".
*/
! @Override
! public String toBundleName(String baseName, Locale locale) {
! String newBaseName = baseName;
! String lang = locale.getLanguage();
! if (lang.length() > 0) {
! if (baseName.startsWith(JRE.getUtilResourcesPackage())
! || baseName.startsWith(JRE.getTextResourcesPackage())) {
! // Assume the lengths are the same.
! assert JRE.getUtilResourcesPackage().length()
! == JRE.getTextResourcesPackage().length();
! int index = JRE.getUtilResourcesPackage().length();
! if (baseName.indexOf(CLDR, index) > 0) {
! index += CLDR.length();
}
! newBaseName = baseName.substring(0, index + 1) + lang
! + baseName.substring(index);
}
}
! return super.toBundleName(newBaseName, locale);
}
}
}