强制异常语言为英语

44

我的Visual Studio 2005是法语版的,安装在法语操作系统上。 在调试或运行时收到的所有异常信息都是用法语呈现的。

我是否可以做一些事情,让异常信息是英语的?这样可以更好地进行搜索、讨论等。

我尝试了以下方法:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
throw new NullReferenceException();

获取的内容

对象引用未设置为对象的实例。

这很酷,但是由于我正在开发一个法语项目,我不想硬编码强制将 Thread.CurrentUICulture 设置为英语。我只想在我的本地机器上更改为英语,并且不更改项目属性。

是否可能在不修改应用程序代码的情况下设置异常语言?


在VS 2008中,将“工具”->“选项”->“环境”->“国际设置”->“语言”设置为 “English”,然后在抛出相同异常时获得法语的异常信息,但是: alt text http://lh4.ggpht.com/_1TPOP7DzY1E/S1V62xcvHAI/AAAAAAAAC7o/ckLDVFPKh5Y/s800/exception.png


2
我在使用英文版的Visual Studio时遇到了和德文版一样的问题,甚至编译器错误信息也是用德文本地化的(这使得在谷歌上搜索它们变得困难)。 - Christian Rodemeyer
@Christian:看一下这个网址https://dev59.com/EXRB5IYBdhLWcg3wF0HH,也许对你有帮助... - serhio
可能是C# - 异常信息使用英语?的重复问题。 - Andrej Adamenko
7个回答

15

在调试版本中,您可以将当前区域设置为仅英语:

#if DEBUG
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
#endif

10
这样做不会使得调试变得不可靠吗?项目的其他部分可能依赖于法国文化。 - Kobi
1
@Thomas:是的,但这个更改会影响所有其他代码用户。如果我的项目经理是一个老法国人,他会为此砍掉我的头 :) - serhio
2
@Kobi:大多数与文化相关的行为,如日期/时间/数字格式取决于CurrentCulture而不是CurrentUICulture。CurrentUICulture只影响使用哪些资源。如果除了法语以外的文化中没有卫星程序集可用的资源,它将仍然回退到默认文化。 - Thomas Levesque
2
@serhio:如果你将UI文化设置为配置设置,并仅在个人构建中将其配置为“en-US”,他可能不会砍掉你的头。 - Dirk Vollmar
1
@divo:是的,也许吧,但我确信他不会仅仅因为我想要用英语来表示异常而接受实际项目中的更改。 - serhio

6

为了所有将来使用你的应用程序的用户的利益,请将此代码放到Main方法中:

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

这将为他们节省很多麻烦,因为他们不再需要寻找翻译不准确的错误信息的英文对应内容。


5

1
@Hi-Angel 不是,它被关闭为“未修复”。在https://developercommunity.visualstudio.com/上找不到任何新条目。 - Louis Somers
@LouisSomers 我刚想起来,那是一种讽刺。虽然非常微妙,但我自己没有看出来。这可能是对微软在请求和错误方面的无知的参考(例如查看Skype问题)。 - Hi-Angel
@Hi-Angel,我正在尝试修复Github上的DotNet存储库。不幸的是,我没有时间自己修复它并请求合并,但也许有其他人可以? - Louis Somers
@LouisSomers 抱歉,我没有。我也有自己的事情要做:为LibreOffice添加一些重要功能(我甚至在考虑一个kickstarter项目;这是我目前正在研究的东西),在Gnome之外的Wayland合成器中添加主剪贴板,在enlightenment中读取类似i3的配置...这只是我脑海中的一些想法。即使这样看起来也需要很长时间。 - Hi-Angel
投票已经迁移到此处:https://developercommunity.visualstudio.com/idea/626664/get-rid-of-localised-exception-messages-by-choice.html(修复的机会仍然相当低) - Shaedar

4
最终的“尖锐”解决方案可能如下所示:
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

#if DEBUG
    // Add this; Change the Locales(En-US): Done.
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
#endif

    Application.Run(new Form1());
}

然而,我希望找到一个不需要对项目代码进行修改的解决方案。

来自MSDN:

如果应用程序没有明确指定CurrentUICulture,则会隐式设置CurrentUICulture属性。在Windows 2000和Windows XP多语言用户界面(MUI)产品上,如果最终用户可以设置默认语言,则CurrentUICulture会通过GetUserDefaultUILanguage函数进行设置。如果用户的UI语言未设置,则会将其设置为系统安装的语言,即操作系统资源的语言。

如果应用程序是基于Web的,则可以在应用程序代码中将CurrentUICulture显式设置为用户的浏览器接受的语言。


3

卸载法语语言包:

开始 - 控制面板 - 程序和功能 - Microsoft .NET Framework (4 Client Profile) 语言包 FRU - 卸载

您可能需要为找到的每个 .NET Framework 版本重复卸载操作。


2

对于任何遇到这个问题的Win8/8.1用户,安装英语语言包并将其设置为Windows显示语言似乎是解决问题的唯一简单方法,因为Win8在其核心中内置了.NET框架。

可能对于Win10也是一样的。


如果你只有一个语言的Windows版本,并且不是英语,那就不那么容易了。 - Blush
如果你只有一个语言版本的Windows,并且不是英语,那就不那么容易了。 - undefined

0

我没有尝试过,但根据文档,该属性应默认设置为当前在控制面板中设置的UI语言。因此,根据您的国际设置,它应该可以自动正确地工作。


你所说的“当前 UI 语言”是什么意思?我的操作系统是法语版(例如,“开始”按钮的名称为“Démarrer”),因此默认情况下 CultureInfo.CurrentCulture.Name == "fr-FR" - serhio
在“控制面板”中,我将“区域和语言选项” => “标准和格式”更改为“英语美国”,但这并没有帮助。 - serhio
@Matteo:你说的部分正确。我改变了“标准和格式”,这确实改变了 CurrentCulture,但没有改变线程的 CurrentUICultureCurrentCulture 改变成了 en-US,但 Thread.CurrentThread.CurrentUICulture 仍然是 fr-FR - serhio
我认为只有在拥有MUI版本的Windows时,您才能在区域设置中更改UICulture。我认为该设置位于“区域和语言选项/语言/菜单和对话框中使用的语言”(在XP上)。 - Joe
我没有尝试过Windows 7,但据我记得,.NET Framework与Windows分别进行本地化,并且各种语言包可以在每台计算机上免费安装,因此将CurrentUICulture设置为所需的语言应该适用于每台具有所需语言包的计算机(通常每台计算机都有英文的“普通”框架加上本地语言包)。 - Matteo Italia
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接