mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-13 08:53:20 +00:00
ICU-12533 Loading capitilization context for LocaleDisplayNames using data sink.
X-SVN-Rev: 38771
This commit is contained in:
parent
84b42ae4d1
commit
f2cf8cd5ac
1 changed files with 28 additions and 23 deletions
|
@ -29,7 +29,6 @@ import com.ibm.icu.text.DisplayContext.Type;
|
|||
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;
|
||||
|
@ -97,6 +96,30 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
|
|||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -173,32 +196,14 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
|
|||
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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue