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ème International d'Unité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