【发布时间】:2013-03-25 10:15:54
【问题描述】:
所有,我有一个本地化的 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 框架来检测我是否有这种文化可用并使用它。这对于已安装的应用程序也失败了。
【问题讨论】:
-
您是否尝试过像 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 这样“手动”设置文化时会发生什么? ? Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");那它有用吗?
-
是的,我有。我已经更新了问题以反映这一点。感谢您的宝贵时间。