1

所有,我有一个本地化的 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 框架检测到我有可用的文化并使用它。对于已安装的应用程序,这也失败了。

4

1 回答 1

1

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

使用 Microsoft sysinternals Process Monitor 工具检查不成功的卫星程序集文件访问。

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

于 2013-03-27T16:02:51.013 回答