• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html
4 /*
5  *******************************************************************************
6  * Copyright (C) 2009-2016, International Business Machines Corporation and    *
7  * others. All Rights Reserved.                                                *
8  *******************************************************************************
9  */
10 package android.icu.text;
11 
12 import java.lang.reflect.InvocationTargetException;
13 import java.lang.reflect.Method;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.List;
17 import java.util.Locale;
18 import java.util.Set;
19 
20 import android.icu.impl.ICUConfig;
21 import android.icu.lang.UScript;
22 import android.icu.text.DisplayContext.Type;
23 import android.icu.util.IllformedLocaleException;
24 import android.icu.util.ULocale;
25 
26 /**
27  * Returns display names of ULocales and components of ULocales. For
28  * more information on language, script, region, variant, key, and
29  * values, see {@link android.icu.util.ULocale}.
30  */
31 public abstract class LocaleDisplayNames {
32     /**
33      * Enum used in {@link #getInstance(ULocale, DialectHandling)}.
34      */
35     public enum DialectHandling {
36         /**
37          * Use standard names when generating a locale name,
38          * e.g. en_GB displays as 'English (United Kingdom)'.
39          */
40         STANDARD_NAMES,
41         /**
42          * Use dialect names when generating a locale name,
43          * e.g. en_GB displays as 'British English'.
44          */
45         DIALECT_NAMES
46     }
47 
48     // factory methods
49     /**
50      * Convenience overload of {@link #getInstance(ULocale, DialectHandling)} that specifies
51      * STANDARD dialect handling.
52      * @param locale the display locale
53      * @return a LocaleDisplayNames instance
54      */
getInstance(ULocale locale)55     public static LocaleDisplayNames getInstance(ULocale locale) {
56         return getInstance(locale, DialectHandling.STANDARD_NAMES);
57     };
58 
59     /**
60      * Convenience overload of {@link #getInstance(Locale, DisplayContext...)} that specifies
61      * {@link DisplayContext#STANDARD_NAMES}.
62      * @param locale the display {@link java.util.Locale}
63      * @return a LocaleDisplayNames instance
64      */
getInstance(Locale locale)65     public static LocaleDisplayNames getInstance(Locale locale) {
66         return getInstance(ULocale.forLocale(locale));
67     };
68 
69     /**
70      * Returns an instance of LocaleDisplayNames that returns names formatted for the provided locale,
71      * using the provided dialectHandling.
72      * @param locale the display locale
73      * @param dialectHandling how to select names for locales
74      * @return a LocaleDisplayNames instance
75      */
getInstance(ULocale locale, DialectHandling dialectHandling)76     public static LocaleDisplayNames getInstance(ULocale locale, DialectHandling dialectHandling) {
77         LocaleDisplayNames result = null;
78         if (FACTORY_DIALECTHANDLING != null) {
79             try {
80                 result = (LocaleDisplayNames) FACTORY_DIALECTHANDLING.invoke(null,
81                         locale, dialectHandling);
82             } catch (InvocationTargetException e) {
83                 // fall through
84             } catch (IllegalAccessException e) {
85                 // fall through
86             }
87         }
88         if (result == null) {
89             result = new LastResortLocaleDisplayNames(locale, dialectHandling);
90         }
91         return result;
92     }
93 
94     /**
95      * Returns an instance of LocaleDisplayNames that returns names formatted for the provided locale,
96      * using the provided DisplayContext settings
97      * @param locale the display locale
98      * @param contexts one or more context settings (e.g. for dialect
99      *              handling, capitalization, etc.
100      * @return a LocaleDisplayNames instance
101      */
getInstance(ULocale locale, DisplayContext... contexts)102     public static LocaleDisplayNames getInstance(ULocale locale, DisplayContext... contexts) {
103         LocaleDisplayNames result = null;
104         if (FACTORY_DISPLAYCONTEXT != null) {
105             try {
106                 result = (LocaleDisplayNames) FACTORY_DISPLAYCONTEXT.invoke(null,
107                         locale, contexts);
108             } catch (InvocationTargetException e) {
109                 // fall through
110             } catch (IllegalAccessException e) {
111                 // fall through
112             }
113         }
114         if (result == null) {
115             result = new LastResortLocaleDisplayNames(locale, contexts);
116         }
117         return result;
118     }
119 
120     /**
121      * Returns an instance of LocaleDisplayNames that returns names formatted for the provided
122      * {@link java.util.Locale}, using the provided DisplayContext settings
123      * @param locale the display {@link java.util.Locale}
124      * @param contexts one or more context settings (e.g. for dialect
125      *              handling, capitalization, etc.
126      * @return a LocaleDisplayNames instance
127      */
getInstance(Locale locale, DisplayContext... contexts)128     public static LocaleDisplayNames getInstance(Locale locale, DisplayContext... contexts) {
129         return getInstance(ULocale.forLocale(locale), contexts);
130     }
131 
132     // getters for state
133     /**
134      * Returns the locale used to determine the display names. This is not necessarily the same
135      * locale passed to {@link #getInstance}.
136      * @return the display locale
137      */
getLocale()138     public abstract ULocale getLocale();
139 
140     /**
141      * Returns the dialect handling used in the display names.
142      * @return the dialect handling enum
143      */
getDialectHandling()144     public abstract DialectHandling getDialectHandling();
145 
146     /**
147      * Returns the current value for a specified DisplayContext.Type.
148      * @param type the DisplayContext.Type whose value to return
149      * @return the current DisplayContext setting for the specified type
150      */
getContext(DisplayContext.Type type)151     public abstract DisplayContext getContext(DisplayContext.Type type);
152 
153     // names for entire locales
154     /**
155      * Returns the display name of the provided ulocale.
156      * When no display names are available for all or portions
157      * of the original locale ID, those portions may be
158      * used directly (possibly in a more canonical form) as
159      * part of the  returned display name.
160      * @param locale the locale whose display name to return
161      * @return the display name of the provided locale
162      */
localeDisplayName(ULocale locale)163     public abstract String localeDisplayName(ULocale locale);
164 
165     /**
166      * Returns the display name of the provided locale.
167      * When no display names are available for all or portions
168      * of the original locale ID, those portions may be
169      * used directly (possibly in a more canonical form) as
170      * part of the  returned display name.
171      * @param locale the locale whose display name to return
172      * @return the display name of the provided locale
173      */
localeDisplayName(Locale locale)174     public abstract String localeDisplayName(Locale locale);
175 
176     /**
177      * Returns the display name of the provided locale id.
178      * When no display names are available for all or portions
179      * of the original locale ID, those portions may be
180      * used directly (possibly in a more canonical form) as
181      * part of the  returned display name.
182      * @param localeId the id of the locale whose display name to return
183      * @return the display name of the provided locale
184      */
localeDisplayName(String localeId)185     public abstract String localeDisplayName(String localeId);
186 
187     // names for components of a locale id
188     /**
189      * Returns the display name of the provided language code.
190      * @param lang the language code
191      * @return the display name of the provided language code
192      */
languageDisplayName(String lang)193     public abstract String languageDisplayName(String lang);
194 
195     /**
196      * Returns the display name of the provided script code.
197      * @param script the script code
198      * @return the display name of the provided script code
199      */
scriptDisplayName(String script)200     public abstract String scriptDisplayName(String script);
201 
202     /**
203      * Returns the display name of the provided script code
204      * when used in the context of a full locale name.
205      * @param script the script code
206      * @return the display name of the provided script code
207      * @deprecated This API is ICU internal only.
208      * @hide original deprecated declaration
209      * @hide draft / provisional / internal are hidden on Android
210      */
211     @Deprecated
scriptDisplayNameInContext(String script)212     public String scriptDisplayNameInContext(String script) {
213         return scriptDisplayName(script);
214     }
215 
216     /**
217      * Returns the display name of the provided script code.  See
218      * {@link android.icu.lang.UScript} for recognized script codes.
219      * @param scriptCode the script code number
220      * @return the display name of the provided script code
221      */
scriptDisplayName(int scriptCode)222     public abstract String scriptDisplayName(int scriptCode);
223 
224     /**
225      * Returns the display name of the provided region code.
226      * @param region the region code
227      * @return the display name of the provided region code
228      */
regionDisplayName(String region)229     public abstract String regionDisplayName(String region);
230 
231     /**
232      * Returns the display name of the provided variant.
233      * @param variant the variant string
234      * @return the display name of the provided variant
235      */
variantDisplayName(String variant)236     public abstract String variantDisplayName(String variant);
237 
238     /**
239      * Returns the display name of the provided locale key.
240      * @param key the locale key name
241      * @return the display name of the provided locale key
242      */
keyDisplayName(String key)243     public abstract String keyDisplayName(String key);
244 
245     /**
246      * Returns the display name of the provided value (used with the provided key).
247      * @param key the locale key name
248      * @param value the locale key's value
249      * @return the display name of the provided value
250      */
keyValueDisplayName(String key, String value)251     public abstract String keyValueDisplayName(String key, String value);
252 
253 
254     /**
255      * Return a list of information used to construct a UI list of locale names.
256      * @param collator how to collate—should normally be Collator.getInstance(getDisplayLocale())
257      * @param inSelf if true, compares the nameInSelf, otherwise the nameInDisplayLocale.
258      * Set depending on which field (displayLocale vs self) is to show up in the UI.
259      * If both are to show up in the UI, then it should be the one used for the primary sort order.
260      * @param localeSet a list of locales to present in a UI list. The casing uses the settings in the LocaleDisplayNames instance.
261      * @return an ordered list of UiListItems.
262      * @throws IllformedLocaleException if any of the locales in localeSet are malformed.
263      */
getUiList(Set<ULocale> localeSet, boolean inSelf, Comparator<Object> collator)264     public List<UiListItem> getUiList(Set<ULocale> localeSet, boolean inSelf, Comparator<Object> collator) {
265         return getUiListCompareWholeItems(localeSet, UiListItem.getComparator(collator, inSelf));
266     }
267 
268     /**
269      * Return a list of information used to construct a UI list of locale names, providing more access to control the sorting.
270      * Normally use getUiList instead.
271      * @param comparator how to sort the UiListItems in the result.
272      * @param localeSet a list of locales to present in a UI list. The casing uses the settings in the LocaleDisplayNames instance.
273      * @return an ordered list of UiListItems.
274      * @throws IllformedLocaleException if any of the locales in localeSet are malformed.
275      */
getUiListCompareWholeItems(Set<ULocale> localeSet, Comparator<UiListItem> comparator)276     public abstract List<UiListItem> getUiListCompareWholeItems(Set<ULocale> localeSet, Comparator<UiListItem> comparator);
277 
278     /**
279      * Struct-like class used to return information for constructing a UI list, each corresponding to a locale.
280      */
281     public static class UiListItem {
282         /**
283          * Returns the minimized locale for an input locale, such as sr-Cyrl → sr
284          */
285         public final ULocale minimized;
286         /**
287          * Returns the modified locale for an input locale, such as sr → sr-Cyrl, where there is also an sr-Latn in the list
288          */
289         public final ULocale modified;
290         /**
291          * Returns the name of the modified locale in the display locale, such as "Englisch (VS)" (for 'en-US', where the display locale is 'de').
292          */
293         public final String nameInDisplayLocale;
294         /**
295          * Returns the name of the modified locale in itself, such as "English (US)" (for 'en-US').
296          */
297         public final String nameInSelf;
298 
299         /**
300          * Constructor, normally only called internally.
301          * @param minimized locale for an input locale
302          * @param modified modified for an input locale
303          * @param nameInDisplayLocale name of the modified locale in the display locale
304          * @param nameInSelf name of the modified locale in itself
305          */
UiListItem(ULocale minimized, ULocale modified, String nameInDisplayLocale, String nameInSelf)306         public UiListItem(ULocale minimized, ULocale modified, String nameInDisplayLocale, String nameInSelf) {
307             this.minimized = minimized;
308             this.modified = modified;
309             this.nameInDisplayLocale = nameInDisplayLocale;
310             this.nameInSelf = nameInSelf;
311         }
312 
313         /**
314          * {@inheritDoc}
315          */
316         @Override
equals(Object obj)317         public boolean equals(Object obj) {
318             if (this == obj) {
319                 return true;
320             }
321             if (obj == null || !(obj instanceof UiListItem)) {
322                 return false;
323             }
324             UiListItem other = (UiListItem)obj;
325             return nameInDisplayLocale.equals(other.nameInDisplayLocale)
326                     && nameInSelf.equals(other.nameInSelf)
327                     && minimized.equals(other.minimized)
328                     && modified.equals(other.modified);
329         }
330 
331         /**
332          * {@inheritDoc}
333          */
334         @Override
hashCode()335         public int hashCode() {
336             return modified.hashCode() ^ nameInDisplayLocale.hashCode();
337         }
338 
339         /**
340          * {@inheritDoc}
341          */
342         @Override
toString()343         public String toString() {
344             return "{" + minimized + ", " + modified + ", " + nameInDisplayLocale + ", " + nameInSelf  + "}";
345         }
346 
347         /**
348          * Return a comparator that compares the locale names for the display locale or the in-self names,
349          * depending on an input parameter.
350          * @param inSelf if true, compares the nameInSelf, otherwise the nameInDisplayLocale
351          * @param comparator (meant for strings, but because Java Collator doesn't have &lt;String&gt;...)
352          * @return UiListItem comparator
353          */
getComparator(Comparator<Object> comparator, boolean inSelf)354         public static Comparator<UiListItem> getComparator(Comparator<Object> comparator, boolean inSelf) {
355             return new UiListItemComparator(comparator, inSelf);
356         }
357 
358         private static class UiListItemComparator implements Comparator<UiListItem> {
359             private final Comparator<Object> collator;
360             private final boolean useSelf;
UiListItemComparator(Comparator<Object> collator, boolean useSelf)361             UiListItemComparator(Comparator<Object> collator, boolean useSelf) {
362                 this.collator = collator;
363                 this.useSelf = useSelf;
364             }
365             @Override
compare(UiListItem o1, UiListItem o2)366             public int compare(UiListItem o1, UiListItem o2) {
367                 int result = useSelf ? collator.compare(o1.nameInSelf, o2.nameInSelf)
368                         : collator.compare(o1.nameInDisplayLocale, o2.nameInDisplayLocale);
369                 return result != 0 ? result : o1.modified.compareTo(o2.modified); // just in case
370             }
371         }
372     }
373     /**
374      * Sole constructor.  (For invocation by subclass constructors,
375      * typically implicit.)
376      * @deprecated This API is ICU internal only.
377      * @hide original deprecated declaration
378      * @hide draft / provisional / internal are hidden on Android
379      */
380     @Deprecated
LocaleDisplayNames()381     protected LocaleDisplayNames() {
382     }
383 
384     private static final Method FACTORY_DIALECTHANDLING;
385     private static final Method FACTORY_DISPLAYCONTEXT;
386 
387     static {
388         String implClassName = ICUConfig.get("android.icu.text.LocaleDisplayNames.impl", "android.icu.impl.LocaleDisplayNamesImpl");
389 
390         Method factoryDialectHandling = null;
391         Method factoryDisplayContext = null;
392 
393         try {
394             Class<?> implClass = Class.forName(implClassName);
395             try {
396                 factoryDialectHandling = implClass.getMethod("getInstance",
397                         ULocale.class, DialectHandling.class);
398             } catch (NoSuchMethodException e) {
399             }
400             try {
401                 factoryDisplayContext = implClass.getMethod("getInstance",
402                         ULocale.class, DisplayContext[].class);
403             } catch (NoSuchMethodException e) {
404             }
405 
406         } catch (ClassNotFoundException e) {
407             // fallback to last resort impl
408         }
409 
410         FACTORY_DIALECTHANDLING = factoryDialectHandling;
411         FACTORY_DISPLAYCONTEXT = factoryDisplayContext;
412     }
413 
414     /**
415      * Minimum implementation of LocaleDisplayNames
416      */
417     private static class LastResortLocaleDisplayNames extends LocaleDisplayNames {
418 
419         private ULocale locale;
420         private DisplayContext[] contexts;
421 
LastResortLocaleDisplayNames(ULocale locale, DialectHandling dialectHandling)422         private LastResortLocaleDisplayNames(ULocale locale, DialectHandling dialectHandling) {
423             this.locale = locale;
424             DisplayContext context = (dialectHandling == DialectHandling.DIALECT_NAMES) ?
425                     DisplayContext.DIALECT_NAMES : DisplayContext.STANDARD_NAMES;
426             this.contexts = new DisplayContext[] {context};
427         }
428 
LastResortLocaleDisplayNames(ULocale locale, DisplayContext... contexts)429         private LastResortLocaleDisplayNames(ULocale locale, DisplayContext... contexts) {
430             this.locale = locale;
431             this.contexts = new DisplayContext[contexts.length];
432             System.arraycopy(contexts, 0, this.contexts, 0, contexts.length);
433         }
434 
435         @Override
getLocale()436         public ULocale getLocale() {
437             return locale;
438         }
439 
440         @Override
getDialectHandling()441         public DialectHandling getDialectHandling() {
442             DialectHandling result = DialectHandling.STANDARD_NAMES;
443             for (DisplayContext context : contexts) {
444                 if (context.type() == DisplayContext.Type.DIALECT_HANDLING) {
445                     if (context.value() == DisplayContext.DIALECT_NAMES.ordinal()) {
446                         result = DialectHandling.DIALECT_NAMES;
447                         break;
448                     }
449                 }
450             }
451             return result;
452         }
453 
454         @Override
getContext(Type type)455         public DisplayContext getContext(Type type) {
456             DisplayContext result = DisplayContext.STANDARD_NAMES;  // final fallback
457             for (DisplayContext context : contexts) {
458                 if (context.type() == type) {
459                     result = context;
460                     break;
461                 }
462             }
463             return result;
464         }
465 
466         @Override
localeDisplayName(ULocale locale)467         public String localeDisplayName(ULocale locale) {
468             return locale.getName();
469         }
470 
471         @Override
localeDisplayName(Locale locale)472         public String localeDisplayName(Locale locale) {
473             return ULocale.forLocale(locale).getName();
474         }
475 
476         @Override
localeDisplayName(String localeId)477         public String localeDisplayName(String localeId) {
478             return new ULocale(localeId).getName();
479         }
480 
481         @Override
languageDisplayName(String lang)482         public String languageDisplayName(String lang) {
483             return lang;
484         }
485 
486         @Override
scriptDisplayName(String script)487         public String scriptDisplayName(String script) {
488             return script;
489         }
490 
491         @Override
scriptDisplayName(int scriptCode)492         public String scriptDisplayName(int scriptCode) {
493             return UScript.getShortName(scriptCode);
494         }
495 
496         @Override
regionDisplayName(String region)497         public String regionDisplayName(String region) {
498             return region;
499         }
500 
501         @Override
variantDisplayName(String variant)502         public String variantDisplayName(String variant) {
503             return variant;
504         }
505 
506         @Override
keyDisplayName(String key)507         public String keyDisplayName(String key) {
508             return key;
509         }
510 
511         @Override
keyValueDisplayName(String key, String value)512         public String keyValueDisplayName(String key, String value) {
513             return value;
514         }
515 
516         @Override
getUiListCompareWholeItems(Set<ULocale> localeSet, Comparator<UiListItem> comparator)517         public List<UiListItem> getUiListCompareWholeItems(Set<ULocale> localeSet, Comparator<UiListItem> comparator) {
518             return Collections.emptyList();
519         }
520     }
521 }
522