예제 #1
0
        ///<summary>Constructor method to parse a valid RFC5646 tag as a string
        ///</summary>
        ///<param name="inputString">valid RFC5646 string</param>
        ///<returns>RFC5646Tag object</returns>
        public static RFC5646Tag Parse(string inputString)
        {
            var tokens = inputString.Split(new[] { '-' });

            var rfc5646Tag = new RFC5646Tag();

            bool haveX = false;

            for (int position = 0; position < tokens.Length; ++position)
            {
                var token = tokens[position];
                if (token == "x")
                {
                    haveX = true;
                    continue;
                }
                if (haveX)
                {
                    //This is the case for RfcTags consisting only of a private use subtag
                    if (position == 1)
                    {
                        rfc5646Tag = new RFC5646Tag(String.Empty, String.Empty, String.Empty, String.Empty, token);
                        continue;
                    }
                    rfc5646Tag.AddToPrivateUse(token);
                    continue;
                }
                if (position == 0)
                {
                    rfc5646Tag.Language = token;
                    continue;
                }
                if (position <= 1 && StandardTags.IsValidIso15924ScriptCode(token))
                {
                    rfc5646Tag.Script = token;
                    continue;
                }
                if (position <= 2 && StandardTags.IsValidIso3166Region(token))
                {
                    rfc5646Tag.Region = token;
                    continue;
                }
                if (StandardTags.IsValidRegisteredVariant(token))
                {
                    rfc5646Tag.AddToVariant(token);
                    continue;
                }
                throw new ValidationException(String.Format("The RFC tag '{0}' could not be parsed.", inputString));
            }
            return(rfc5646Tag);
        }
예제 #2
0
 private void ValidateScript()
 {
     if (String.IsNullOrEmpty(_script))
     {
         return;
     }
     if (_script.Contains("-"))
     {
         throw new ValidationException("The script tag may not contain dashes or underscores. I.e. there may only be a single iso 639 tag in this subtag");
     }
     if (!StandardTags.IsValidIso15924ScriptCode(_script))
     {
         throw new ValidationException(String.Format("'{0}' is not a valid ISO-15924 script code.", _script));
     }
 }
        public void ConvertToPalasoConformPrivateUseRfc5646Tag(string flexConformPrivateUseRfc5646Tag)
        {
            string language   = String.Empty;
            string script     = String.Empty;
            string region     = String.Empty;
            string variant    = String.Empty;
            string privateUse = String.Empty;

            var tokens = flexConformPrivateUseRfc5646Tag.Split(new[] { '-' });

            for (int position = 0; position < tokens.Length; ++position)
            {
                string currentToken = tokens[position];
                if (position == 0)
                {
                    if (!currentToken.Equals("x", StringComparison.OrdinalIgnoreCase))
                    {
                        throw new ValidationException(String.Format("The rfctag {0} does not start with 'x-' or 'X-'.",
                                                                    flexConformPrivateUseRfc5646Tag));
                    }
                    language = currentToken;
                }
                else if (position == 1 && !StandardTags.IsValidIso15924ScriptCode(currentToken))
                {
                    language = language + '-' + currentToken;
                    continue;
                }
                else if (StandardTags.IsValidIso15924ScriptCode(currentToken))
                {
                    if (!String.IsNullOrEmpty(region) || !String.IsNullOrEmpty(variant))
                    {
                        throw new ValidationException(
                                  String.Format(
                                      "The rfctag '{0}' contains a misplaced Script subtag (i.e. it was preceded by a region or variant subtag.",
                                      flexConformPrivateUseRfc5646Tag));
                    }
                    script = currentToken;
                }
                else if (StandardTags.IsValidIso3166Region(currentToken))
                {
                    if (!String.IsNullOrEmpty(variant))
                    {
                        throw new ValidationException(
                                  String.Format(
                                      "The rfctag '{0}' contains a misplaced Region subtag (i.e. it was preceded by a variant subtag.",
                                      flexConformPrivateUseRfc5646Tag));
                    }
                    region = currentToken;
                }
                else if (StandardTags.IsValidRegisteredVariant(currentToken))
                {
                    variant = variant + currentToken;
                }
                else
                {
                    privateUse = String.IsNullOrEmpty(privateUse) ? currentToken : privateUse + '-' + currentToken;
                }
            }
            variant = WritingSystemDefinition.ConcatenateVariantAndPrivateUse(variant, privateUse);
            ConvertToPalasoConformPrivateUseRfc5646Tag(language, script, region, variant);
        }