17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert******************************************************************************* 3f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert* Copyright (C) 1996-2015, International Business Machines Corporation and 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* others. All Rights Reserved. 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text; 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Comparator; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Enumeration; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.LinkedList; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.MissingResourceException; 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUDebug; 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUResourceBundle; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.coll.CollationData; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.coll.CollationRoot; 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacter; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UProperty; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UScript; 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Freezable; 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ICUException; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale.Category; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.UResourceBundle; 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.VersionInfo; 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* {@icuenhanced java.text.Collator}.{@icu _usage_} 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Collator performs locale-sensitive string comparison. A concrete 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* subclass, RuleBasedCollator, allows customization of the collation 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* ordering by the use of rule sets.</p> 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>A Collator is thread-safe only when frozen. See {{@link #isFrozen()} and {@link Freezable}. 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Following the <a href=http://www.unicode.org>Unicode 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Consortium</a>'s specifications for the 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <a href="http://www.unicode.org/unicode/reports/tr10/">Unicode Collation 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Algorithm (UCA)</a>, there are 5 different levels of strength used 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* in comparisons: 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <ul> 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>PRIMARY strength: Typically, this is used to denote differences between 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* base characters (for example, "a" < "b"). 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* It is the strongest difference. For example, dictionaries are divided 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* into different sections by base character. 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>SECONDARY strength: Accents in the characters are considered secondary 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* differences (for example, "as" < "às" < "at"). Other 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* differences 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* between letters can also be considered secondary differences, depending 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* on the language. A secondary difference is ignored when there is a 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* primary difference anywhere in the strings. 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>TERTIARY strength: Upper and lower case differences in characters are 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* distinguished at tertiary strength (for example, "ao" < "Ao" < 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* "aò"). In addition, a variant of a letter differs from the base 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* form on the tertiary strength (such as "A" and "Ⓐ"). Another 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* example is the 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* difference between large and small Kana. A tertiary difference is ignored 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* when there is a primary or secondary difference anywhere in the strings. 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>QUATERNARY strength: When punctuation is ignored 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* (see <a href="http://userguide.icu-project.org/collation/concepts#TOC-Ignoring-Punctuation"> 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Ignoring Punctuations in the User Guide</a>) at PRIMARY to TERTIARY 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* strength, an additional strength level can 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* be used to distinguish words with and without punctuation (for example, 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* "ab" < "a-b" < "aB"). 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* This difference is ignored when there is a PRIMARY, SECONDARY or TERTIARY 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* difference. The QUATERNARY strength should only be used if ignoring 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* punctuation is required. 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>IDENTICAL strength: 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* When all other strengths are equal, the IDENTICAL strength is used as a 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* tiebreaker. The Unicode code point values of the NFD form of each string 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* are compared, just in case there is no difference. 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* For example, Hebrew cantellation marks are only distinguished at this 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* strength. This strength should be used sparingly, as only code point 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* value differences between two strings is an extremely rare occurrence. 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Using this strength substantially decreases the performance for both 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* comparison and collation key generation APIs. This strength also 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* increases the size of the collation key. 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* </ul> 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Unlike the JDK, ICU4J's Collator deals only with 2 decomposition modes, 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* the canonical decomposition mode and one that does not use any decomposition. 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* The compatibility decomposition mode, java.text.Collator.FULL_DECOMPOSITION 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* is not supported here. If the canonical 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* decomposition mode is set, the Collator handles un-normalized text properly, 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* producing the same results as if the text were normalized in NFD. If 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* canonical decomposition is turned off, it is the user's responsibility to 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* ensure that all text is already in the appropriate form before performing 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* a comparison or before getting a CollationKey.</p> 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>For more information about the collation service see the 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <a href="http://userguide.icu-project.org/collation">User Guide</a>.</p> 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Examples of use 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <pre> 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* // Get the Collator for US English and set its strength to PRIMARY 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Collator usCollator = Collator.getInstance(Locale.US); 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* usCollator.setStrength(Collator.PRIMARY); 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* if (usCollator.compare("abc", "ABC") == 0) { 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* System.out.println("Strings are equivalent"); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* } 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* The following example shows how to compare two strings using the 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Collator for the default locale. 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* // Compare two strings in the default locale 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Collator myCollator = Collator.getInstance(); 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* myCollator.setDecomposition(NO_DECOMPOSITION); 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* if (myCollator.compare("à\u0325", "a\u0325̀") != 0) { 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* System.out.println("à\u0325 is not equals to a\u0325̀ without decomposition"); 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* myCollator.setDecomposition(CANONICAL_DECOMPOSITION); 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* if (myCollator.compare("à\u0325", "a\u0325̀") != 0) { 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* System.out.println("Error: à\u0325 should be equals to a\u0325̀ with decomposition"); 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* } 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* else { 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* System.out.println("à\u0325 is equals to a\u0325̀ with decomposition"); 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* } 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* } 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* else { 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* System.out.println("Error: à\u0325 should be not equals to a\u0325̀ without decomposition"); 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* } 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* </pre> 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* </p> 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @see RuleBasedCollator 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @see CollationKey 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @author Syn Wee Quek 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @stable ICU 2.8 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/ 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic abstract class Collator implements Comparator<Object>, Freezable<Collator>, Cloneable 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{ 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // public data members --------------------------------------------------- 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Strongest collator strength value. Typically used to denote differences 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * between base characters. See class documentation for more explanation. 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setStrength 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getStrength 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int PRIMARY = 0; 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Second level collator strength value. 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Accents in the characters are considered secondary differences. 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Other differences between letters can also be considered secondary 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * differences, depending on the language. 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See class documentation for more explanation. 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setStrength 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getStrength 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int SECONDARY = 1; 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Third level collator strength value. 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upper and lower case differences in characters are distinguished at this 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * strength level. In addition, a variant of a letter differs from the base 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * form on the tertiary level. 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See class documentation for more explanation. 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setStrength 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getStrength 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int TERTIARY = 2; 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Fourth level collator strength value. 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * When punctuation is ignored 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * (see <a href="http://userguide.icu-project.org/collation/concepts#TOC-Ignoring-Punctuation"> 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Ignoring Punctuation in the User Guide</a>) at PRIMARY to TERTIARY 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * strength, an additional strength level can 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * be used to distinguish words with and without punctuation. 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See class documentation for more explanation. 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setStrength 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getStrength 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int QUATERNARY = 3; 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Smallest Collator strength value. When all other strengths are equal, 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the IDENTICAL strength is used as a tiebreaker. The Unicode code point 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * values of the NFD form of each string are compared, just in case there 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is no difference. 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See class documentation for more explanation. 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p> 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Note this value is different from JDK's 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int IDENTICAL = 15; 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icunote} This is for backwards compatibility with Java APIs only. It 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * should not be used, IDENTICAL should be used instead. ICU's 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collation does not support Java's FULL_DECOMPOSITION mode. 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.4 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int FULL_DECOMPOSITION = IDENTICAL; 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Decomposition mode value. With NO_DECOMPOSITION set, Strings 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * will not be decomposed for collation. This is the default 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * decomposition setting unless otherwise specified by the locale 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * used to create the Collator.</p> 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p><strong>Note</strong> this value is different from the JDK's.</p> 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #CANONICAL_DECOMPOSITION 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getDecomposition 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setDecomposition 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int NO_DECOMPOSITION = 16; 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Decomposition mode value. With CANONICAL_DECOMPOSITION set, 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * characters that are canonical variants according to the Unicode standard 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * will be decomposed for collation.</p> 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>CANONICAL_DECOMPOSITION corresponds to Normalization Form D as 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * described in <a href="http://www.unicode.org/unicode/reports/tr15/"> 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Unicode Technical Report #15</a>. 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #NO_DECOMPOSITION 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getDecomposition 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setDecomposition 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int CANONICAL_DECOMPOSITION = 17; 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Reordering codes for non-script groups that can be reordered under collation. 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getReorderCodes 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setReorderCodes 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getEquivalentReorderCodes 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static interface ReorderCodes { 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A special reordering code that is used to specify the default reordering codes for a locale. 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int DEFAULT = -1; // == UScript.INVALID_CODE 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A special reordering code that is used to specify no reordering codes. 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int NONE = UScript.UNKNOWN; 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A special reordering code that is used to specify all other codes used for reordering except 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for the codes listed as ReorderingCodes and those listed explicitly in a reordering. 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int OTHERS = UScript.UNKNOWN; 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Characters with the space property. 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is equivalent to the rule value "space". 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int SPACE = 0x1000; 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The first entry in the enumeration of reordering groups. This is intended for use in 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * range checking and enumeration of the reorder codes. 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int FIRST = SPACE; 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Characters with the punctuation property. 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is equivalent to the rule value "punct". 2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int PUNCTUATION = 0x1001; 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Characters with the symbol property. 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is equivalent to the rule value "symbol". 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int SYMBOL = 0x1002; 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Characters with the currency property. 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is equivalent to the rule value "currency". 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int CURRENCY = 0x1003; 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Characters with the digit property. 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is equivalent to the rule value "digit". 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int DIGIT = 0x1004; 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The limit of the reorder codes. This is intended for use in range checking 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and enumeration of the reorder codes. 3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final static int LIMIT = 0x1005; 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // public methods -------------------------------------------------------- 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Compares the equality of two Collator objects. Collator objects are equal if they have the same 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collation (sorting & searching) behavior. 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class checks for null and for equal types. 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Subclasses should override. 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param obj the Collator to compare to. 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return true if this Collator has exactly the same collation behavior as obj, false otherwise. 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean equals(Object obj) { 3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Subclasses: Call this method and then add more specific checks. 3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return this == obj || (obj != null && getClass() == obj.getClass()); 3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // public setters -------------------------------------------------------- 3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void checkNotFrozen() { 3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (isFrozen()) { 3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("Attempt to modify frozen Collator"); 3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Sets this Collator's strength attribute. The strength attribute 3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * determines the minimum level of difference considered significant 3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * during comparison.</p> 3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class method does nothing. Subclasses should override it if appropriate. 3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>See the Collator class description for an example of use.</p> 3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param newStrength the new strength value. 3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getStrength 3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #PRIMARY 3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #SECONDARY 3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #TERTIARY 3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #QUATERNARY 3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #IDENTICAL 3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @throws IllegalArgumentException if the new strength value is not valid. 3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void setStrength(int newStrength) 3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkNotFrozen(); 3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return this, for chaining 3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal Used in UnicodeTools 3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Collator setStrength2(int newStrength) 3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setStrength(newStrength); 3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return this; 3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Sets the decomposition mode of this Collator. Setting this 3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * decomposition attribute with CANONICAL_DECOMPOSITION allows the 3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Collator to handle un-normalized text properly, producing the 3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * same results as if the text were normalized. If 3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * NO_DECOMPOSITION is set, it is the user's responsibility to 3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * insure that all text is already in the appropriate form before 3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * a comparison or before getting a CollationKey. Adjusting 3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * decomposition mode allows the user to select between faster and 3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * more complete collation behavior.</p> 3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Since a great many of the world's languages do not require 3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * text normalization, most locales set NO_DECOMPOSITION as the 3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * default decomposition mode.</p> 3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class method does nothing. Subclasses should override it if appropriate. 3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>See getDecomposition for a description of decomposition 3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * mode.</p> 3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param decomposition the new decomposition mode 3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getDecomposition 3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #NO_DECOMPOSITION 3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #CANONICAL_DECOMPOSITION 3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @throws IllegalArgumentException If the given value is not a valid 3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * decomposition mode. 3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void setDecomposition(int decomposition) 3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkNotFrozen(); 3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Sets the reordering codes for this collator. 402f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Collation reordering allows scripts and some other groups of characters 403f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * to be moved relative to each other. This reordering is done on top of 4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the DUCET/CLDR standard collation order. Reordering can specify groups to be placed 4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * at the start and/or the end of the collation order. These groups are specified using 406f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * UScript codes and {@link Collator.ReorderCodes} entries. 407f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>By default, reordering codes specified for the start of the order are placed in the 409f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * order given after several special non-script blocks. These special groups of characters 4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * are space, punctuation, symbol, currency, and digit. These special groups are represented with 411f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * {@link Collator.ReorderCodes} entries. Script groups can be intermingled with 412f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * these special non-script groups if those special groups are explicitly specified in the reordering. 413f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 414f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * <p>The special code {@link Collator.ReorderCodes#OTHERS OTHERS} 415f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * stands for any script that is not explicitly 4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * mentioned in the list of reordering codes given. Anything that is after OTHERS 4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * will go at the very end of the reordering in the order given. 418f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 419f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * <p>The special reorder code {@link Collator.ReorderCodes#DEFAULT DEFAULT} 420f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * will reset the reordering for this collator 4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * to the default for this collator. The default reordering may be the DUCET/CLDR order or may be a reordering that 4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * was specified when this collator was created from resource data or from rules. The 423f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * DEFAULT code <b>must</b> be the sole code supplied when it is used. 424f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * If not, then an {@link IllegalArgumentException} will be thrown. 425f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 426f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * <p>The special reorder code {@link Collator.ReorderCodes#NONE NONE} 427f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * will remove any reordering for this collator. 4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The result of setting no reordering will be to have the DUCET/CLDR ordering used. The 429f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * NONE code <b>must</b> be the sole code supplied when it is used. 430f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param order the reordering codes to apply to this collator; if this is null or an empty array 4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * then this clears any existing reordering 4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getReorderCodes 4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getEquivalentReorderCodes 4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see Collator.ReorderCodes 4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see UScript 4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void setReorderCodes(int... order) 4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("Needs to be implemented by the subclass."); 4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // public getters -------------------------------------------------------- 4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the Collator for the current default locale. 4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The default locale is determined by java.util.Locale.getDefault(). 4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the Collator for the default locale (for example, en_US) if it 4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is created successfully. Otherwise if there is no Collator 4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * associated with the current locale, the root collator 4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * will be returned. 4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see java.util.Locale#getDefault() 4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getInstance(Locale) 4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Collator getInstance() 4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getInstance(ULocale.getDefault()); 4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Clones the collator. 4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a clone of this collator. 4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Object clone() throws CloneNotSupportedException { 4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return super.clone(); 4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // begin registry stuff 4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A factory used with registerFactory to register multiple collators and provide 4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * display names for them. If standard locale display names are sufficient, 4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Collator instances may be registered instead. 4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p><b>Note:</b> as of ICU4J 3.2, the default API for CollatorFactory uses 4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ULocale instead of Locale. Instead of overriding createCollator(Locale), 4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * new implementations should override createCollator(ULocale). Note that 4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * one of these two methods <b>MUST</b> be overridden or else an infinite 4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * loop will occur. 4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static abstract class CollatorFactory { 4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return true if this factory will be visible. Default is true. 4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If not visible, the locales supported by this factory will not 4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * be listed by getAvailableLocales. 4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return true if this factory is visible 4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean visible() { 4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return true; 4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return an instance of the appropriate collator. If the locale 4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is not supported, return null. 5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <b>Note:</b> as of ICU4J 3.2, implementations should override 5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this method instead of createCollator(Locale). 5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param loc the locale for which this collator is to be created. 5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the newly created collator. 5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.2 5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Collator createCollator(ULocale loc) { 5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return createCollator(loc.toLocale()); 5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return an instance of the appropriate collator. If the locale 5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is not supported, return null. 5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p><b>Note:</b> as of ICU4J 3.2, implementations should override 5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * createCollator(ULocale) instead of this method, and inherit this 5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * method's implementation. This method is no longer abstract 5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and instead delegates to createCollator(ULocale). 5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param loc the locale for which this collator is to be created. 5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the newly created collator. 5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Collator createCollator(Locale loc) { 5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return createCollator(ULocale.forLocale(loc)); 5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return the name of the collator for the objectLocale, localized for the displayLocale. 5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If objectLocale is not visible or not defined by the factory, return null. 5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param objectLocale the locale identifying the collator 5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param displayLocale the locale for which the display name of the collator should be localized 5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the display name 5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getDisplayName(Locale objectLocale, Locale displayLocale) { 5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getDisplayName(ULocale.forLocale(objectLocale), ULocale.forLocale(displayLocale)); 5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return the name of the collator for the objectLocale, localized for the displayLocale. 5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If objectLocale is not visible or not defined by the factory, return null. 5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param objectLocale the locale identifying the collator 5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param displayLocale the locale for which the display name of the collator should be localized 5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the display name 5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.2 5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getDisplayName(ULocale objectLocale, ULocale displayLocale) { 5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (visible()) { 5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Set<String> supported = getSupportedLocaleIDs(); 5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String name = objectLocale.getBaseName(); 5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (supported.contains(name)) { 5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return objectLocale.getDisplayName(displayLocale); 5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return an unmodifiable collection of the locale names directly 5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * supported by this factory. 5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the set of supported locale IDs. 5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract Set<String> getSupportedLocaleIDs(); 5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Empty default constructor. 5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected CollatorFactory() { 5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static abstract class ServiceShim { 5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract Collator getInstance(ULocale l); 5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract Object registerInstance(Collator c, ULocale l); 5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract Object registerFactory(CollatorFactory f); 5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract boolean unregister(Object k); 5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract Locale[] getAvailableLocales(); // TODO remove 5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract ULocale[] getAvailableULocales(); 5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert abstract String getDisplayName(ULocale ol, ULocale dl); 5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static ServiceShim shim; 5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static ServiceShim getShim() { 5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Note: this instantiation is safe on loose-memory-model configurations 5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // despite lack of synchronization, since the shim instance has no state-- 5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // it's all in the class init. The worst problem is we might instantiate 5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // two shim instances, but they'll share the same state so that's ok. 5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (shim == null) { 5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Class<?> cls = Class.forName("com.ibm.icu.text.CollatorServiceShim"); 5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert shim = (ServiceShim)cls.newInstance(); 5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (MissingResourceException e) 5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ///CLOVER:OFF 5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw e; 5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ///CLOVER:ON 5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (Exception e) { 6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ///CLOVER:OFF 6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(DEBUG){ 6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new ICUException(e); 6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ///CLOVER:ON 6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return shim; 6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Simpler/faster methods for ASCII than ones based on Unicode data. 6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * TODO: There should be code like this somewhere already?? 6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final class ASCII { 6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static boolean equalIgnoreCase(CharSequence left, CharSequence right) { 6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int length = left.length(); 6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (length != right.length()) { return false; } 6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < length; ++i) { 6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char lc = left.charAt(i); 6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char rc = right.charAt(i); 6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (lc == rc) { continue; } 6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ('A' <= lc && lc <= 'Z') { 6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((lc + 0x20) == rc) { continue; } 6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if ('A' <= rc && rc <= 'Z') { 6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((rc + 0x20) == lc) { continue; } 6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return false; 6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return true; 6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final boolean getYesOrNo(String keyword, String s) { 6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ASCII.equalIgnoreCase(s, "yes")) { 6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return true; 6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ASCII.equalIgnoreCase(s, "no")) { 6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return false; 6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new IllegalArgumentException("illegal locale keyword=value: " + keyword + "=" + s); 6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int getIntValue(String keyword, String s, String... values) { 6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < values.length; ++i) { 6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ASCII.equalIgnoreCase(s, values[i])) { 6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return i; 6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new IllegalArgumentException("illegal locale keyword=value: " + keyword + "=" + s); 6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int getReorderCode(String keyword, String s) { 6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collator.ReorderCodes.FIRST + 6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert getIntValue(keyword, s, "space", "punct", "symbol", "currency", "digit"); 6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Not supporting "others" = UCOL_REORDER_CODE_OTHERS 6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // as a synonym for Zzzz = USCRIPT_UNKNOWN for now: 6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Avoid introducing synonyms/aliases. 6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Sets collation attributes according to locale keywords. See 6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * http://www.unicode.org/reports/tr35/tr35-collation.html#Collation_Settings 6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Using "alias" keywords and values where defined: 6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * http://www.unicode.org/reports/tr35/tr35.html#Old_Locale_Extension_Syntax 6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * http://unicode.org/repos/cldr/trunk/common/bcp47/collation.xml 6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static void setAttributesFromKeywords(ULocale loc, Collator coll, RuleBasedCollator rbc) { 6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Check for collation keywords that were already deprecated 6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // before any were supported in createInstance() (except for "collation"). 6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String value = loc.getKeywordValue("colHiraganaQuaternary"); 6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("locale keyword kh/colHiraganaQuaternary"); 6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("variableTop"); 6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("locale keyword vt/variableTop"); 6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse known collation keywords, ignore others. 6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colStrength"); 6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Note: Not supporting typo "quarternary" because it was never supported in locale IDs. 6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int strength = getIntValue("colStrength", value, 6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "primary", "secondary", "tertiary", "quaternary", "identical"); 6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert coll.setStrength(strength <= Collator.QUATERNARY ? strength : Collator.IDENTICAL); 6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colBackwards"); 6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rbc != null) { 6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setFrenchCollation(getYesOrNo("colBackwards", value)); 6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException( 6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "locale keyword kb/colBackwards only settable for RuleBasedCollator"); 6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colCaseLevel"); 6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rbc != null) { 7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setCaseLevel(getYesOrNo("colCaseLevel", value)); 7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException( 7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "locale keyword kb/colBackwards only settable for RuleBasedCollator"); 7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colCaseFirst"); 7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rbc != null) { 7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int cf = getIntValue("colCaseFirst", value, "no", "lower", "upper"); 7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cf == 0) { 7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setLowerCaseFirst(false); 7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setUpperCaseFirst(false); 7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (cf == 1) { 7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setLowerCaseFirst(true); 7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else /* cf == 2 */ { 7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setUpperCaseFirst(true); 7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException( 7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "locale keyword kf/colCaseFirst only settable for RuleBasedCollator"); 7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colAlternate"); 7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rbc != null) { 7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setAlternateHandlingShifted( 7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert getIntValue("colAlternate", value, "non-ignorable", "shifted") != 0); 7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException( 7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "locale keyword ka/colAlternate only settable for RuleBasedCollator"); 7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colNormalization"); 7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert coll.setDecomposition(getYesOrNo("colNormalization", value) ? 7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Collator.CANONICAL_DECOMPOSITION : Collator.NO_DECOMPOSITION); 7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colNumeric"); 7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rbc != null) { 7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rbc.setNumericCollation(getYesOrNo("colNumeric", value)); 7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException( 7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "locale keyword kn/colNumeric only settable for RuleBasedCollator"); 7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("colReorder"); 7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] codes = new int[UScript.CODE_LIMIT + Collator.ReorderCodes.LIMIT - Collator.ReorderCodes.FIRST]; 7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int codesLength = 0; 7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int scriptNameStart = 0; 7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (;;) { 7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (codesLength == codes.length) { 7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new IllegalArgumentException( 7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "too many script codes for colReorder locale keyword: " + value); 7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int limit = scriptNameStart; 7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (limit < value.length() && value.charAt(limit) != '-') { ++limit; } 7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String scriptName = value.substring(scriptNameStart, limit); 7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int code; 7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (scriptName.length() == 4) { 7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Strict parsing, accept only 4-letter script codes, not long names. 7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert code = UCharacter.getPropertyValueEnum(UProperty.SCRIPT, scriptName); 7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert code = getReorderCode("colReorder", scriptName); 7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert codes[codesLength++] = code; 7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (limit == value.length()) { break; } 7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert scriptNameStart = limit + 1; 7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (codesLength == 0) { 7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new IllegalArgumentException("no script codes for colReorder locale keyword"); 7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] args = new int[codesLength]; 7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.arraycopy(codes, 0, args, 0, codesLength); 7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert coll.setReorderCodes(args); 7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = loc.getKeywordValue("kv"); 7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (value != null) { 7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert coll.setMaxVariable(getReorderCode("kv", value)); 7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the Collator for the desired locale. 7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>For some languages, multiple collation types are available; 7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for example, "de@collation=phonebook". 7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Starting with ICU 54, collation attributes can be specified via locale keywords as well, 7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in the old locale extension syntax ("el@colCaseFirst=upper") 7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or in language tag syntax ("el-u-kf-upper"). 7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See <a href="http://userguide.icu-project.org/collation/api">User Guide: Collation API</a>. 7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locale the desired locale. 7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return Collator for the desired locale if it is created successfully. 7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Otherwise if there is no Collator 7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * associated with the current locale, the root collator will 7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * be returned. 8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see java.util.Locale 8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see java.util.ResourceBundle 8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getInstance(Locale) 8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getInstance() 8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.0 8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Collator getInstance(ULocale locale) { 8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // fetching from service cache is faster than instantiation 8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (locale == null) { 8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert locale = ULocale.getDefault(); 8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Collator coll = getShim().getInstance(locale); 8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!locale.getName().equals(locale.getBaseName())) { // any keywords? 8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setAttributesFromKeywords(locale, coll, 8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (coll instanceof RuleBasedCollator) ? (RuleBasedCollator)coll : null); 8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return coll; 8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the Collator for the desired locale. 8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>For some languages, multiple collation types are available; 8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for example, "de-u-co-phonebk". 8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Starting with ICU 54, collation attributes can be specified via locale keywords as well, 8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in the old locale extension syntax ("el@colCaseFirst=upper", only with {@link ULocale}) 8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or in language tag syntax ("el-u-kf-upper"). 8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See <a href="http://userguide.icu-project.org/collation/api">User Guide: Collation API</a>. 8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locale the desired locale. 8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return Collator for the desired locale if it is created successfully. 8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Otherwise if there is no Collator 8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * associated with the current locale, the root collator will 8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * be returned. 8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see java.util.Locale 8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see java.util.ResourceBundle 8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getInstance(ULocale) 8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getInstance() 8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Collator getInstance(Locale locale) { 8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getInstance(ULocale.forLocale(locale)); 8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Registers a collator as the default collator for the provided locale. The 8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collator should not be modified after it is registered. 8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Because ICU may choose to cache Collator objects internally, this must 8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * be called at application startup, prior to any calls to 8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Collator.getInstance to avoid undefined behavior. 8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param collator the collator to register 8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locale the locale for which this is the default collator 8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return an object that can be used to unregister the registered collator. 8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.2 8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Object registerInstance(Collator collator, ULocale locale) { 8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getShim().registerInstance(collator, locale); 8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Registers a collator factory. 8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Because ICU may choose to cache Collator objects internally, this must 8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * be called at application startup, prior to any calls to 8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Collator.getInstance to avoid undefined behavior. 8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param factory the factory to register 8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return an object that can be used to unregister the registered factory. 8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Object registerFactory(CollatorFactory factory) { 8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getShim().registerFactory(factory); 8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Unregisters a collator previously registered using registerInstance. 8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param registryKey the object previously returned by registerInstance. 8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return true if the collator was successfully unregistered. 8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final boolean unregister(Object registryKey) { 8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (shim == null) { 8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return false; 8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return shim.unregister(registryKey); 8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the set of locales, as Locale objects, for which collators 8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * are installed. Note that Locale objects do not support RFC 3066. 8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the list of locales in which collators are installed. 8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This list includes any that have been registered, in addition to 8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * those that are installed with ICU4J. 8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.4 8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static Locale[] getAvailableLocales() { 9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // TODO make this wrap getAvailableULocales later 9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (shim == null) { 9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ICUResourceBundle.getAvailableLocales( 9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ICUResourceBundle.ICU_COLLATION_BASE_NAME, ICUResourceBundle.ICU_DATA_CLASS_LOADER); 9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return shim.getAvailableLocales(); 9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the set of locales, as ULocale objects, for which collators 9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * are installed. ULocale objects support RFC 3066. 9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the list of locales in which collators are installed. 9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This list includes any that have been registered, in addition to 9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * those that are installed with ICU4J. 9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.0 9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ULocale[] getAvailableULocales() { 9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (shim == null) { 9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ICUResourceBundle.getAvailableULocales( 9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ICUResourceBundle.ICU_COLLATION_BASE_NAME, ICUResourceBundle.ICU_DATA_CLASS_LOADER); 9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return shim.getAvailableULocales(); 9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The list of keywords for this service. This must be kept in sync with 9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the resource data. 9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @since ICU 3.0 9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String[] KEYWORDS = { "collation" }; 9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The resource name for this service. Note that this is not the same as 9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the keyword for this service. 9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @since ICU 3.0 9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String RESOURCE = "collations"; 9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The resource bundle base name for this service. 9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * *since ICU 3.0 9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String BASE = ICUResourceBundle.ICU_COLLATION_BASE_NAME; 9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns an array of all possible keywords that are relevant to 9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collation. At this point, the only recognized keyword for this 9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * service is "collation". 9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return an array of valid collation keywords. 9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getKeywordValues 9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.0 9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final String[] getKeywords() { 9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return KEYWORDS; 9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Given a keyword, returns an array of all values for 9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * that keyword that are currently in use. 9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param keyword one of the keywords returned by getKeywords. 9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getKeywords 9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.0 9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final String[] getKeywordValues(String keyword) { 9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!keyword.equals(KEYWORDS[0])) { 9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new IllegalArgumentException("Invalid keyword: " + keyword); 9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ICUResourceBundle.getKeywordValues(BASE, RESOURCE); 9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Given a key and a locale, returns an array of string values in a preferred 9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * order that would make a difference. These are all and only those values where 9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the open (creation) of the service with the locale formed from the input locale 9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * plus input keyword and that value has different behavior than creation with the 9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * input locale alone. 9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param key one of the keys supported by this service. For now, only 9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * "collation" is supported. 9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locale the locale 9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param commonlyUsed if set to true it will return only commonly used values 9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * with the given locale in preferred order. Otherwise, 9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * it will return all the available values for the locale. 9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return an array of string values for the given key and the locale. 9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.2 9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final String[] getKeywordValuesForLocale(String key, ULocale locale, 9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean commonlyUsed) { 9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Note: The parameter commonlyUsed is actually not used. 9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The switch is in the method signature for consistency 9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // with other locale services. 9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Read available collation values from collation bundles 9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String baseLoc = locale.getBaseName(); 9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert LinkedList<String> values = new LinkedList<String>(); 9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UResourceBundle bundle = UResourceBundle.getBundleInstance( 9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ICUResourceBundle.ICU_COLLATION_BASE_NAME, baseLoc); 9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String defcoll = null; 10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (bundle != null) { 10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UResourceBundle collations = bundle.get("collations"); 10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Enumeration<String> collEnum = collations.getKeys(); 10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (collEnum.hasMoreElements()) { 10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String collkey = collEnum.nextElement(); 10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (collkey.equals("default")) { 10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (defcoll == null) { 10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Keep the default 10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert defcoll = collations.getString("default"); 10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (!collkey.startsWith("private-") && !values.contains(collkey)) { 10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values.add(collkey); 10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bundle = ((ICUResourceBundle)bundle).getParent(); 10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Reordering 10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Iterator<String> itr = values.iterator(); 10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] result = new String[values.size()]; 10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result[0] = defcoll; 10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int idx = 1; 10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (itr.hasNext()) { 10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String collKey = itr.next(); 10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!collKey.equals(defcoll)) { 10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result[idx++] = collKey; 10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return result; 10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the functionally equivalent locale for the given 10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * requested locale, with respect to given keyword, for the 10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collation service. If two locales return the same result, then 10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collators instantiated for these locales will behave 10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * equivalently. The converse is not always true; two collators 10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * may in fact be equivalent, but return different results, due to 10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * internal details. The return result has no other meaning than 10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * that stated above, and implies nothing as to the relationship 10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * between the two locales. This is intended for use by 10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * applications who wish to cache collators, or otherwise reuse 10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collators when possible. The functional equivalent may change 10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * over time. For more information, please see the <a 10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * href="http://userguide.icu-project.org/locale#TOC-Locales-and-Services"> 10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Locales and Services</a> section of the ICU User Guide. 10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param keyword a particular keyword as enumerated by 10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * getKeywords. 10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locID The requested locale 10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param isAvailable If non-null, isAvailable[0] will receive and 10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * output boolean that indicates whether the requested locale was 10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 'available' to the collation service. If non-null, isAvailable 10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * must have length >= 1. 10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the locale 10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.0 10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ULocale getFunctionalEquivalent(String keyword, 10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locID, 10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean isAvailable[]) { 10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ICUResourceBundle.getFunctionalEquivalent(BASE, ICUResourceBundle.ICU_DATA_CLASS_LOADER, RESOURCE, 10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert keyword, locID, isAvailable, true); 10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the functionally equivalent locale for the given 10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * requested locale, with respect to given keyword, for the 10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collation service. 10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param keyword a particular keyword as enumerated by 10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * getKeywords. 10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locID The requested locale 10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the locale 10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getFunctionalEquivalent(String,ULocale,boolean[]) 10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.0 10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final ULocale getFunctionalEquivalent(String keyword, 10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locID) { 10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getFunctionalEquivalent(keyword, locID, null); 10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the name of the collator for the objectLocale, localized for the 10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * displayLocale. 10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param objectLocale the locale of the collator 10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param displayLocale the locale for the collator's display name 10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the display name 10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static public String getDisplayName(Locale objectLocale, Locale displayLocale) { 10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getShim().getDisplayName(ULocale.forLocale(objectLocale), 10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.forLocale(displayLocale)); 10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the name of the collator for the objectLocale, localized for the 10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * displayLocale. 10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param objectLocale the locale of the collator 10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param displayLocale the locale for the collator's display name 10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the display name 10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.2 10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static public String getDisplayName(ULocale objectLocale, ULocale displayLocale) { 11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getShim().getDisplayName(objectLocale, displayLocale); 11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the name of the collator for the objectLocale, localized for the 11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * default <code>DISPLAY</code> locale. 11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param objectLocale the locale of the collator 11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the display name 11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale.Category#DISPLAY 11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static public String getDisplayName(Locale objectLocale) { 11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getShim().getDisplayName(ULocale.forLocale(objectLocale), ULocale.getDefault(Category.DISPLAY)); 11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the name of the collator for the objectLocale, localized for the 11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * default <code>DISPLAY</code> locale. 11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param objectLocale the locale of the collator 11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the display name 11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale.Category#DISPLAY 11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 3.2 11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static public String getDisplayName(ULocale objectLocale) { 11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return getShim().getDisplayName(objectLocale, ULocale.getDefault(Category.DISPLAY)); 11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns this Collator's strength attribute. The strength attribute 11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * determines the minimum level of difference considered significant. 11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icunote} This can return QUATERNARY strength, which is not supported by the 11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * JDK version. 11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p> 11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See the Collator class description for more details. 11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class method always returns {@link #TERTIARY}. 11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Subclasses should override it if appropriate. 11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return this Collator's current strength attribute. 11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setStrength 11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #PRIMARY 11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #SECONDARY 11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #TERTIARY 11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #QUATERNARY 11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #IDENTICAL 11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getStrength() 11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return TERTIARY; 11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the decomposition mode of this Collator. The decomposition mode 11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * determines how Unicode composed characters are handled. 11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p> 11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See the Collator class description for more details. 11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class method always returns {@link #NO_DECOMPOSITION}. 11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Subclasses should override it if appropriate. 11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the decomposition mode 11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setDecomposition 11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #NO_DECOMPOSITION 11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #CANONICAL_DECOMPOSITION 11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getDecomposition() 11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return NO_DECOMPOSITION; 11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // public other methods ------------------------------------------------- 11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Compares the equality of two text Strings using 11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this Collator's rules, strength and decomposition mode. Convenience method. 11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param source the source string to be compared. 11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param target the target string to be compared. 11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return true if the strings are equal according to the collation 11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * rules, otherwise false. 11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #compare 11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @throws NullPointerException thrown if either arguments is null. 11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean equals(String source, String target) 11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return (compare(source, target) == 0); 11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns a UnicodeSet that contains all the characters and sequences tailored 11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in this collator. 11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a pointer to a UnicodeSet object containing all the 11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * code points and sequences that may sort differently than 11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in the root collator. 11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.4 11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public UnicodeSet getTailoredSet() 12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new UnicodeSet(0, 0x10FFFF); 12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Compares the source text String to the target text String according to 12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this Collator's rules, strength and decomposition mode. 12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns an integer less than, 12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * equal to or greater than zero depending on whether the source String is 12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * less than, equal to or greater than the target String. See the Collator 12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * class description for an example of use. 12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param source the source String. 12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param target the target String. 12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return Returns an integer value. Value is less than zero if source is 12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * less than target, value is zero if source and target are equal, 12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * value is greater than zero if source is greater than target. 12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see CollationKey 12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getCollationKey 12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @throws NullPointerException thrown if either argument is null. 12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract int compare(String source, String target); 12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Compares the source Object to the target Object. 12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </p> 12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param source the source Object. 12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param target the target Object. 12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return Returns an integer value. Value is less than zero if source is 12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * less than target, value is zero if source and target are equal, 12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * value is greater than zero if source is greater than target. 12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @throws ClassCastException thrown if either arguments cannot be cast to CharSequence. 12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.2 12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int compare(Object source, Object target) { 12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return doCompare((CharSequence)source, (CharSequence)target); 12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Compares two CharSequences. 12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The base class just calls compare(left.toString(), right.toString()). 12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Subclasses should instead implement this method and have the String API call this method. 12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal 12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected int doCompare(CharSequence left, CharSequence right) { 12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return compare(left.toString(), right.toString()); 12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p> 12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Transforms the String into a CollationKey suitable for efficient 12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * repeated comparison. The resulting key depends on the collator's 12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * rules, strength and decomposition mode. 12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Note that collation keys are often less efficient than simply doing comparison. 12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * For more details, see the ICU User Guide. 12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>See the CollationKey class documentation for more information.</p> 12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param source the string to be transformed into a CollationKey. 12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the CollationKey for the given String based on this Collator's 12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * collation rules. If the source String is null, a null 12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * CollationKey is returned. 12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see CollationKey 12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #compare(String, String) 12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getRawCollationKey 12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract CollationKey getCollationKey(String source); 12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the simpler form of a CollationKey for the String source following 12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the rules of this Collator and stores the result into the user provided argument 12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * key. If key has a internal byte array of length that's too small for the result, 12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the internal byte array will be grown to the exact required size. 12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Note that collation keys are often less efficient than simply doing comparison. 12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * For more details, see the ICU User Guide. 12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param source the text String to be transformed into a RawCollationKey 12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return If key is null, a new instance of RawCollationKey will be 12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * created and returned, otherwise the user provided key will be 12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * returned. 12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #compare(String, String) 12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getCollationKey 12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see RawCollationKey 12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract RawCollationKey getRawCollationKey(String source, 12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert RawCollationKey key); 12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Sets the variable top to the top of the specified reordering group. 12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The variable top determines the highest-sorting character 12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * which is affected by the alternate handling behavior. 12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If that attribute is set to UCOL_NON_IGNORABLE, then the variable top has no effect. 12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class implementation throws an UnsupportedOperationException. 13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param group one of Collator.ReorderCodes.SPACE, Collator.ReorderCodes.PUNCTUATION, 13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Collator.ReorderCodes.SYMBOL, Collator.ReorderCodes.CURRENCY; 13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or Collator.ReorderCodes.DEFAULT to restore the default max variable group 13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return this 13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getMaxVariable 1306f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @stable ICU 53 13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Collator setMaxVariable(int group) { 13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("Needs to be implemented by the subclass."); 13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the maximum reordering group whose characters are affected by 13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the alternate handling behavior. 13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class implementation returns Collator.ReorderCodes.PUNCTUATION. 13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the maximum variable reordering group. 13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setMaxVariable 1319f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @stable ICU 53 13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getMaxVariable() { 13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collator.ReorderCodes.PUNCTUATION; 13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Sets the variable top to the primary weight of the specified string. 13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Beginning with ICU 53, the variable top is pinned to 13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the top of one of the supported reordering groups, 13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and it must not be beyond the last of those groups. 13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See {@link #setMaxVariable(int)}. 13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param varTop one or more (if contraction) characters to which the 13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * variable top should be set 13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return variable top primary weight 13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @exception IllegalArgumentException 13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is thrown if varTop argument is not a valid variable top element. A variable top element is 13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * invalid when 13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <ul> 13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <li>it is a contraction that does not exist in the Collation order 13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <li>the variable top is beyond 13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the last reordering group supported by setMaxVariable() 13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <li>when the varTop argument is null or zero in length. 13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * </ul> 13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getVariableTop 13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see RuleBasedCollator#setAlternateHandlingShifted 13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated ICU 53 Call {@link #setMaxVariable(int)} instead. 13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract int setVariableTop(String varTop); 13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Gets the variable top value of a Collator. 13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the variable top primary weight 13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getMaxVariable 13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.6 13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract int getVariableTop(); 13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Sets the variable top to the specified primary weight. 13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Beginning with ICU 53, the variable top is pinned to 13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the top of one of the supported reordering groups, 13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and it must not be beyond the last of those groups. 13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See {@link #setMaxVariable(int)}. 13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param varTop primary weight, as returned by setVariableTop or getVariableTop 13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getVariableTop 13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setVariableTop(String) 13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated ICU 53 Call setMaxVariable() instead. 13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract void setVariableTop(int varTop); 13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the version of this collator object. 13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the version object associated with this collator 13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract VersionInfo getVersion(); 13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the UCA version of this collator object. 13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the version object associated with this collator 13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8 13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract VersionInfo getUCAVersion(); 13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Retrieves the reordering codes for this collator. 13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * These reordering codes are a combination of UScript codes and ReorderCodes. 13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a copy of the reordering codes for this collator; 13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * if none are set then returns an empty array 13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setReorderCodes 13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getEquivalentReorderCodes 13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see Collator.ReorderCodes 13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see UScript 14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int[] getReorderCodes() 14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("Needs to be implemented by the subclass."); 14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Retrieves all the reorder codes that are grouped with the given reorder code. Some reorder 14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * codes are grouped and must reorder together. 1410f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Beginning with ICU 55, scripts only reorder together if they are primary-equal, 1411f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * for example Hiragana and Katakana. 1412f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param reorderCode The reorder code to determine equivalence for. 14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the set of all reorder codes in the same group as the given reorder code. 14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #setReorderCodes 14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #getReorderCodes 14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see Collator.ReorderCodes 14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see UScript 14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static int[] getEquivalentReorderCodes(int reorderCode) { 14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CollationData baseData = CollationRoot.getData(); 14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return baseData.getEquivalentScripts(reorderCode); 14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Freezable interface implementation ------------------------------------------------- 14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Determines whether the object has been frozen or not. 14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>An unfrozen Collator is mutable and not thread-safe. 14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A frozen Collator is immutable and thread-safe. 14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean isFrozen() { 14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return false; 14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Freezes the collator. 14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the collator itself. 14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Collator freeze() { 14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("Needs to be implemented by the subclass."); 14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Provides for the clone operation. Any clone is initially unfrozen. 14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.8 14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Collator cloneAsThawed() { 14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new UnsupportedOperationException("Needs to be implemented by the subclass."); 14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Empty default constructor to make javadocs happy 14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.4 14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected Collator() 14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final boolean DEBUG = ICUDebug.enabled("collator"); 14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // -------- BEGIN ULocale boilerplate -------- 14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@icu} Returns the locale that was used to create this object, or null. 14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This may may differ from the locale requested at the time of 14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this object's creation. For example, if an object is created 14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for locale <tt>en_US_CALIFORNIA</tt>, the actual data may be 14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * drawn from <tt>en</tt> (the <i>actual</i> locale), and 14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <tt>en_US</tt> may be the most specific locale that exists (the 14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <i>valid</i> locale). 14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>Note: This method will be implemented in ICU 3.0; ICU 2.8 14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * contains a partial preview implementation. The * <i>actual</i> 14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * locale is returned correctly, but the <i>valid</i> locale is 14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * not, in most cases. 14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class method always returns {@link ULocale#ROOT}. 14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Subclasses should override it if appropriate. 14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param type type of information requested, either {@link 14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * com.ibm.icu.util.ULocale#VALID_LOCALE} or {@link 14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * com.ibm.icu.util.ULocale#ACTUAL_LOCALE}. 14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the information specified by <i>type</i>, or null if 14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this object was not constructed from locale data. 14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale 14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale#VALID_LOCALE 14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE 14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @draft ICU 2.8 (retain) 14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @provisional This API might change or be removed in a future release. 14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public ULocale getLocale(ULocale.Type type) { 14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ULocale.ROOT; 15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Set information about the locales that were used to create this 15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * object. If the object was not constructed from locale data, 15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * both arguments should be set to null. Otherwise, neither 15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * should be null. The actual locale must be at the same level or 15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * less specific than the valid locale. This method is intended 15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for use by factories or other entities that create objects of 15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this class. 15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>The base class method does nothing. Subclasses should override it if appropriate. 15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param valid the most specific locale containing any resource 15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * data, or null 15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param actual the locale containing data used to construct this 15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * object, or null 15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale 15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale#VALID_LOCALE 15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE 15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void setLocale(ULocale valid, ULocale actual) {} 15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // -------- END ULocale boilerplate -------- 15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 1525