public void Stringify() { var x = "u-foo-bar-nu-thai-ca-buddhist-kk-true"; Assert.AreEqual("u-bar-foo-ca-buddhist-kk-nu-thai", LocaleExtension.Parse(x).ToString()); Assert.AreEqual("", LocaleExtension.Empty.ToString()); }
public void Parsing_Unicode_Extensions() { var extension = LocaleExtension.Parse("u-bar-foo-ca-buddhist-kk-nu-thai"); CollectionAssert.Contains(extension.Attributes.ToArray(), "foo"); CollectionAssert.Contains(extension.Attributes.ToArray(), "bar"); Assert.AreEqual("buddhist", extension.Keywords["ca"]); Assert.AreEqual("true", extension.Keywords["kk"]); Assert.AreEqual("thai", extension.Keywords["nu"]); }
/// <summary> /// Tries parsing the string representation of a locale identifier. /// </summary> /// <param name="s"> /// A case insensitive string containing a locale identifier, based on BCP47. /// </param> /// <param name="result"> /// A BCP 47 language identifier that refers to <paramref name="s"/> or <b>null</b> if the parsing /// failed. /// </param> /// <param name="message"> /// The reason why the parsing failed. /// </param> /// <returns> /// <b>true</b> if <paramref name="s"/> was parsed successfully; otherwise, <b>false</b>. /// </returns> /// <remarks> /// The transformation rules for converting a BCP 47 tag into a /// Unicode Locale ID are <b>not</b> applied. /// </remarks> public static bool TryParseBcp47(string s, out LocaleIdentifier result, out string message) { result = null; message = null; var match = idRegex.Match(s.ToLowerInvariant()); if (!match.Success) { message = $"'{s}' is not a valid locale identifier."; return(false); } // Variants cannot be repeated. var variants = match.Groups["variants"] .Value.Split('-', '_') .Where(sv => !string.IsNullOrEmpty(sv)) .ToArray(); if (variants.Distinct().Count() != variants.Length) { message = $"'{s}' is not a valid locale identifier because a variant is duplicated."; return(false); } // Extensions cannot be repeated. var extensions = new List <string>(); foreach (Capture capture in match.Groups["ext"].Captures) { extensions.Add(capture.Value.Replace('_', '-')); } if (extensions.Distinct().Count() != extensions.Count) { message = $"'{s}' is not a valid locale identifier because an extension is duplicated."; return(false); } var u = extensions .Where(x => x.StartsWith("u-")) .Select(x => LocaleExtension.Parse(x)) .FirstOrDefault(); result = new LocaleIdentifier { Language = match.Groups["lang"].Value, Script = ToTitleCase(match.Groups["script"].Value), Region = match.Groups["region"].Value.ToUpperInvariant(), Variants = variants, Extensions = extensions.ToArray(), UnicodeExtension = u ?? LocaleExtension.Empty }; return(true); }