所有,我有一个本地化的 WinForms 应用程序。我创建了一个工具,用户能够在运行时更改应用程序所需的文化/语言。为了避免做任何花哨的事情,当用户确实想要更改文化时,系统会提示他们必须重新启动应用程序才能使文化更改生效(这是合理的,因为这不会经常发生)。然后,我将所需的新语言作为字符串存储在我的一个设置 XML 文件(“de-DE”、“en-US”、“en-GB”等)中。然后当应用程序重新启动时,如果需要,我切换到所需的文化:
// Main constructor.
public SqlEditorForm(string[] args)
{
// Load settings.
username = Environment.UserName;
userSettings = UserSettings.Instance();
advUserSettings = AdvanceUserSettings.Instance();
CheckChangeCurrentCulture();
isInitialising = true;
InitializeComponent();
...
}
private void CheckChangeCurrentCulture()
{
//if (!Debugger.IsAttached)
// Debugger.Launch();
if (advUserSettings.DefaultCulture)
return;
else
{
CultureInfo culture = new CultureInfo(advUserSettings.CustomCultureString);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
}
现在,当从 VS2012 以调试/发布模式运行时,这种机制可以正常工作。但是,当我在(运行 Windows 7 (x86/x64))各种机器上安装应用程序时,这种机制不再起作用,也就是说,文化不会从机器默认值切换。
我已将调试器附加到已安装的应用程序,并且正在调用更改文化的代码,并且逻辑似乎正在运行并且没有引发异常,但文化/语言没有改变。我已经对 SO 提出了很多问题,但找不到涵盖此特定问题的适用问题。
为什么这种机制在 VS2012 中有效,但不适用于已安装的应用程序?为了实现我想要的行为,我需要做什么?
谢谢你的时间。
请注意,我也尝试将调用替换为CheckChangeCurrentCulture();
:
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");
这也适用于 VS2012(调试和发布模式),但不适用于已安装的应用程序。我还将机器文化Start-> Control Panel->Region and Language更改为德语(“de-DE”),期望应用程序和 .NET 框架检测到我有可用的文化并使用它。对于已安装的应用程序,这也失败了。