12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **************************************************************************************
52d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Copyright (C) 2009-2016, International Business Machines Corporation,
62d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Google, Inc. and others. All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **************************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.util;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.MissingResourceException;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.impl.ICUData;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUResourceBundle;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UnicodeSet;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale.Category;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A class for accessing miscellaneous data in the locale bundles
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author ram
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class LocaleData {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    private static final String EXEMPLAR_CHARS      = "ExemplarCharacters";
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String MEASUREMENT_SYSTEM  = "MeasurementSystem";
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String PAPER_SIZE          = "PaperSize";
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String LOCALE_DISPLAY_PATTERN  = "localeDisplayPattern";
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String PATTERN             = "pattern";
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SEPARATOR           = "separator";
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private boolean noSubstitute;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private ICUResourceBundle bundle;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private ICUResourceBundle langBundle;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * EXType for {@link #getExemplarSet(int, int)}.
372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Corresponds to the 'main' (aka 'standard') CLDR exemplars in
389e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     * <a href="http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements">
399e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     *   http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements</a>.
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ES_STANDARD = 0;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * EXType for {@link #getExemplarSet(int, int)}.
462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Corresponds to the 'auxiliary' CLDR exemplars in
479e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     * <a href="http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements">
489e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     *   http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements</a>.
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ES_AUXILIARY = 1;
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * EXType for {@link #getExemplarSet(int, int)}.
552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Corresponds to the 'index' CLDR exemplars in
569e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     * <a href="http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements">
579e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     *   http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements</a>.
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.4
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ES_INDEX = 2;
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * EXType for {@link #getExemplarSet(int, int)}.
642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Corresponds to the 'currencySymbol' CLDR exemplars in
659e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     * <a href="http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements">
669e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     *   http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements</a>.
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Note: This type is no longer supported.
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated ICU 51
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ES_CURRENCY = 3;
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Corresponds to the 'punctuation' CLDR exemplars in
759e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     * <a href="http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements">
769e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     *   http://www.unicode.org/reports/tr35/tr35-general.html#Character_Elements</a>.
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * EXType for {@link #getExemplarSet(int, int)}.
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 49
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ES_PUNCTUATION = 4;
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Count of EXTypes for {@link #getExemplarSet(int, int)}.
842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Deprecated
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ES_COUNT = 5;
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Delimiter type for {@link #getDelimiter(int)}.
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int QUOTATION_START = 0;
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Delimiter type for {@link #getDelimiter(int)}.
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int QUOTATION_END = 1;
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Delimiter type for {@link #getDelimiter(int)}.
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ALT_QUOTATION_START = 2;
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Delimiter type for {@link #getDelimiter(int)}.
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ALT_QUOTATION_END = 3;
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Count of delimiter types for {@link #getDelimiter(int)}.
1152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Deprecated
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DELIMITER_COUNT = 4;
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // private constructor to prevent default construction
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    ///CLOVER:OFF
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private LocaleData(){}
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    ///CLOVER:ON
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the set of exemplar characters for a locale. Equivalent to calling {@link #getExemplarSet(ULocale, int, int)} with
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the extype == {@link #ES_STANDARD}.
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale    Locale for which the exemplar character set
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  is to be retrieved.
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param options   Bitmask for options to apply to the exemplar pattern.
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  Specify zero to retrieve the exemplar set as it is
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  defined in the locale data.  Specify
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  UnicodeSet.CASE to retrieve a case-folded exemplar
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  set.  See {@link UnicodeSet#applyPattern(String,
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  int)} for a complete list of valid options.  The
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  IGNORE_SPACE bit is always set, regardless of the
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  value of 'options'.
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          The set of exemplar characters for the given locale.
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static UnicodeSet getExemplarSet(ULocale locale, int options) {
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return LocaleData.getInstance(locale).getExemplarSet(options, ES_STANDARD);
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Returns the set of exemplar characters for a locale.
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Equivalent to calling new LocaleData(locale).{@link #getExemplarSet(int, int)}.
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale    Locale for which the exemplar character set
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  is to be retrieved.
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param options   Bitmask for options to apply to the exemplar pattern.
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  Specify zero to retrieve the exemplar set as it is
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  defined in the locale data.  Specify
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  UnicodeSet.CASE to retrieve a case-folded exemplar
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  set.  See {@link UnicodeSet#applyPattern(String,
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  int)} for a complete list of valid options.  The
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  IGNORE_SPACE bit is always set, regardless of the
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  value of 'options'.
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param extype    The type of exemplar character set to retrieve.
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          The set of exemplar characters for the given locale.
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static UnicodeSet getExemplarSet(ULocale locale, int options, int extype) {
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return LocaleData.getInstance(locale).getExemplarSet(options, extype);
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the set of exemplar characters for a locale.
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param options   Bitmask for options to apply to the exemplar pattern.
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  Specify zero to retrieve the exemplar set as it is
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  defined in the locale data.  Specify
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  UnicodeSet.CASE to retrieve a case-folded exemplar
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  set.  See {@link UnicodeSet#applyPattern(String,
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  int)} for a complete list of valid options.  The
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  IGNORE_SPACE bit is always set, regardless of the
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  value of 'options'.
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param extype    The type of exemplar set to be retrieved,
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  ES_STANDARD, ES_INDEX, ES_AUXILIARY, or ES_PUNCTUATION
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          The set of exemplar characters for the given locale.
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  If there is nothing available for the locale,
1832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *                  then null is returned if {@link #getNoSubstitute()} is true, otherwise the
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  root value is returned (which may be UnicodeSet.EMPTY).
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @exception       RuntimeException if the extype is invalid.
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UnicodeSet getExemplarSet(int options, int extype) {
1892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String [] exemplarSetTypes = {
1902d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "ExemplarCharacters",
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "AuxExemplarCharacters",
1922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "ExemplarCharactersIndex",
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "ExemplarCharactersCurrency",
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "ExemplarCharactersPunctuation"
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (extype == ES_CURRENCY) {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // currency symbol exemplar is no longer available
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return noSubstitute ? null : UnicodeSet.EMPTY;
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            final String aKey = exemplarSetTypes[extype]; // will throw an out-of-bounds exception
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ICUResourceBundle stringBundle = (ICUResourceBundle) bundle.get(aKey);
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            if (noSubstitute && !bundle.isRoot() && stringBundle.isRoot()) {
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String unicodeSetPattern = stringBundle.getString();
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return new UnicodeSet(unicodeSetPattern, UnicodeSet.IGNORE_SPACE | options);
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ArrayIndexOutOfBoundsException aiooe) {
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new IllegalArgumentException(aiooe);
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception ex){
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return noSubstitute ? null : UnicodeSet.EMPTY;
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Gets the LocaleData object associated with the ULocale specified in locale
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale    Locale with thich the locale data object is associated.
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          A locale data object.
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final LocaleData getInstance(ULocale locale) {
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        LocaleData ld = new LocaleData();
2272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        ld.bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, locale);
2282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        ld.langBundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_LANG_BASE_NAME, locale);
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ld.noSubstitute = false;
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return ld;
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Gets the LocaleData object associated with the default <code>FORMAT</code> locale
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          A locale data object.
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Category#FORMAT
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final LocaleData getInstance() {
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return LocaleData.getInstance(ULocale.getDefault(Category.FORMAT));
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Sets the "no substitute" behavior of this locale data object.
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param setting   Value for the no substitute behavior.  If TRUE,
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  methods of this locale data object will return
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  an error when no data is available for that method,
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  given the locale ID supplied to the constructor.
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void setNoSubstitute(boolean setting) {
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        noSubstitute = setting;
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Gets the "no substitute" behavior of this locale data object.
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          Value for the no substitute behavior.  If TRUE,
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  methods of this locale data object will return
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  an error when no data is available for that method,
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  given the locale ID supplied to the constructor.
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public boolean getNoSubstitute() {
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return noSubstitute;
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String [] DELIMITER_TYPES = {
2712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        "quotationStart",
2722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        "quotationEnd",
2732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        "alternateQuotationStart",
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "alternateQuotationEnd"
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Retrieves a delimiter string from the locale data.
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param type      The type of delimiter string desired.  Currently,
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  the valid choices are QUOTATION_START, QUOTATION_END,
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                  ALT_QUOTATION_START, or ALT_QUOTATION_END.
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return          The desired delimiter string.
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String getDelimiter(int type) {
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ICUResourceBundle delimitersBundle = (ICUResourceBundle) bundle.get("delimiters");
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Only some of the quotation marks may be here. So we make sure that we do a multilevel fallback.
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ICUResourceBundle stringBundle = delimitersBundle.getWithFallback(DELIMITER_TYPES[type]);
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        if (noSubstitute && !bundle.isRoot() && stringBundle.isRoot()) {
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
2932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return stringBundle.getString();
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Utility for getMeasurementSystem and getPaperSize
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static UResourceBundle measurementTypeBundleForLocale(ULocale locale, String measurementType){
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Much of this is taken from getCalendarType in impl/CalendarUtil.java
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UResourceBundle measTypeBundle = null;
30387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String region = ULocale.getRegionForSupplementalData(locale, true);
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UResourceBundle rb = UResourceBundle.getBundleInstance(
3062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    ICUData.ICU_BASE_NAME,
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "supplementalData",
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ICUResourceBundle.ICU_DATA_CLASS_LOADER);
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UResourceBundle measurementData = rb.get("measurementData");
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UResourceBundle measDataBundle = null;
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                measDataBundle = measurementData.get(region);
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                measTypeBundle = measDataBundle.get(measurementType);
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (MissingResourceException mre) {
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // use "001" as fallback
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                measDataBundle = measurementData.get("001");
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                measTypeBundle = measDataBundle.get(measurementType);
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (MissingResourceException mre) {
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // fall through
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return measTypeBundle;
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Enumeration for representing the measurement systems.
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final class MeasurementSystem{
331f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        /**
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Measurement system specified by Le Syst&#x00E8;me International d'Unit&#x00E9;s (SI)
3332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert         * otherwise known as Metric system.
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.8
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public static final MeasurementSystem SI = new MeasurementSystem();
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
338f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        /**
3392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert         * Measurement system followed in the United States of America.
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.8
341f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert         */
3422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public static final MeasurementSystem US = new MeasurementSystem();
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
344f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        /**
345f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert         * Mix of metric and imperial units used in Great Britain.
346f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert         * @stable ICU 55
347f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert         */
3482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public static final MeasurementSystem UK = new MeasurementSystem();
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        private MeasurementSystem() {}
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the measurement system used in the locale specified by the locale.
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale      The locale for which the measurement system to be retrieved.
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return MeasurementSystem the measurement system used in the locale.
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final MeasurementSystem getMeasurementSystem(ULocale locale){
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UResourceBundle sysBundle = measurementTypeBundleForLocale(locale, MEASUREMENT_SYSTEM);
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        switch (sysBundle.getInt()) {
3642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        case 0: return MeasurementSystem.SI;
3652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        case 1: return MeasurementSystem.US;
3662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        case 2: return MeasurementSystem.UK;
3672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        default:
3682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            // return null if the object is null or is not an instance
3692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            // of integer indicating an error
3702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            return null;
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * A class that represents the size of letter head
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * used in the country
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final class PaperSize{
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private int height;
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private int width;
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private PaperSize(int h, int w){
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            height = h;
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            width = w;
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        /**
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Retruns the height of the paper
3892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert         * @return the height
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.8
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int getHeight(){
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return height;
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Returns the width of the paper
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return the width
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.8
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int getWidth(){
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return width;
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Returns the size of paper used in the locale. The paper sizes returned are always in
4079e281ba4837cba4a1cf9523d6f8b0621b150063dScott Russell     * <em>milli-meters</em>.
4082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * @param locale The locale for which the measurement system to be retrieved.
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return The paper size used in the locale
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final PaperSize getPaperSize(ULocale locale){
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UResourceBundle obj = measurementTypeBundleForLocale(locale, PAPER_SIZE);
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] size = obj.getIntVector();
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return new PaperSize(size[0], size[1]);
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns LocaleDisplayPattern for this locale, e.g., {0}({1})
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return locale display pattern as a String.
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.2
4222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String getLocaleDisplayPattern() {
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ICUResourceBundle locDispBundle = (ICUResourceBundle) langBundle.get(LOCALE_DISPLAY_PATTERN);
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String localeDisplayPattern = locDispBundle.getStringWithFallback(PATTERN);
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return localeDisplayPattern;
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns LocaleDisplaySeparator for this locale.
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return locale display separator as a char.
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.2
4332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String getLocaleSeparator() {
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String sub0 = "{0}";
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String sub1 = "{1}";
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ICUResourceBundle locDispBundle = (ICUResourceBundle) langBundle.get(LOCALE_DISPLAY_PATTERN);
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  localeSeparator = locDispBundle.getStringWithFallback(SEPARATOR);
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int index0 = localeSeparator.indexOf(sub0);
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int index1 = localeSeparator.indexOf(sub1);
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (index0 >= 0 && index1 >= 0 && index0 <= index1) {
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return localeSeparator.substring(index0 + sub0.length(), index1);
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return localeSeparator;
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static VersionInfo gCLDRVersion = null;
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the current CLDR version
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.2
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static VersionInfo getCLDRVersion() {
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // fetching this data should be idempotent.
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(gCLDRVersion == null) {
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // from ZoneMeta.java
4572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            UResourceBundle supplementalDataBundle = UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, "supplementalData", ICUResourceBundle.ICU_DATA_CLASS_LOADER);
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UResourceBundle cldrVersionBundle = supplementalDataBundle.get("cldrVersion");
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            gCLDRVersion = VersionInfo.getInstance(cldrVersionBundle.getString());
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return gCLDRVersion;
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
464