我们通过编写Exception来记录系统中发生的任何异常。消息发送到文件。但是,它们是在客户端的文化中编写的。土耳其语的错误对我来说意义不大。

那么,我们如何在不改变用户文化的情况下用英语记录错误消息呢?


当前回答

这个问题可以部分解决。框架异常代码根据当前线程区域设置从其资源加载错误消息。在某些异常的情况下,这将在访问Message属性时发生。

对于这些例外情况,您可以通过在记录消息的同时将线程语言环境简单地切换为en-US来获得消息的完整的美国英语版本(预先保存原始用户语言环境,然后立即恢复它)。

在一个单独的线程上执行这个操作会更好:这样可以确保不会有任何副作用。例如:

try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString()); //Will display localized message
  ExceptionLogger el = new ExceptionLogger(ex);
  System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
  t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
  t.Start();
}

其中ExceptionLogger类看起来像这样:

class ExceptionLogger
{
  Exception _ex;

  public ExceptionLogger(Exception ex)
  {
    _ex = ex;
  }

  public void DoLog()
  {
    Console.WriteLine(_ex.ToString()); //Will display en-US message
  }
}

然而,正如Joe在对该回复的早期修订的评论中正确指出的那样,在抛出异常时,一些消息已经(部分)从语言资源加载了。

例如,这适用于抛出ArgumentNullException("foo")异常时生成的消息中的'parameter cannot be null'部分。在这些情况下,即使在使用上述代码时,消息仍将出现(部分)本地化。

除了使用一些不切实际的技巧,比如在一个带有en-US语言环境的线程上运行所有的非ui代码之外,似乎没有什么可以做的:. net Framework异常代码没有覆盖错误消息语言环境的工具。

其他回答

我可以想象其中一种方法:

异常只会被你读取,也就是说,它们不是客户端特性,所以你可以使用硬连线的非本地化字符串,当你在土耳其模式下运行时不会改变。 每个错误都包含一个错误代码,例如0x00000001,这样你就可以很容易地在英文表中查找它。

我知道这是一个古老的话题,但我认为我的解决方案可能与任何在网络搜索中偶然发现它的人非常相关:

在异常记录器中,您可以记录ex.GetType。ToString,它将保存异常类的名称。我希望类的名称应该是独立于语言的,因此总是用英语表示(例如。“system . filenotfoundexception”),尽管目前我还没有一个外语系统来测试这个想法。

如果您真的想要错误消息文本,您可以创建一个字典,其中包含所有可能的异常类名称及其等效消息,无论您喜欢哪种语言,但对于英语,我认为类名已经足够了。

这可能是一个有争议的观点,但是与其将区域性设置为en-US,不如将其设置为Invariant。在“不变区域性”中,错误消息是英文的。

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

它的优点是看起来没有偏见,特别是对于非美式英语地区。(也就是避免同事的冷嘲热讽)

关于。net Core和以上,线程文档。CurrentUICulture推荐使用CultureInfo。属性检索和设置当前区域性。

CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture;

在一个相关的GitHub问题上,Tarek Mahmoud Sayed建议使用CultureInfo。defaultthreadcurrentuicculture以确保稍后创建的其他线程也将获得相同的区域性:

CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

后者只在。net Framework 4.5(和。net Core 1.0)之后才可用。

必须在IIS上进行更改。进入IIS管理器>选择站点> . net全球化>在那里将UI文化设置为英文。

在另一篇SO文章中可以看到更详细的答案。