我们通过将Exception.Message写入文件来记录系统中发生的任何异常.但是,它们是在客户的文化中写成的.而土耳其的错误对我来说意义不大.
那么如何在不改变用户文化的情况下用英语记录任何错误消息呢?
当我的.NET应用程序发生错误时,我收到一条异常消息(在我的例子中)瑞典语.这对大多数用途来说都是无用的,因为.
该消息通常只是原始(英语)异常消息的翻译版本[1]
异常消息很少用于诊断问题,通常包括搜索错误消息.这意味着猜测或使用Web服务来查找原始英语消息.
[1]我不是在开玩笑.示例:在绑定失败的上下文中"调用程序集"被完全混淆.它被翻译成"之称集结号",因为英语是如何使用相同的字是一个呼唤作为一个它被调用.几乎就像有人用字典一字一句地翻译它.
所以我想:我希望能够得到英文异常消息,始终如一,在非英文Windows安装(我不希望改变应用程序的线程文化).
有一个类似的问题(英语中的异常消息?),但这是在记录的概念.在那个级别,我可以改变线程文化.
但我希望更改是全局的,并且还包括"不是我的代码"例外.
有没有办法可以配置或"黑客"(例如通过替换资源文件)?我是唯一一个认为翻译异常消息的人,在.NET中是一个可怕的设计缺陷吗?
对不起,如果这是部分咆哮和部分问题.
在使用ASP.NET MVC时,我注意到我系统上安装的.NET框架发出的异常消息是德语.我真的更喜欢英文短信,所以我可以将它们贴在SO上.
我知道之前已经问过这个问题了,但奇怪的是,建议的解决方法似乎都不适用于我的情况.我已经尝试过以下方法:
在抛出异常之前将线程区域设置设置为英语,如下所示:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
//打电话给我错误的方法......
那么,我如何让.NET框架发出英语异常消息呢?是否有任何方法可以在每个解决方案甚至整个系统的基础上执行此操作?
编辑:在排除单元测试时抛出异常.我不确定这是否是设置线程文化无效的原因.
我正在尝试本地化我的程序,但我希望发送给开发人员的错误消息以英文显示.我无法找到一种方法来实现这一点,因为似乎如果在抛出错误时将UI文化设置为另一种语言,则会抛出该语言.由于我自己并没有编写这个程序,并且它非常大,我认为创建新的try catch块以尝试在发生错误或可能发生错误时将文化设置回英语是不切实际的.目前,CurrentCulture和DefaultThreadCurrentCulture在整个应用程序中始终设置为英语,而CurrentUICulture设置为最终用户的语言.
当我解决方法时,我目前有一个函数已经遍历一个错误列表(使用System.Resources.ResourceSets(我假设是Windows错误,但我还需要一种方法来查找.NET错误,以便我可以迭代这个字符串替换了其他语言中的匹配错误,并用它们的英语等价物替换它们,以便在应用程序崩溃时构建一个大的错误消息发送给开发人员.真的,我没有太多的翻译,因为大部分的message是一个服务器堆栈跟踪并显示抛出异常的位置.最大的问题是转换内部异常消息,有时是主异常消息,因为有时抛出的错误不会出现在ResourceSet中,有时会使用格式化项目,如'{0 }".
这是我到目前为止翻译剩余错误的代码.我仍在努力添加正则表达式模式来翻译使用"{0}"之类的错误,所以如果有人对此提出建议或更好的方法,我会很感激建议.
public static string TranslateExceptionMessageTest(string exmsg, Exception e, CultureInfo currentui)
{
CultureInfo test = Thread.CurrentThread.CurrentUICulture;
string matchingstr = "";
string newstr = exmsg;
string resourcecollection = "";
Assembly a = e.GetType().Assembly;
ResourceManager rm = new ResourceManager(a.GetName().Name, a);
ResourceSet rsOriginal = rm.GetResourceSet(currentui, true, true);
ResourceSet rsTranslated = rm.GetResourceSet(new CultureInfo("en-US"), true, true);
foreach (DictionaryEntry item in rsOriginal)
{
if (exmsg.Contains(item.Value.ToString()))
{
if (item.Key.ToString() == "Word_At") // sometimes with spanish errors this replaces words containing the letters 'en' with …Run Code Online (Sandbox Code Playgroud)