Skip to content

Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

Description

@General-Fault

The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
AllCultures
.Where(x => x.IsNeutralCulture)
.Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
.Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
.ToDictionary(
x => x.Parent,
x => CultureRegionMap[x],
CultureInfoComparer.ByTwoLetterIsoLanguageName);

This script

 [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *

Produced this output (with some irrelevant info striped):

Parent : bal
LCID : 8192
Name : bal-Arab
IetfLanguageTag : bal-Arab
DisplayName : Unknown Language (bal-Arab)
ThreeLetterWindowsLanguageName : ZZZ
TwoLetterISOLanguageName : bal
IsNeutralCulture : True
CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
UseUserOverride : True
IsReadOnly : False

Parent : bal-Arab
LCID : 12288
Name : bal-Arab-001
DisplayName : Unknown Locale (bal-Arab-001)
TwoLetterISOLanguageName : bal
ThreeLetterWindowsLanguageName : ZZZ
IsNeutralCulture : False
CultureTypes : SpecificCultures, InstalledWin32Cultures
UseUserOverride : True
IsReadOnly : False

Parent :
LCID : 13312
Name : bal
DisplayName : Unknown Language (bal)
TwoLetterISOLanguageName : bal
ThreeLetterWindowsLanguageName : ZZZ
IsNeutralCulture : True
CultureTypes : NeutralCultures, InstalledWin32Cultures
UseUserOverride : True
IsReadOnly : False

When Gu.Localization is used in any way, this error will be thrown:

System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at Gu.Localization.Culture..cctor()
--- End of inner exception stack trace ---
at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
at Gu.Localization.Translator.GetAllCultures()
at Gu.Localization.Translator..cctor()
--- End of inner exception stack trace ---
at Gu.Localization.Translator.ContainsCulture(CultureInfo language)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    Type initialization for Culture fails if installed cultures contains invalid neutral ancestry · Issue #82 · GuOrg/Gu.Localization · GitHub
    Skip to content

    Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

    Description

    @General-Fault

    The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

    I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

    Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

    private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
    AllCultures
    .Where(x => x.IsNeutralCulture)
    .Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
    .Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
    .ToDictionary(
    x => x.Parent,
    x => CultureRegionMap[x],
    CultureInfoComparer.ByTwoLetterIsoLanguageName);
    

    This script

     [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *
    

    Produced this output (with some irrelevant info striped):

    Parent : bal
    LCID : 8192
    Name : bal-Arab
    IetfLanguageTag : bal-Arab
    DisplayName : Unknown Language (bal-Arab)
    ThreeLetterWindowsLanguageName : ZZZ
    TwoLetterISOLanguageName : bal
    IsNeutralCulture : True
    CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
    UseUserOverride : True
    IsReadOnly : False

    Parent : bal-Arab
    LCID : 12288
    Name : bal-Arab-001
    DisplayName : Unknown Locale (bal-Arab-001)
    TwoLetterISOLanguageName : bal
    ThreeLetterWindowsLanguageName : ZZZ
    IsNeutralCulture : False
    CultureTypes : SpecificCultures, InstalledWin32Cultures
    UseUserOverride : True
    IsReadOnly : False

    Parent :
    LCID : 13312
    Name : bal
    DisplayName : Unknown Language (bal)
    TwoLetterISOLanguageName : bal
    ThreeLetterWindowsLanguageName : ZZZ
    IsNeutralCulture : True
    CultureTypes : NeutralCultures, InstalledWin32Cultures
    UseUserOverride : True
    IsReadOnly : False

    When Gu.Localization is used in any way, this error will be thrown:

    System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
    at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
    at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
    at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
    at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
    at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
    at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
    at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
    at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
    at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
    at Gu.Localization.Culture..cctor()
    --- End of inner exception stack trace ---
    at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
    at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
    at Gu.Localization.Translator.GetAllCultures()
    at Gu.Localization.Translator..cctor()
    --- End of inner exception stack trace ---
    at Gu.Localization.Translator.ContainsCulture(CultureInfo language)
    

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      No labels
      No labels

      Type

      No type

      Projects

      No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type initialization for Culture fails if installed cultures contains invalid neutral ancestry · Issue #82 · GuOrg/Gu.Localization · GitHub
      Skip to content

      Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

      Description

      @General-Fault

      The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

      I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

      Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

      private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
      AllCultures
      .Where(x => x.IsNeutralCulture)
      .Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
      .Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
      .ToDictionary(
      x => x.Parent,
      x => CultureRegionMap[x],
      CultureInfoComparer.ByTwoLetterIsoLanguageName);
      

      This script

       [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *
      

      Produced this output (with some irrelevant info striped):

      Parent : bal
      LCID : 8192
      Name : bal-Arab
      IetfLanguageTag : bal-Arab
      DisplayName : Unknown Language (bal-Arab)
      ThreeLetterWindowsLanguageName : ZZZ
      TwoLetterISOLanguageName : bal
      IsNeutralCulture : True
      CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
      UseUserOverride : True
      IsReadOnly : False

      Parent : bal-Arab
      LCID : 12288
      Name : bal-Arab-001
      DisplayName : Unknown Locale (bal-Arab-001)
      TwoLetterISOLanguageName : bal
      ThreeLetterWindowsLanguageName : ZZZ
      IsNeutralCulture : False
      CultureTypes : SpecificCultures, InstalledWin32Cultures
      UseUserOverride : True
      IsReadOnly : False

      Parent :
      LCID : 13312
      Name : bal
      DisplayName : Unknown Language (bal)
      TwoLetterISOLanguageName : bal
      ThreeLetterWindowsLanguageName : ZZZ
      IsNeutralCulture : True
      CultureTypes : NeutralCultures, InstalledWin32Cultures
      UseUserOverride : True
      IsReadOnly : False

      When Gu.Localization is used in any way, this error will be thrown:

      System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
      at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
      at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
      at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
      at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
      at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
      at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
      at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
      at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
      at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
      at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
      at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
      at Gu.Localization.Culture..cctor()
      --- End of inner exception stack trace ---
      at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
      at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
      at Gu.Localization.Translator.GetAllCultures()
      at Gu.Localization.Translator..cctor()
      --- End of inner exception stack trace ---
      at Gu.Localization.Translator.ContainsCulture(CultureInfo language)
      

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type initialization for Culture fails if installed cultures contains invalid neutral ancestry · Issue #82 · GuOrg/Gu.Localization · GitHub
        Skip to content

        Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

        Description

        @General-Fault

        The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

        I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

        Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

        private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
        AllCultures
        .Where(x => x.IsNeutralCulture)
        .Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
        .Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
        .ToDictionary(
        x => x.Parent,
        x => CultureRegionMap[x],
        CultureInfoComparer.ByTwoLetterIsoLanguageName);
        

        This script

         [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *
        

        Produced this output (with some irrelevant info striped):

        Parent : bal
        LCID : 8192
        Name : bal-Arab
        IetfLanguageTag : bal-Arab
        DisplayName : Unknown Language (bal-Arab)
        ThreeLetterWindowsLanguageName : ZZZ
        TwoLetterISOLanguageName : bal
        IsNeutralCulture : True
        CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
        UseUserOverride : True
        IsReadOnly : False

        Parent : bal-Arab
        LCID : 12288
        Name : bal-Arab-001
        DisplayName : Unknown Locale (bal-Arab-001)
        TwoLetterISOLanguageName : bal
        ThreeLetterWindowsLanguageName : ZZZ
        IsNeutralCulture : False
        CultureTypes : SpecificCultures, InstalledWin32Cultures
        UseUserOverride : True
        IsReadOnly : False

        Parent :
        LCID : 13312
        Name : bal
        DisplayName : Unknown Language (bal)
        TwoLetterISOLanguageName : bal
        ThreeLetterWindowsLanguageName : ZZZ
        IsNeutralCulture : True
        CultureTypes : NeutralCultures, InstalledWin32Cultures
        UseUserOverride : True
        IsReadOnly : False

        When Gu.Localization is used in any way, this error will be thrown:

        System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
        at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
        at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
        at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
        at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
        at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
        at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
        at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
        at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
        at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
        at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
        at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
        at Gu.Localization.Culture..cctor()
        --- End of inner exception stack trace ---
        at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
        at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
        at Gu.Localization.Translator.GetAllCultures()
        at Gu.Localization.Translator..cctor()
        --- End of inner exception stack trace ---
        at Gu.Localization.Translator.ContainsCulture(CultureInfo language)
        

        Metadata

        Metadata

        Assignees

        No one assigned

          Labels

          No labels
          No labels

          Type

          No type

          Projects

          No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Type initialization for Culture fails if installed cultures contains invalid neutral ancestry · Issue #82 · GuOrg/Gu.Localization · GitHub
          Skip to content

          Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

          Description

          @General-Fault

          The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

          I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

          Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

          private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
          AllCultures
          .Where(x => x.IsNeutralCulture)
          .Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
          .Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
          .ToDictionary(
          x => x.Parent,
          x => CultureRegionMap[x],
          CultureInfoComparer.ByTwoLetterIsoLanguageName);
          

          This script

           [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *
          

          Produced this output (with some irrelevant info striped):

          Parent : bal
          LCID : 8192
          Name : bal-Arab
          IetfLanguageTag : bal-Arab
          DisplayName : Unknown Language (bal-Arab)
          ThreeLetterWindowsLanguageName : ZZZ
          TwoLetterISOLanguageName : bal
          IsNeutralCulture : True
          CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
          UseUserOverride : True
          IsReadOnly : False

          Parent : bal-Arab
          LCID : 12288
          Name : bal-Arab-001
          DisplayName : Unknown Locale (bal-Arab-001)
          TwoLetterISOLanguageName : bal
          ThreeLetterWindowsLanguageName : ZZZ
          IsNeutralCulture : False
          CultureTypes : SpecificCultures, InstalledWin32Cultures
          UseUserOverride : True
          IsReadOnly : False

          Parent :
          LCID : 13312
          Name : bal
          DisplayName : Unknown Language (bal)
          TwoLetterISOLanguageName : bal
          ThreeLetterWindowsLanguageName : ZZZ
          IsNeutralCulture : True
          CultureTypes : NeutralCultures, InstalledWin32Cultures
          UseUserOverride : True
          IsReadOnly : False

          When Gu.Localization is used in any way, this error will be thrown:

          System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
          at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
          at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
          at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
          at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
          at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
          at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
          at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
          at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
          at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
          at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
          at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
          at Gu.Localization.Culture..cctor()
          --- End of inner exception stack trace ---
          at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
          at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
          at Gu.Localization.Translator.GetAllCultures()
          at Gu.Localization.Translator..cctor()
          --- End of inner exception stack trace ---
          at Gu.Localization.Translator.ContainsCulture(CultureInfo language)
          

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Type initialization for Culture fails if installed cultures contains invalid neutral ancestry · Issue #82 · GuOrg/Gu.Localization · GitHub
            Skip to content

            Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

            Description

            @General-Fault

            The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

            I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

            Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

            private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
            AllCultures
            .Where(x => x.IsNeutralCulture)
            .Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
            .Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
            .ToDictionary(
            x => x.Parent,
            x => CultureRegionMap[x],
            CultureInfoComparer.ByTwoLetterIsoLanguageName);
            

            This script

             [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *
            

            Produced this output (with some irrelevant info striped):

            Parent : bal
            LCID : 8192
            Name : bal-Arab
            IetfLanguageTag : bal-Arab
            DisplayName : Unknown Language (bal-Arab)
            ThreeLetterWindowsLanguageName : ZZZ
            TwoLetterISOLanguageName : bal
            IsNeutralCulture : True
            CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
            UseUserOverride : True
            IsReadOnly : False

            Parent : bal-Arab
            LCID : 12288
            Name : bal-Arab-001
            DisplayName : Unknown Locale (bal-Arab-001)
            TwoLetterISOLanguageName : bal
            ThreeLetterWindowsLanguageName : ZZZ
            IsNeutralCulture : False
            CultureTypes : SpecificCultures, InstalledWin32Cultures
            UseUserOverride : True
            IsReadOnly : False

            Parent :
            LCID : 13312
            Name : bal
            DisplayName : Unknown Language (bal)
            TwoLetterISOLanguageName : bal
            ThreeLetterWindowsLanguageName : ZZZ
            IsNeutralCulture : True
            CultureTypes : NeutralCultures, InstalledWin32Cultures
            UseUserOverride : True
            IsReadOnly : False

            When Gu.Localization is used in any way, this error will be thrown:

            System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
            at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
            at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
            at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
            at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
            at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
            at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
            at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
            at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
            at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
            at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
            at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
            at Gu.Localization.Culture..cctor()
            --- End of inner exception stack trace ---
            at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
            at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
            at Gu.Localization.Translator.GetAllCultures()
            at Gu.Localization.Translator..cctor()
            --- End of inner exception stack trace ---
            at Gu.Localization.Translator.ContainsCulture(CultureInfo language)
            

            Metadata

            Metadata

            Assignees

            No one assigned

              Labels

              No labels
              No labels

              Type

              No type

              Projects

              No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Type initialization for Culture fails if installed cultures contains invalid neutral ancestry · Issue #82 · GuOrg/Gu.Localization · GitHub
              Skip to content

              Type initialization for Culture fails if installed cultures contains invalid neutral ancestry #82

              Description

              @General-Fault

              The Gu.Localization.Culture static initializer throws a KeyNotFoundException while setting the NeutralCultrureRegionMap if the computer has a neutral culture installed (or one incorrectly marked as neutral) without a corresponding specific culture.

              I have not been able to determine the full steps to reproduce simply because I don't know how the clients computer got into this state. However I can describe the state and perhaps someone with more knowledge about configuring CultureInfo's on the system can share steps to create the state.

              Essentially, the computer had two cultures marked as neutral "bal" and "bal-Arab". Perhaps "bal-Arab" should not be marked as neutral. When the static class Gu.Localization.Culture is initialized, it creates a NeutralCultureRegionMap by iterating the neutral cultures (in this case both "bal" and "bal-Arab") and creates "specific" cultures. So for the neutral "en" culture, it creates "en-US" as the specific culture, then it attempts to find that culture in Gu.Localization.Culture.NameCultureMap using the indexer. For the client computer, neither "bal" and "bal-Arab" neutral cultures have an associated specific culture.

              private static readonly Dictionary<CultureInfo, RegionInfo> NeutralCultureRegionMap =
              AllCultures
              .Where(x => x.IsNeutralCulture)
              .Select(x => NameCultureMap[CultureInfo.CreateSpecificCulture(x.Name).Name])
              .Distinct(CultureInfoComparer.ByTwoLetterIsoLanguageName)
              .ToDictionary(
              x => x.Parent,
              x => CultureRegionMap[x],
              CultureInfoComparer.ByTwoLetterIsoLanguageName);
              

              This script

               [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | ? {$_.Name.StartsWith("bal")} | fl *
              

              Produced this output (with some irrelevant info striped):

              Parent : bal
              LCID : 8192
              Name : bal-Arab
              IetfLanguageTag : bal-Arab
              DisplayName : Unknown Language (bal-Arab)
              ThreeLetterWindowsLanguageName : ZZZ
              TwoLetterISOLanguageName : bal
              IsNeutralCulture : True
              CultureTypes : NeutralCultures, InstalledWin32Cultures <-- Note incorrect CultureType
              UseUserOverride : True
              IsReadOnly : False

              Parent : bal-Arab
              LCID : 12288
              Name : bal-Arab-001
              DisplayName : Unknown Locale (bal-Arab-001)
              TwoLetterISOLanguageName : bal
              ThreeLetterWindowsLanguageName : ZZZ
              IsNeutralCulture : False
              CultureTypes : SpecificCultures, InstalledWin32Cultures
              UseUserOverride : True
              IsReadOnly : False

              Parent :
              LCID : 13312
              Name : bal
              DisplayName : Unknown Language (bal)
              TwoLetterISOLanguageName : bal
              ThreeLetterWindowsLanguageName : ZZZ
              IsNeutralCulture : True
              CultureTypes : NeutralCultures, InstalledWin32Cultures
              UseUserOverride : True
              IsReadOnly : False

              When Gu.Localization is used in any way, this error will be thrown:

              System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
              at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
              at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
              at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
              at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
              at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
              at Gu.Localization.Culture..cctor() -- System.TypeInitializationException: The type initializer for 'Gu.Localization.Translator' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Gu.Localization.Culture' threw an exception. ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
              at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
              at Gu.Localization.Culture.<>c.<.cctor>b__12_12(CultureInfo x)
              at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
              at System.Linq.Enumerable.<DistinctIterator>d__64`1.MoveNext()
              at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
              at Gu.Localization.Culture..cctor()
              --- End of inner exception stack trace ---
              at Gu.Localization.Culture.TryGet(String name, CultureInfo& culture)
              at Gu.Localization.ResourceCultures.GetAllCultures(DirectoryInfo executingDirectory)
              at Gu.Localization.Translator.GetAllCultures()
              at Gu.Localization.Translator..cctor()
              --- End of inner exception stack trace ---
              at Gu.Localization.Translator.ContainsCulture(CultureInfo language)
              

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions