import com.ibm.icu.text.LocaleDisplayNames;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.UResourceBundle;
-import com.ibm.icu.util.UResourceBundleIterator;
public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
private final ULocale locale;
}
}
+ private final class CapitalizationContextSink extends UResource.Sink {
+ boolean hasCapitalizationUsage = false;
+
+ @Override
+ public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
+ UResource.Table contextsTable = value.getTable();
+ for (int i = 0; contextsTable.getKeyAndValue(i, key, value); ++i) {
+
+ CapitalizationContextUsage usage = contextUsageTypeMap.get(key.toString());
+ if (usage == null) { continue; };
+
+ int[] intVector = value.getIntVector();
+ if (intVector.length < 2) { continue; }
+
+ int titlecaseInt = (capitalization == DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU)
+ ? intVector[0] : intVector[1];
+ if (titlecaseInt == 0) { continue; }
+
+ capitalizationUsage[usage.ordinal()] = true;
+ hasCapitalizationUsage = true;
+ }
+ }
+ }
+
public LocaleDisplayNamesImpl(ULocale locale, DialectHandling dialectHandling) {
this(locale, (dialectHandling==DialectHandling.STANDARD_NAMES)? DisplayContext.STANDARD_NAMES: DisplayContext.DIALECT_NAMES,
DisplayContext.CAPITALIZATION_NONE);
capitalization == DisplayContext.CAPITALIZATION_FOR_STANDALONE) {
capitalizationUsage = new boolean[CapitalizationContextUsage.values().length]; // initialized to all false
ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, locale);
- UResourceBundle contextTransformsBundle = null;
+ CapitalizationContextSink sink = new CapitalizationContextSink();
try {
- contextTransformsBundle = (UResourceBundle)rb.getWithFallback("contextTransforms");
+ rb.getAllItemsWithFallback("contextTransforms", sink);
}
catch (MissingResourceException e) {
- contextTransformsBundle = null; // probably redundant
- }
- if (contextTransformsBundle != null) {
- UResourceBundleIterator ctIterator = contextTransformsBundle.getIterator();
- while ( ctIterator.hasNext() ) {
- UResourceBundle contextTransformUsage = ctIterator.next();
- int[] intVector = contextTransformUsage.getIntVector();
- if (intVector.length >= 2) {
- String usageKey = contextTransformUsage.getKey();
- CapitalizationContextUsage usage = contextUsageTypeMap.get(usageKey);
- if (usage != null) {
- int titlecaseInt = (capitalization == DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU)?
- intVector[0]: intVector[1];
- if (titlecaseInt != 0) {
- capitalizationUsage[usage.ordinal()] = true;
- needBrkIter = true;
- }
- }
- }
- }
+ // Silently ignore. Not every locale has contextTransforms.
}
+ needBrkIter = sink.hasCapitalizationUsage;
}
// Get a sentence break iterator if we will need it
if (needBrkIter || capitalization == DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) {