/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> private LanguageTag( Language?language, Script?script, Region?region, VariantCollection variants, ExtensionSubtagCollection extensions, ExtensionSubtag privateUse) { if (language != null && script != null) { var suppressScript = language.SuppressScript; if (suppressScript != null && suppressScript == script) { script = null; } } Language = language; Script = script; Region = region; Variants = variants; Extensions = extensions; PrivateUse = privateUse; var fields = Field.None; if (language != null) { fields |= Field.Language; } if (script != null) { fields |= Field.Script; } if (region != null) { fields |= Field.Region; } if (!variants.IsEmpty) { fields |= Field.Variants; } if (!extensions.IsEmpty) { fields |= Field.Extensions; } if (!privateUse.IsEmpty) { if (!privateUse.PrivateUse) { throw new ArgumentOutOfRangeException(nameof(privateUse), "must be a private use subtag"); } fields |= Field.PrivateUse; } Fields = fields; }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="variants">enumarate of variant subtags</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, IEnumerable <Variant>?variants, ExtensionSubtag privateUseSubtags) : this( lang, null, null, VariantCollection.Create(lang, null, variants), default, privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="script">script subtag</param> /// <param name="region">region subtag</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, Script?script, Region?region, ExtensionSubtag privateUseSubtags) : this( lang, script, region, default, default, privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="extSubtags">enumarate of extensions subtags</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, IEnumerable <ExtensionSubtag>?extSubtags, ExtensionSubtag privateUseSubtags) : this( lang, null, null, default, new ExtensionSubtagCollection(extSubtags), privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="script">script subtag</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, Script?script, ExtensionSubtag privateUseSubtags) : this( lang, script, null, default, default, privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="region">region subtag</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, Region?region, ExtensionSubtag privateUseSubtags) : this( lang, null, region, default, default, privateUseSubtags) { }
/// <summary> /// Tries to parse <see cref="LanguageTag"/> value from its text representation /// </summary> /// <param name="text">text representation of language tag</param> /// <param name="result">parsed value</param> /// <returns>true if parsing was successful, false otherwise</returns> public static bool TryParse(string?text, out LanguageTag result) { if (text is null) { throw new ArgumentNullException(nameof(text)); } var tokens = new TokenEnumerator(Grandfathered.GetPreferredValue(text) ?? text); if (tokens.TokenIsPrivateUseSingleton()) { // This tag starts with private use subtags var immediatePrivateUseResult = ExtensionSubtag.Parse(tokens, true); var error = immediatePrivateUseResult.NothingToParse || immediatePrivateUseResult.ErrorOccured || tokens.CurrentTokenAvailable; if (error) { // But they are invalid result = default; return(false); } result = new LanguageTag(immediatePrivateUseResult.Result); return(true); } var language = tokens.TryParseLanguage(); if (language is null) { // If language tag is not entirely private use subtags, it must contain language result = default; return(false); } // These two cannot produce error during parsing var script = tokens.TryParseScript(); var region = tokens.TryParseRegion(); // These three can var variantsResult = VariantCollection.Parse(language, script, tokens); if (variantsResult.ErrorOccured) { result = default; return(false); } var extensionsResult = ExtensionSubtagCollection.Parse(tokens); if (extensionsResult.ErrorOccured) { result = default; return(false); } var privateUseResult = ExtensionSubtag.Parse(tokens, true); if (privateUseResult.ErrorOccured) { result = default; return(false); } if (tokens.CurrentTokenAvailable) { // Something left unparsed result = default; return(false); } var variants = variantsResult.NothingToParse ? default : variantsResult.Result; var extensions = extensionsResult.NothingToParse ? default : extensionsResult.Result; var privateUse = privateUseResult.NothingToParse ? default : privateUseResult.Result; result = new LanguageTag(language, script, region, variants, extensions, privateUse); return(true); }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> public LanguageTag(ExtensionSubtag privateUseSubtags) : this(null, null, null, default, default, privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="script">script subtag</param> /// <param name="region">region subtag</param> /// <param name="variants">enumarate of variant subtags</param> /// <param name="extSubtags">enumarate of extensions subtags</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, Script?script, Region?region, IEnumerable <Variant>?variants, IEnumerable <ExtensionSubtag>?extSubtags, ExtensionSubtag privateUseSubtags) : this( lang, script, region, VariantCollection.Create(lang, script, variants), new ExtensionSubtagCollection(extSubtags), privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="script">script subtag</param> /// <param name="region">region subtag</param> /// <param name="extSubtags">enumarate of extensions subtags</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, Script?script, Region?region, IEnumerable <ExtensionSubtag>?extSubtags, ExtensionSubtag privateUseSubtags) : this( lang, script, region, default, new ExtensionSubtagCollection(extSubtags), privateUseSubtags) { }
/// <summary> /// Initializes new value of <see cref="LanguageTag"/> /// </summary> /// <param name="lang">primary language</param> /// <param name="variants">enumarate of variant subtags</param> /// <param name="extSubtags">enumarate of extensions subtags</param> /// <param name="privateUseSubtags">private use subtag</param> public LanguageTag(Language lang, IEnumerable <Variant>?variants, IEnumerable <ExtensionSubtag>?extSubtags, ExtensionSubtag privateUseSubtags) : this( lang, null, null, VariantCollection.Create(lang, null, variants), new ExtensionSubtagCollection(extSubtags), privateUseSubtags) { }