public override IList <UiListItem> GetUiListCompareWholeItems(ISet <ULocale> localeSet, IComparer <UiListItem> comparer) { DisplayContext capContext = GetContext(DisplayContextType.Capitalization); List <UiListItem> result = new List <UiListItem>(); IDictionary <ULocale, ISet <ULocale> > baseToLocales = new Dictionary <ULocale, ISet <ULocale> >(); ULocale.Builder builder = new ULocale.Builder(); foreach (ULocale locOriginal in localeSet) { builder.SetLocale(locOriginal); // verify well-formed. We do this here so that we consistently throw exception ULocale loc = ULocale.AddLikelySubtags(locOriginal); ULocale @base = new ULocale(loc.GetLanguage()); ISet <ULocale> locales = baseToLocales.Get(@base); if (locales == null) { baseToLocales[@base] = locales = new HashSet <ULocale>(); } locales.Add(loc); } foreach (var entry in baseToLocales) { ULocale @base = entry.Key; ISet <ULocale> values = entry.Value; if (values.Count == 1) { ULocale locale = values.First(); result.Add(NewRow(ULocale.MinimizeSubtags(locale, ULocale.Minimize.FAVOR_SCRIPT), capContext)); } else { ISet <string> scripts = new HashSet <string>(); ISet <string> regions = new HashSet <string>(); // need the follow two steps to make sure that unusual scripts or regions are displayed ULocale maxBase = ULocale.AddLikelySubtags(@base); scripts.Add(maxBase.GetScript()); regions.Add(maxBase.GetCountry()); foreach (ULocale locale in values) { scripts.Add(locale.GetScript()); regions.Add(locale.GetCountry()); } bool hasScripts = scripts.Count > 1; bool hasRegions = regions.Count > 1; foreach (ULocale locale in values) { ULocale.Builder modified = builder.SetLocale(locale); if (!hasScripts) { modified.SetScript(""); } if (!hasRegions) { modified.SetRegion(""); } result.Add(NewRow(modified.Build(), capContext)); } } } result.Sort(comparer); return(result); }
private void ParseSetting() { int i = ruleIndex + 1; int j = ReadWords(i, rawBuilder.Value); if (j <= i || rawBuilder.Length == 0) { SetParseError("expected a setting/option at '['"); } // startsWith() etc. are available for String but not CharSequence/StringBuilder. string raw = rawBuilder.ToString(); if (rules[j] == 0x5d) { // words end with ] ++j; if (raw.StartsWith("reorder", StringComparison.Ordinal) && (raw.Length == 7 || raw[7] == 0x20)) { ParseReordering(raw); ruleIndex = j; return; } if (raw.Equals("backwards 2")) { settings.SetFlag(CollationSettings.BackwardSecondary, true); ruleIndex = j; return; } string v; int valueIndex = raw.LastIndexOf((char)0x20); if (valueIndex >= 0) { v = raw.Substring(valueIndex + 1); raw = raw.Substring(0, valueIndex - 0); // ICU4N: Checked 2nd parameter } else { v = ""; } if (raw.Equals("strength") && v.Length == 1) { int value = UCOL_DEFAULT; char c = v[0]; if (0x31 <= c && c <= 0x34) { // 1..4 value = (int)CollationStrength.Primary + (c - 0x31); } else if (c == 0x49) { // 'I' value = (int)CollationStrength.Identical; } if (value != UCOL_DEFAULT) { settings.Strength = (CollationStrength)value; ruleIndex = j; return; } } else if (raw.Equals("alternate")) { int value = UCOL_DEFAULT; if (v.Equals("non-ignorable")) { value = 0; // UCOL_NON_IGNORABLE } else if (v.Equals("shifted")) { value = 1; // UCOL_SHIFTED } if (value != UCOL_DEFAULT) { settings.SetAlternateHandlingShifted(value > 0); ruleIndex = j; return; } } else if (raw.Equals("maxVariable")) { int value = UCOL_DEFAULT; if (v.Equals("space")) { value = CollationSettings.MaxVariableSpace; } else if (v.Equals("punct")) { value = CollationSettings.MaxVariblePunctuation; } else if (v.Equals("symbol")) { value = CollationSettings.MaxVariableSymbol; } else if (v.Equals("currency")) { value = CollationSettings.MaxVarCurrency; } if (value != UCOL_DEFAULT) { settings.SetMaxVariable(value, 0); settings.VariableTop = baseData.GetLastPrimaryForGroup( ReorderCodes.First + value); Debug.Assert(settings.VariableTop != 0); ruleIndex = j; return; } } else if (raw.Equals("caseFirst")) { int value = UCOL_DEFAULT; if (v.Equals("off")) { value = UCOL_OFF; } else if (v.Equals("lower")) { value = CollationSettings.CaseFirst; // UCOL_LOWER_FIRST } else if (v.Equals("upper")) { value = CollationSettings.CaseFirstAndUpperMask; // UCOL_UPPER_FIRST } if (value != UCOL_DEFAULT) { settings.SetCaseFirst(value); ruleIndex = j; return; } } else if (raw.Equals("caseLevel")) { int value = GetOnOffValue(v); if (value != UCOL_DEFAULT) { settings.SetFlag(CollationSettings.CaseLevel, value > 0); ruleIndex = j; return; } } else if (raw.Equals("normalization")) { int value = GetOnOffValue(v); if (value != UCOL_DEFAULT) { settings.SetFlag(CollationSettings.CheckFCD, value > 0); ruleIndex = j; return; } } else if (raw.Equals("numericOrdering")) { int value = GetOnOffValue(v); if (value != UCOL_DEFAULT) { settings.SetFlag(CollationSettings.Numeric, value > 0); ruleIndex = j; return; } } else if (raw.Equals("hiraganaQ")) { int value = GetOnOffValue(v); if (value != UCOL_DEFAULT) { if (value == UCOL_ON) { SetParseError("[hiraganaQ on] is not supported"); } ruleIndex = j; return; } } else if (raw.Equals("import")) { // BCP 47 language tag -> ICU locale ID ULocale localeID; try { localeID = new ULocale.Builder().SetLanguageTag(v).Build(); } catch (Exception e) { SetParseError("expected language tag in [import langTag]", e); return; } // localeID minus all keywords string baseID = localeID.GetBaseName(); // @collation=type, or length=0 if not specified string collationType = localeID.GetKeywordValue("collation"); if (importer == null) { SetParseError("[import langTag] is not supported"); } else { String importedRules; try { importedRules = importer.GetRules(baseID, collationType != null ? collationType : "standard"); } catch (Exception e) { SetParseError("[import langTag] failed", e); return; } string outerRules = rules; int outerRuleIndex = ruleIndex; try { Parse(importedRules); } catch (Exception e) { ruleIndex = outerRuleIndex; // Restore the original index for error reporting. SetParseError("parsing imported rules failed", e); } rules = outerRules; ruleIndex = j; } return; } } else if (rules[j] == 0x5b) { // words end with [ UnicodeSet set = new UnicodeSet(); j = ParseUnicodeSet(j, set); if (raw.Equals("optimize")) { try { sink.Optimize(set); } catch (Exception e) { SetParseError("[optimize set] failed", e); } ruleIndex = j; return; } else if (raw.Equals("suppressContractions")) { try { sink.SuppressContractions(set); } catch (Exception e) { SetParseError("[suppressContractions set] failed", e); } ruleIndex = j; return; } } SetParseError("not a valid setting/option"); }