【问题标题】:System.Global.CultureNotFoundException on some systems but not othersSystem.Global.CultureNotFoundException 在某些系统上但不是在其他系统上
【发布时间】:2018-03-07 22:20:22
【问题描述】:

我们收到一位客户的请求,希望将 Haitian Creole resx 文件添加到我们的应用程序中。我们得到了翻译,我去插入它们,但我立即发现浏览器对 ht 作为语言/区域设置代码的支持很少。 Chrome 不会让你在任何地方输入它。 IE 11 允许您将其作为自定义代码输入。只有 Edge 和 Firefox 提供了它。

但令我困惑的是,当我进入一个插入了这些 resx 文件的调试系统并使用浏览器访问该站点时,我在以下行中得到了 System.Global.CultureNotFoundException:

CultureInfo ci = CultureInfo.CreateSpecificCulture(cultureName);

但是,如果我使用我们的发布版本没有具有 resx 文件的不同系统,则不会出现错误。显然,我也没有得到任何海地克里奥尔语翻译,但同样的代码在出现 ht 时不会崩溃。

我已经执行了相同的 powershell 命令来列出两个系统上支持的语言,而 Haitian Creole 不在这两个系统的列表中。

[system.Globalization.CultureInfo]::GetCultures('AllCultures')

当浏览器显示无法识别的代码时,是否有某种发布模式构建的东西悄悄地退回到系统语言?据我所知,我的测试系统之间的唯一区别是发布模式/无 ht resx 和调试模式/使用 ht resx。

我不明白为什么我在两个地方都没有得到相同的异常...

谢谢

【问题讨论】:

    标签: c# asp.net globalization


    【解决方案1】:

    有很多优化,这里可能的罪魁祸首是Just-in-time compiler。如果它检测到任何可以归类为“死代码”的东西,它会毫不犹豫地将其删除。

    当我尝试在具有 2 GiB 限制的 x32 系统上编写强制 OOM 异常的代码时,我遇到了这个问题:如果有问题的部分被检测为“死代码”,我实际上无法强制 OOM .一个简单的输出顺序解决了这个问题:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace OOM_32_forced
    {
        class Program
        {
            static void Main(string[] args)
            {
                //each short is 2 byte big, Int32.MaxValue is 2^31.
                //So this will require a bit above 2^32 byte, or 2 GiB
                short[] Array = new short[Int32.MaxValue];
    
                /*need to actually access that array
                Otherwise JIT compiler and optimisations will just skip
                the array definition and creation */
                foreach (short value in Array)
                    Console.WriteLine(value);
            }
        }
    }
    

    【讨论】:

    • 不,代码在两种情况下运行相同。它没有被优化为死代码。唯一改变的是浏览器用户用来说明用户喜欢的区域设置的 http 标头。
    • @user1664043:好吧,我得胡思乱想。也许合作伙伴语言很重要?早在无法免费下载语言包时,您购买了特定语言/地区,但同时获得了一些合作伙伴语言。即,德国和加拿大语言包都包括法语。因此,使用一些语言包,您可能会得到“海地克里奥尔语”。与其他人没有。它主要基于文化上的接近性。通常这个单独的文件在 Windows 7+ 中被删除了。但是,如果您的操作系统足够老,它可能仍然有效吗?
    • 如果发生某种“买二送一”的事情,它不会仍然出现在 powershell [system.Globalization.CultureInfo]::GetCultures('AllCultures')命令?我的意思是,如果它在系统上可用,但它到达那里,它不会在列表中吗?
    【解决方案2】:

    当您的应用具有区域设置代码的 resx 文件但整个系统无法识别时,似乎会发生 System.Global.CultureNotFoundException 异常。

    利用 IE 11 的功能输入您想要的任何奇怪的自定义代码,我添加了 xx-xx 并将其放在我的列表顶部。当然,我没有 xx-xx 的 resx 文件。

    对带有以 xx-xx 开头的 Accept-Language 标头的站点的请求不会引发 System.Global.CultureNotFoundException 异常;它只是悄悄地移到列表中的下一个。

    我的开发站点和其他发布版本之间的区别在于我的开发站点在构建中有 .ht.resx 文件,而其他 qa 站点没有

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2021-05-09
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多