我们通过将Exception.Message写入文件来记录系统中发生的任何异常.但是,它们是在客户的文化中写成的.而土耳其的错误对我来说意义不大.
那么如何在不改变用户文化的情况下用英语记录任何错误消息呢?
我正在尝试本地化我的程序,但我希望发送给开发人员的错误消息以英文显示.我无法找到一种方法来实现这一点,因为似乎如果在抛出错误时将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)