在运行时失败时改变应用程序文化

时间:2013-03-25 10:15:55

标签: c# winforms culture

全部,我有一个本地化的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))各种机器上安装应用程序时,这种机制不再起作用,也就是说文化不会从机器默认的EVER切换。

我已将调试器附加到已安装的应用程序,并且正在调用用于更改文化的代码,并且逻辑似乎正在运行且不会抛出任何异常,但文化/语言不会更改。我在SO上遇到了很多问题,但找不到涵盖这一特定问题的适用问题。

为什么这个机制可以在VS2012上运行,但不适用于已安装的应用程序?为了达到我想要的行为,我需要做些什么?

感谢您的时间。

注意,我还尝试将调用替换为CheckChangeCurrentCulture();

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");

也适用于VS2012(调试和发布模式),但不适用于已安装的应用程序。我也改变了机器文化开始 - > 控制面板 - > 区域和语言到德语(“de-DE”)期望应用程序和.NET框架检测我有可用的文化并使用它。对于已安装的应用程序,这也失败了。

1 个答案:

答案 0 :(得分:1)

也许在你的生产机器上,新文化的卫星装配由于某种原因无法加载,因此你的应用又回归到中性文化。

使用Microsoft sysinternals进程监视工具检查未成功的附属程序集文件访问。

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

进行检查