我一直在周末从事一个宠物项目,以了解有关C#的更多信息,并在使用本地化时遇到了一个奇怪的问题。更具体地说,我遇到的问题是system.threading.thread.currentthread.currentuiculture。

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

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

启动应用程序后,表单构造函数中的第一行代码(甚至在initializecomponent()之前)从设置中获取语言字符串,并像这样设置了当前的文化:

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    InitializeComponent();
}

事实是,这并不始终如一。有时,所有操作都可以很好地工作,并且应用程序会根据“设置文件”中保存的字符串加载正确的语言。其他时候,它不会,并且在应用程序重新启动后,语言保持不变。

起初,我认为在重新启动应用程序之前没有保存语言,但绝对不是这种情况。当正确的语言无法加载时,如果我要关闭应用程序并再次运行该应用程序,则正确的语言会正确出现。因此,这意味着语言字符串已被保存,但是我的形式构造函数中的当前文化分配有时没有效果。

有帮助吗?我是否缺少线程在C#中的工作方式?这可能是机器特定的,因此,如果有任何区别,我使用的是Pentium Dual Core CPU。

更新

弗拉德(Vlad)要求我检查CurrentThread的Currentululture是什么。因此,我在构造函数上添加了一个消息框,以告诉我当前的文化两个字母代码以及我的语言用户字符串的值。

MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));

当加载错误的语言时,语言字符串和当前文化都有错误的语言。因此,我想当前的文化已被清除,我的问题实际上是在语言设置上。

所以我想问题是我的申请 有时 加载先前保存的语言字符串,而不是最后保存的语言字符串。如果该应用重新启动,则将加载实际保存的语言字符串。

有帮助吗?

解决方案

我有同样的问题。我发现了application.restart()并不是真正重新启动,请参阅 MSDN.

因此,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(). 。如果您关闭应用程序并再次打开它,则将使用(新)设置。

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

其他提示

你能检查你的线程是什么吗 CurrentUICulture?

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

Thread.CurrentThread.CurrentUICulture = <new culture>;
ResourceDictionary newDict = new ResourceDictionary();
newDict.Source = localizedStrings.Source;
localizedStrings = newDict;

(这种方法也动态起作用; 这里 是更多信息)。

您可以手动更改与此类似的当前形式的语言:

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;

希望有帮助!

您可以简单地通过关闭开放表格并重新创建它们来“重置”您的应用程序。然后,当用户更改设置时,您可以直接设置文化。

另外,尝试给出一些调试输出,以便您看到设置什么值以及文化是否实际上是您期望的。

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

通过使用currentThread.currentuiculture,然后更改表单,您无需重新启动应用程序。裁判我的旧帖子 这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top