/* GENERATED SOURCE. DO NOT MODIFY. */ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************************** * Copyright (C) 2009-2016, International Business Machines Corporation, * Google, Inc. and others. All Rights Reserved. ************************************************************************************** */ package android.icu.util; import java.util.MissingResourceException; import android.icu.impl.ICUData; import android.icu.impl.ICUResourceBundle; import android.icu.text.UnicodeSet; import android.icu.util.ULocale.Category; /** * A class for accessing miscellaneous data in the locale bundles * @author ram */ public final class LocaleData { // private static final String EXEMPLAR_CHARS = "ExemplarCharacters"; private static final String MEASUREMENT_SYSTEM = "MeasurementSystem"; private static final String PAPER_SIZE = "PaperSize"; private static final String LOCALE_DISPLAY_PATTERN = "localeDisplayPattern"; private static final String PATTERN = "pattern"; private static final String SEPARATOR = "separator"; private boolean noSubstitute; private ICUResourceBundle bundle; private ICUResourceBundle langBundle; private MissingResourceException langBundleException; /** * EXType for {@link #getExemplarSet(int, int)}. * Corresponds to the 'main' (aka 'standard') CLDR exemplars in * * http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements. * @hide unsupported on Android */ public static final int ES_STANDARD = 0; /** * EXType for {@link #getExemplarSet(int, int)}. * Corresponds to the 'auxiliary' CLDR exemplars in * * http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements. * @hide unsupported on Android */ public static final int ES_AUXILIARY = 1; /** * EXType for {@link #getExemplarSet(int, int)}. * Corresponds to the 'index' CLDR exemplars in * * http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements. * @hide unsupported on Android */ public static final int ES_INDEX = 2; /** * EXType for {@link #getExemplarSet(int, int)}. * Corresponds to the 'currencySymbol' CLDR exemplars in * * http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements. * Note: This type is no longer supported. * @deprecated ICU 51 * @hide original deprecated declaration */ @Deprecated public static final int ES_CURRENCY = 3; /** * Corresponds to the 'punctuation' CLDR exemplars in * * http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements. * EXType for {@link #getExemplarSet(int, int)}. * @hide unsupported on Android */ public static final int ES_PUNCTUATION = 4; /** * Count of EXTypes for {@link #getExemplarSet(int, int)}. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. * @hide original deprecated declaration */ @Deprecated public static final int ES_COUNT = 5; /** * Delimiter type for {@link #getDelimiter(int)}. */ public static final int QUOTATION_START = 0; /** * Delimiter type for {@link #getDelimiter(int)}. */ public static final int QUOTATION_END = 1; /** * Delimiter type for {@link #getDelimiter(int)}. */ public static final int ALT_QUOTATION_START = 2; /** * Delimiter type for {@link #getDelimiter(int)}. */ public static final int ALT_QUOTATION_END = 3; /** * Count of delimiter types for {@link #getDelimiter(int)}. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. * @hide original deprecated declaration */ @Deprecated public static final int DELIMITER_COUNT = 4; // private constructor to prevent default construction ///CLOVER:OFF private LocaleData(){} ///CLOVER:ON /** * Returns the set of exemplar characters for a locale. Equivalent to calling {@link #getExemplarSet(ULocale, int, int)} with * the extype == {@link #ES_STANDARD}. * * @param locale Locale for which the exemplar character set * is to be retrieved. * @param options Bitmask for options to apply to the exemplar pattern. * Specify zero to retrieve the exemplar set as it is * defined in the locale data. Specify * UnicodeSet.CASE to retrieve a case-folded exemplar * set. See {@link UnicodeSet#applyPattern(String, * int)} for a complete list of valid options. The * IGNORE_SPACE bit is always set, regardless of the * value of 'options'. * @return The set of exemplar characters for the given locale. * @hide unsupported on Android */ public static UnicodeSet getExemplarSet(ULocale locale, int options) { return LocaleData.getInstance(locale).getExemplarSet(options, ES_STANDARD); } /** * Returns the set of exemplar characters for a locale. * Equivalent to calling new LocaleData(locale).{@link #getExemplarSet(int, int)}. * * @param locale Locale for which the exemplar character set * is to be retrieved. * @param options Bitmask for options to apply to the exemplar pattern. * Specify zero to retrieve the exemplar set as it is * defined in the locale data. Specify * UnicodeSet.CASE to retrieve a case-folded exemplar * set. See {@link UnicodeSet#applyPattern(String, * int)} for a complete list of valid options. The * IGNORE_SPACE bit is always set, regardless of the * value of 'options'. * @param extype The type of exemplar character set to retrieve. * @return The set of exemplar characters for the given locale. * @hide unsupported on Android */ public static UnicodeSet getExemplarSet(ULocale locale, int options, int extype) { return LocaleData.getInstance(locale).getExemplarSet(options, extype); } /** * Returns the set of exemplar characters for a locale. * * @param options Bitmask for options to apply to the exemplar pattern. * Specify zero to retrieve the exemplar set as it is * defined in the locale data. Specify * UnicodeSet.CASE to retrieve a case-folded exemplar * set. See {@link UnicodeSet#applyPattern(String, * int)} for a complete list of valid options. The * IGNORE_SPACE bit is always set, regardless of the * value of 'options'. * @param extype The type of exemplar set to be retrieved, * ES_STANDARD, ES_INDEX, ES_AUXILIARY, or ES_PUNCTUATION * @return The set of exemplar characters for the given locale. * If there is nothing available for the locale, * then null is returned if {@link #getNoSubstitute()} is true, otherwise the * root value is returned (which may be UnicodeSet.EMPTY). * @exception RuntimeException if the extype is invalid. * @hide unsupported on Android */ public UnicodeSet getExemplarSet(int options, int extype) { String [] exemplarSetTypes = { "ExemplarCharacters", "AuxExemplarCharacters", "ExemplarCharactersIndex", "ExemplarCharactersCurrency", "ExemplarCharactersPunctuation" }; if (extype == ES_CURRENCY) { // currency symbol exemplar is no longer available return noSubstitute ? null : UnicodeSet.EMPTY; } try{ final String aKey = exemplarSetTypes[extype]; // will throw an out-of-bounds exception ICUResourceBundle stringBundle = (ICUResourceBundle) bundle.get(aKey); if (noSubstitute && !bundle.isRoot() && stringBundle.isRoot()) { return null; } String unicodeSetPattern = stringBundle.getString(); return new UnicodeSet(unicodeSetPattern, UnicodeSet.IGNORE_SPACE | options); } catch (ArrayIndexOutOfBoundsException aiooe) { throw new IllegalArgumentException(aiooe); } catch (Exception ex){ return noSubstitute ? null : UnicodeSet.EMPTY; } } /** * Gets the LocaleData object associated with the ULocale specified in locale * * @param locale Locale with thich the locale data object is associated. * @return A locale data object. */ public static final LocaleData getInstance(ULocale locale) { LocaleData ld = new LocaleData(); ld.bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, locale); try { ld.langBundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_LANG_BASE_NAME, locale); } catch (MissingResourceException mre) { // Expected error case: ICU-22149 ld.langBundleException = mre; } ld.noSubstitute = false; return ld; } /** * Gets the LocaleData object associated with the default FORMAT locale * * @return A locale data object. * @see Category#FORMAT */ public static final LocaleData getInstance() { return LocaleData.getInstance(ULocale.getDefault(Category.FORMAT)); } /** * Sets the "no substitute" behavior of this locale data object. * * @param setting Value for the no substitute behavior. If true, * methods of this locale data object will return * an error when no data is available for that method, * given the locale ID supplied to the constructor. */ public void setNoSubstitute(boolean setting) { noSubstitute = setting; } /** * Gets the "no substitute" behavior of this locale data object. * * @return Value for the no substitute behavior. If true, * methods of this locale data object will return * an error when no data is available for that method, * given the locale ID supplied to the constructor. */ public boolean getNoSubstitute() { return noSubstitute; } private static final String [] DELIMITER_TYPES = { "quotationStart", "quotationEnd", "alternateQuotationStart", "alternateQuotationEnd" }; /** * Retrieves a delimiter string from the locale data. * * @param type The type of delimiter string desired. Currently, * the valid choices are QUOTATION_START, QUOTATION_END, * ALT_QUOTATION_START, or ALT_QUOTATION_END. * @return The desired delimiter string. */ public String getDelimiter(int type) { ICUResourceBundle delimitersBundle = (ICUResourceBundle) bundle.get("delimiters"); // Only some of the quotation marks may be here. So we make sure that we do a multilevel fallback. ICUResourceBundle stringBundle = delimitersBundle.getWithFallback(DELIMITER_TYPES[type]); if (noSubstitute && !bundle.isRoot() && stringBundle.isRoot()) { return null; } return stringBundle.getString(); } /** * Utility for getMeasurementSystem and getPaperSize */ private static UResourceBundle measurementTypeBundleForLocale(ULocale locale, String measurementType){ // Much of this is taken from getCalendarType in impl/CalendarUtil.java UResourceBundle measTypeBundle = null; String region = ULocale.getRegionForSupplementalData(locale, true); try { UResourceBundle rb = UResourceBundle.getBundleInstance( ICUData.ICU_BASE_NAME, "supplementalData", ICUResourceBundle.ICU_DATA_CLASS_LOADER); UResourceBundle measurementData = rb.get("measurementData"); UResourceBundle measDataBundle = null; try { measDataBundle = measurementData.get(region); measTypeBundle = measDataBundle.get(measurementType); } catch (MissingResourceException mre) { // use "001" as fallback measDataBundle = measurementData.get("001"); measTypeBundle = measDataBundle.get(measurementType); } } catch (MissingResourceException mre) { // fall through } return measTypeBundle; } /** * Enumeration for representing the measurement systems. */ public static final class MeasurementSystem{ /** * Measurement system specified by Le Système International d'Unités (SI) * otherwise known as Metric system. */ public static final MeasurementSystem SI = new MeasurementSystem(); /** * Measurement system followed in the United States of America. */ public static final MeasurementSystem US = new MeasurementSystem(); /** * Mix of metric and imperial units used in Great Britain. */ public static final MeasurementSystem UK = new MeasurementSystem(); private MeasurementSystem() {} } /** * Returns the measurement system used in the locale specified by the locale. * * @param locale The locale for which the measurement system to be retrieved. * @return MeasurementSystem the measurement system used in the locale. */ public static final MeasurementSystem getMeasurementSystem(ULocale locale){ UResourceBundle sysBundle = measurementTypeBundleForLocale(locale, MEASUREMENT_SYSTEM); switch (sysBundle.getInt()) { case 0: return MeasurementSystem.SI; case 1: return MeasurementSystem.US; case 2: return MeasurementSystem.UK; default: // return null if the object is null or is not an instance // of integer indicating an error return null; } } /** * A class that represents the size of letter head * used in the country */ public static final class PaperSize{ private int height; private int width; private PaperSize(int h, int w){ height = h; width = w; } /** * Returns the height of the paper * @return the height */ public int getHeight(){ return height; } /** * Returns the width of the paper * @return the width */ public int getWidth(){ return width; } } /** * Returns the size of paper used in the locale. The paper sizes returned are always in * milli-meters. * @param locale The locale for which the measurement system to be retrieved. * @return The paper size used in the locale */ public static final PaperSize getPaperSize(ULocale locale){ UResourceBundle obj = measurementTypeBundleForLocale(locale, PAPER_SIZE); int[] size = obj.getIntVector(); return new PaperSize(size[0], size[1]); } /** * Returns LocaleDisplayPattern for this locale, e.g., {0}({1}) * @return locale display pattern as a String. * @hide unsupported on Android */ public String getLocaleDisplayPattern() { if (langBundle == null) { throw langBundleException; } ICUResourceBundle locDispBundle = (ICUResourceBundle) langBundle.get(LOCALE_DISPLAY_PATTERN); String localeDisplayPattern = locDispBundle.getStringWithFallback(PATTERN); return localeDisplayPattern; } /** * Returns LocaleDisplaySeparator for this locale. * @return locale display separator as a char. * @hide unsupported on Android */ public String getLocaleSeparator() { if (langBundle == null) { throw langBundleException; } String sub0 = "{0}"; String sub1 = "{1}"; ICUResourceBundle locDispBundle = (ICUResourceBundle) langBundle.get(LOCALE_DISPLAY_PATTERN); String localeSeparator = locDispBundle.getStringWithFallback(SEPARATOR); int index0 = localeSeparator.indexOf(sub0); int index1 = localeSeparator.indexOf(sub1); if (index0 >= 0 && index1 >= 0 && index0 <= index1) { return localeSeparator.substring(index0 + sub0.length(), index1); } return localeSeparator; } private static VersionInfo gCLDRVersion = null; /** * Returns the current CLDR version */ public static VersionInfo getCLDRVersion() { // fetching this data should be idempotent. if(gCLDRVersion == null) { // from ZoneMeta.java UResourceBundle supplementalDataBundle = UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, "supplementalData", ICUResourceBundle.ICU_DATA_CLASS_LOADER); UResourceBundle cldrVersionBundle = supplementalDataBundle.get("cldrVersion"); gCLDRVersion = VersionInfo.getInstance(cldrVersionBundle.getString()); } return gCLDRVersion; } }