Exemple #1
0
        /// <summary>
        ///   Try to parse the string representation of a Unicode locale extension.
        /// </summary>
        /// <param name="s">
        ///   A case insensitive string containing a locale extension.
        /// </param>
        /// <param name="result">
        ///   A local extension 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>
        ///   A locale extension that refers to <paramref name="s"/>.
        /// </remarks>
        public static bool TryParse(string s, out LocaleExtension result, out string message)
        {
            result  = null;
            message = null;

            var match = extensionRegex.Match(s.ToLowerInvariant());

            if (!match.Success)
            {
                message = $"'{s}' is not a valid locale U extension.";
                return(false);
            }

            var attributes = match
                             .Groups["attr"]
                             .Captures.OfType <Capture>()
                             .Select(c => c.Value)
                             .ToArray();
            var keywords = match
                           .Groups["keyword"]
                           .Captures.OfType <Capture>()
                           .Select(c => c.Value)
                           .ToDictionary(
                v => v.Substring(0, 2),
                v => v.Length > 3 ? v.Substring(3) : "true"
                );

            result = new LocaleExtension
            {
                Attributes = attributes,
                Keywords   = keywords
            };
            return(true);
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        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);
        }
Exemple #5
0
        /// <summary>
        ///   Try to parse the string representation of a Unicode locale extension.
        /// </summary>
        /// <param name="s">
        ///   A case insensitive string containing a locale extension.
        /// </param>
        /// <param name="result">
        ///   A locale extension that refers to <paramref name="s"/> or <b>null</b> if the parsing
        ///   failed.
        /// </param>
        /// <returns>
        ///   <b>true</b> if <paramref name="s"/> was parsed successfully; otherwise, <b>false</b>.
        /// </returns>
        public static bool TryParse(string s, out LocaleExtension result)
        {
            string message;

            return(TryParse(s, out result, out message));
        }