{"record":{"id":"3f7e9b67f78bb9a3","repo":"dotnet/wpf","slug":"sr-format-sr-xmllanggetspecificculture-lowercasetag","errorCode":null,"errorMessage":"SR.Format(SR.XmlLangGetSpecificCulture, _lowerCaseTag)","messagePattern":"SR\\.Format\\(SR\\.XmlLangGetSpecificCulture, _lowerCaseTag\\)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Markup/XmlLanguage.cs","lineNumber":236,"sourceCode":"        ///    Finds the registered CultureInfo matching the longest-possible prefix of this XmlLanguage.\n        ///       If that registered CultureInfo is Neutral, then relies on\n        ///       CultureInfo.CreateSpecificCulture() to map from a Neutral CultureInfo to a Specific one.\n        /// </remarks>\n        public CultureInfo GetSpecificCulture()\n        {\n            if (_specificCulture == null)\n            {\n                if (_lowerCaseTag.Length == 0 || string.Equals(_lowerCaseTag, \"und\", StringComparison.Ordinal))\n                {\n                    _specificCulture = GetEquivalentCulture();\n                }\n                else\n                {\n                    CultureInfo culture = GetCompatibleCulture();\n\n                    if (culture.IetfLanguageTag.Length == 0)\n                    {\n                        throw new InvalidOperationException(SR.Format(SR.XmlLangGetSpecificCulture, _lowerCaseTag));\n                    }\n\n                    if (!culture.IsNeutralCulture)\n                    {\n                        _specificCulture = culture;\n                    }\n                    else\n                    {\n                        try\n                        {\n                            // note that it's important that we use culture.Name, not culture.IetfLanguageTag, here\n                            culture = CultureInfo.CreateSpecificCulture(culture.Name);\n                            _specificCulture = CultureInfo.GetCultureInfoByIetfLanguageTag(culture.IetfLanguageTag);\n                        }\n                        catch (ArgumentException e)\n                        {\n                            throw new InvalidOperationException(SR.Format(SR.XmlLangGetSpecificCulture, _lowerCaseTag), e);\n                        }","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Markup/XmlLanguage.cs#L218-L254","documentation":"XmlLanguage.GetSpecificCulture derives a specific (region-qualified) culture from the equivalent culture; when the compatible culture's IetfLanguageTag is empty (i.e. it corresponds to the invariant culture) there is no specific culture to create, so it throws InvalidOperationException naming the original tag.","triggerScenarios":"Calling GetSpecificCulture on an XmlLanguage built from an empty or unrecognized tag whose GetCompatibleCulture resolves to the invariant culture (empty IetfLanguageTag).","commonSituations":"Binding code that calls GetSpecificCulture for sorting/formatting on documents with empty or invalid xml:lang; passing CultureInfo.InvariantCulture-derived languages through localization pipelines; default XmlLanguage.Empty being used in GetCultureInfo paths.","solutions":["Guard against XmlLanguage.Empty / empty IetfLanguageTag before calling GetSpecificCulture and use CultureInfo.InvariantCulture directly instead","Ensure the document or property carries a real xml:lang value (e.g. \"en-US\") rather than an empty string","Catch InvalidOperationException and fall back to CurrentCulture for formatting/sorting","Use GetEquivalentCulture/TryGetEquivalentCulture when only language (not region) matters"],"exampleFix":"// before\nCultureInfo specific = xmlLang.GetSpecificCulture(); // throws for empty tag\n// after\nCultureInfo specific = xmlLang.IetfLanguageTag.Length == 0\n    ? CultureInfo.InvariantCulture\n    : xmlLang.GetSpecificCulture();","handlingStrategy":"type-guard","validationCode":"bool canGetSpecific = xmlLang != null && xmlLang.IetfLanguageTag.Length > 0;","typeGuard":"static bool HasSpecificCulture(XmlLanguage lang) => lang != null && lang != XmlLanguage.Empty && lang.IetfLanguageTag.Length > 0;","tryCatchPattern":"try { ci = xmlLang.GetSpecificCulture(); }\ncatch (InvalidOperationException) { ci = CultureInfo.CurrentCulture; }","preventionTips":["Check for XmlLanguage.Empty before requesting a specific culture","Ensure xml:lang is populated in documents","Use InvariantCulture explicitly when no language is set"],"tags":["wpf","globalization","culture","specific-culture"],"backgroundTag":"invalid-culture-tag","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}