C# Thread.CurrentThread.CurrentUICulture工作不一致

C# Thread.CurrentThread.CurrentUICulture工作不一致,c#,.net,multithreading,globalization,currentuiculture,C#,.net,Multithreading,Globalization,Currentuiculture,我周末一直在做一个宠物项目,以了解更多关于C#的知识,在处理本地化问题时遇到了一个奇怪的问题。更具体地说,我遇到的问题是System.Threading.Thread.CurrentThread.CurrentUICulture 我已经设置了我的应用程序,用户可以通过单击菜单项快速更改应用程序的语言。该菜单项依次将该语言的两个字母代码(例如“en”、“fr”等)保存在名为“language”的用户设置中,然后重新启动应用程序 Properties.Settings.Default.Languag

我周末一直在做一个宠物项目,以了解更多关于C#的知识,在处理本地化问题时遇到了一个奇怪的问题。更具体地说,我遇到的问题是System.Threading.Thread.CurrentThread.CurrentUICulture

我已经设置了我的应用程序,用户可以通过单击菜单项快速更改应用程序的语言。该菜单项依次将该语言的两个字母代码(例如“en”、“fr”等)保存在名为“language”的用户设置中,然后重新启动应用程序

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();
启动应用程序时,表单构造函数中的第一行代码(甚至在InitializeComponent()之前)从设置中获取语言字符串,并设置CurrentUICulture,如下所示:

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    InitializeComponent();
}
问题是,这并不总是有效的。有时,所有这些都可以正常工作,应用程序根据保存在设置文件中的字符串加载正确的语言。其他时候,情况并非如此,应用程序重新启动后,语言保持不变

起初,我认为在重新启动应用程序之前没有保存语言,但事实绝对不是这样。当正确的语言无法加载时,如果我关闭应用程序并再次运行它,正确的语言将正确出现。因此,这意味着语言字符串已保存,但表单构造函数中的CurrentUICulture赋值有时没有效果

有什么帮助吗?在C#中线程是如何工作的,我还缺少什么吗?这可能是特定于机器的,所以如果有什么不同,我使用的是奔腾双核CPU

更新

Vlad让我检查CurrentThread的CurrentUICulture是什么。因此,我在构造函数中添加了一个MessageBox,告诉我CurrentUICulture两个字母的代码是什么,以及我的语言用户字符串的值

MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));
加载错误的语言时,语言字符串和CurrentUICulture都使用错误的语言。所以我想当前的UICulture已经被清除了,我的问题实际上是语言设置


因此,我想问题在于,我的应用程序有时会加载以前保存的语言字符串,而不是上次保存的语言字符串。如果重新启动应用程序,它将加载实际保存的语言字符串。

能否检查线程的
CurrentUICulture

我记得有过像你这样的问题;通过重新加载包含要本地化的字符串的资源字典解决了此问题:

Thread.CurrentThread.CurrentUICulture = <new culture>;
ResourceDictionary newDict = new ResourceDictionary();
newDict.Source = localizedStrings.Source;
localizedStrings = newDict;
Thread.CurrentThread.CurrentUICulture=;
ResourceDictionary newDict=newResourceDictionary();
newDict.Source=localizedStrings.Source;
本地化字符串=newDict;

(这种方法也可以动态工作;提供了更多信息)。

您能检查一下线程的
CurrentUICulture
是什么吗

我记得有过像你这样的问题;通过重新加载包含要本地化的字符串的资源字典解决了此问题:

Thread.CurrentThread.CurrentUICulture = <new culture>;
ResourceDictionary newDict = new ResourceDictionary();
newDict.Source = localizedStrings.Source;
localizedStrings = newDict;
Thread.CurrentThread.CurrentUICulture=;
ResourceDictionary newDict=newResourceDictionary();
newDict.Source=localizedStrings.Source;
本地化字符串=newDict;
(这种方法也可以动态工作;提供了更多信息)。

您可以通过关闭打开的表单并重新创建它们来简单地“重置”应用程序。然后,您可以在用户更改设置时直接设置区域性

此外,请尝试提供一些调试输出,以便查看正在设置的值以及区域性是否符合您的预期

编辑:我的猜测:由于数据必须写入文件,然后从该文件加载,因此您可能重新启动太快,无法完成写入操作。

您可以通过关闭打开的表单并重新创建表单来“重置”应用程序。然后,您可以在用户更改设置时直接设置区域性

此外,请尝试提供一些调试输出,以便查看正在设置的值以及区域性是否符合您的预期


编辑:我的猜测:由于数据必须写入文件,然后从该文件加载,因此重新启动可能太快,无法完成写入。

我也遇到了同样的问题。我发现Application.Restart()并不是真正的完全重启,请参阅

因此Application.Restart()不调用表单构造函数中的初始化内容 与InitializeComponent()类似,“应用程序在最初运行的上下文中重新启动”的次数越多

所以你的代码是正确的

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    //...
    InitializeComponent();
}
但在
Application.Restart()。如果您关闭应用程序并再次打开,则会使用您的(新)设置


因此,我们必须找到一种方法来再次初始化表单,以实现新的语言设置。

我也遇到了同样的问题。我发现Application.Restart()并不是真正的完全重启,请参阅

因此Application.Restart()不调用表单构造函数中的初始化内容 与InitializeComponent()类似,“应用程序在最初运行的上下文中重新启动”的次数越多

所以你的代码是正确的

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    //...
    InitializeComponent();
}
但在
Application.Restart()。如果您关闭应用程序并再次打开,则会使用您的(新)设置


因此,我们必须找到一种方法来再次初始化表单,以进行新的语言设置。

通过使用CurrentThread.CurrentUICulture,然后更改表单,您无需重新启动应用程序。通过使用CurrentThread.CurrentUICulture引用我的旧帖子,然后更改表单,无需重新启动应用程序。参考我的旧帖子,您可以手动更改当前表单的语言,如下所示:

CultureInfo cInfo = new CultureInfo("en-US");
ResourceManager rm = new ResourceManager(GetType());

// For each control on the form, perform the translation manually (probably better in a loop)
control1.Text = rm.GetString(control1.Name + ".Text", cInfo);

// Now set the culture for all other dialogs
Thread.CurrentThread.CurrentUICulture = cInfo;

希望有帮助

您可以手动更改当前表单的语言,如下所示:

CultureInfo cInfo = new CultureInfo("en-US");
ResourceManager rm = new ResourceManager(GetType());

// For each control on the form, perform the translation manually (probably better in a loop)
control1.Text = rm.GetString(control1.Name + ".Text", cInfo);

// Now set the culture for all other dialogs
Thread.CurrentThread.CurrentUICulture = cInfo;

希望有帮助

真的有必要重新开始吗