/// <summary> /// Set extension/private subtags in a single string representation /// </summary> public InternalLocaleBuilder SetExtensions(string subtags) { if (subtags == null || subtags.Length == 0) { ClearExtensions(); return(this); } subtags = subtags.Replace(BaseLocale.Separator, LanguageTag.Separator); StringTokenEnumerator itr = new StringTokenEnumerator(subtags, LanguageTag.Separator); List <string> extensions = null; string privateuse = null; int parsed = 0; int start; // Move to first element itr.MoveNext(); // Make a list of extension subtags while (!itr.IsDone) { string s = itr.Current; if (LanguageTag.IsExtensionSingleton(s)) { start = itr.CurrentStart; string singleton = s; StringBuilder sb = new StringBuilder(singleton); itr.MoveNext(); while (!itr.IsDone) { s = itr.Current; if (LanguageTag.IsExtensionSubtag(s)) { sb.Append(LanguageTag.Separator).Append(s); parsed = itr.CurrentEnd; } else { break; } itr.MoveNext(); } if (parsed < start) { throw new FormatException("Incomplete extension '" + singleton + "'" /*, start*/); } if (extensions == null) { extensions = new List <string>(4); } extensions.Add(sb.ToString()); } else { break; } } if (!itr.IsDone) { string s = itr.Current; if (LanguageTag.IsPrivateusePrefix(s)) { start = itr.CurrentStart; StringBuilder sb = new StringBuilder(s); itr.MoveNext(); while (!itr.IsDone) { s = itr.Current; if (!LanguageTag.IsPrivateuseSubtag(s)) { break; } sb.Append(LanguageTag.Separator).Append(s); parsed = itr.CurrentEnd; itr.MoveNext(); } if (parsed <= start) { throw new FormatException("Incomplete privateuse:" + subtags.Substring(start) /*, start*/); } else { privateuse = sb.ToString(); } } } if (!itr.IsDone) { throw new FormatException("Ill-formed extension subtags:" + subtags.Substring(itr.CurrentStart) /*, itr.CurrentStart*/); } return(SetExtensions(extensions, privateuse)); }
public InternalLocaleBuilder SetExtension(char singleton, string value) { // validate key bool isBcpPrivateuse = LanguageTag.IsPrivateusePrefixChar(singleton); if (!isBcpPrivateuse && !LanguageTag.IsExtensionSingletonChar(singleton)) { throw new FormatException("Ill-formed extension key: " + singleton); } bool remove = (value == null || value.Length == 0); CaseInsensitiveChar key = new CaseInsensitiveChar(singleton); if (remove) { if (UnicodeLocaleExtension.IsSingletonChar(key.Value)) { // clear entire Unicode locale extension if (_uattributes != null) { _uattributes.Clear(); } if (_ukeywords != null) { _ukeywords.Clear(); } } else { if (_extensions != null && _extensions.ContainsKey(key)) { _extensions.Remove(key); } } } else { // validate value string val = value.Replace(BaseLocale.Separator, LanguageTag.Separator); StringTokenEnumerator itr = new StringTokenEnumerator(val, LanguageTag.Separator); while (itr.MoveNext()) { string s = itr.Current; bool validSubtag; if (isBcpPrivateuse) { validSubtag = LanguageTag.IsPrivateuseSubtag(s); } else { validSubtag = LanguageTag.IsExtensionSubtag(s); } if (!validSubtag) { throw new FormatException("Ill-formed extension value: " + s /*, itr.CurrentStart*/); } } if (UnicodeLocaleExtension.IsSingletonChar(key.Value)) { SetUnicodeLocaleExtension(val); } else { if (_extensions == null) { _extensions = new Dictionary <CaseInsensitiveChar, string>(4); } _extensions[key] = val; } } return(this); }