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

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


当前回答

关于。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)之后才可用。

其他回答

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

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

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

关于。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)之后才可用。

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

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

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

这招对我很管用:

 //Exception Class Extensions
    public static class ExceptionExtensions
    {
        public static string EnMessage(this Exception ex)
        {
            CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
            string englishExceptionMessage = ex.Message;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            try
            {
                var objectType = Type.GetType(ex.GetType().FullName);
                var instantiatedObject = Activator.CreateInstance(objectType);                
                throw (Exception)instantiatedObject;
            }
            catch (Exception e)
            {
                englishExceptionMessage = e.Message;
            }
            Thread.CurrentThread.CurrentCulture = oldCI;
            Thread.CurrentThread.CurrentUICulture = oldCI;
            return englishExceptionMessage;
        }
    }

然后你可以通过调用新方法ex.EnMessage()来使用它;

.NET框架分为两部分:

.NET框架本身 .NET框架语言包

在. net框架中,所有文本(例如异常消息、MessageBox上的按钮标签等)都是英文的。语言包具有本地化文本。

根据您的具体情况,解决方案是卸载语言包(即告诉客户端这样做)。在这种情况下,异常文本将是英文的。但是请注意,所有其他框架提供的文本也将是英文的(例如MessageBox上的按钮标签,ApplicationCommands的键盘快捷键)。