【问题标题】:Changing Application Culture at Runtime Failure在运行时失败时更改应用程序文化
【发布时间】: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");那它有用吗?
  • 是的,我有。我已经更新了问题以反映这一点。感谢您的宝贵时间。

标签: c# winforms culture


【解决方案1】:

也许在您的生产机器上,由于某种原因无法加载新文化的卫星程序集,因此您的应用程序会退回到中性文化。

使用 Microsoft sysinternals Process Monitor 工具检查卫星程序集文件访问是否失败。

您还可以使用 .NET fuslog 工具检查http://msdn.microsoft.com/en-us/library/e74a18c4.aspx

【讨论】:

  • +1 好答案。这个实用程序告诉我我的问题到底是什么!非常感谢您的宝贵时间...
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 2014-01-22
相关资源
最近更新 更多