public InternalLocaleBuilder SetLanguage(string language) { if (language == null || language.Length == 0) { _language = ""; } else { if (!LanguageTag.IsLanguage(language)) { throw new FormatException("Ill-formed language: " + language /*, 0*/); } _language = language; } return(this); }
public InternalLocaleBuilder SetLocale(BaseLocale @base, LocaleExtensions extensions) { string language = @base.GetLanguage(); string script = @base.GetScript(); string region = @base.GetRegion(); string variant = @base.GetVariant(); // ICU4N TODO: Remove ? if (JDKIMPL) { // Special backward compatibility support // Exception 1 - ja_JP_JP if (language.Equals("ja") && region.Equals("JP") && variant.Equals("JP")) { // When locale ja_JP_JP is created, ca-japanese is always there. // The builder ignores the variant "JP" Debug.Assert("japanese".Equals(extensions.GetUnicodeLocaleType("ca"))); variant = ""; } // Exception 2 - th_TH_TH else if (language.Equals("th") && region.Equals("TH") && variant.Equals("TH")) { // When locale th_TH_TH is created, nu-thai is always there. // The builder ignores the variant "TH" Debug.Assert("thai".Equals(extensions.GetUnicodeLocaleType("nu"))); variant = ""; } // Exception 3 - no_NO_NY else if (language.Equals("no") && region.Equals("NO") && variant.Equals("NY")) // ICU4N TODO: Fix this handling for .NET (no-NO is not reliable across platforms) { // no_NO_NY is a valid locale and used by Java 6 or older versions. // The build ignores the variant "NY" and change the language to "nn". language = "nn"; variant = ""; } } // Validate base locale fields before updating internal state. // LocaleExtensions always store validated/canonicalized values, // so no checks are necessary. if (language.Length > 0 && !LanguageTag.IsLanguage(language)) { throw new FormatException("Ill-formed language: " + language); } if (script.Length > 0 && !LanguageTag.IsScript(script)) { throw new FormatException("Ill-formed script: " + script); } if (region.Length > 0 && !LanguageTag.IsRegion(region)) { throw new FormatException("Ill-formed region: " + region); // ICU4N TODO: Port LocaleSyntaxException (instead of FormatException) } if (variant.Length > 0) { int errIdx = CheckVariants(variant, BaseLocale.Separator); if (errIdx != -1) { throw new FormatException("Ill-formed variant: " + variant /*, errIdx*/); } } // The input locale is validated at this point. // Now, updating builder's internal fields. _language = language; _script = script; _region = region; _variant = variant; ClearExtensions(); var extKeys = (extensions == null) ? null : extensions.Keys; if (extKeys != null) { // map extensions back to builder's internal format foreach (char key in extKeys) { Extension e = extensions.GetExtension(key); if (e is UnicodeLocaleExtension ue) { foreach (string uatr in ue.UnicodeLocaleAttributes) { if (_uattributes == null) { _uattributes = new HashSet <CaseInsensitiveString>(/*4*/); } _uattributes.Add(new CaseInsensitiveString(uatr)); } foreach (string ukey in ue.UnicodeLocaleKeys) { if (_ukeywords == null) { _ukeywords = new Dictionary <CaseInsensitiveString, string>(4); } _ukeywords[new CaseInsensitiveString(ukey)] = ue.GetUnicodeLocaleType(ukey); } } else { if (_extensions == null) { _extensions = new Dictionary <CaseInsensitiveChar, string>(4); } _extensions[new CaseInsensitiveChar(key)] = e.Value; } } } return(this); }