我开发了一个本地化的应用程序,具有多语言界面。为此,我使用winform的localazible功能和语言字符串资源。到目前为止一切顺利,它完美无缺。
问题出现了,当我不得不尝试在后台工作进程中获取本地化字符串时:它不能使用当前的UI文化,而是默认使用。 ResourceManager的GetString方法返回默认语言字符串,而不是CurrentUICulture的字符串。注意,它在主线程中完美运行,问题出在backgroundworker中。
那么,如何从后台工作线程中的语言资源文件中获取基于当前ui文化的本地化字符串?
环境:.net4,c#,Visual Studio 2010。
提前致谢!
答案 0 :(得分:4)
您需要在后台线程上设置Thread.CurrentCulture和Thread.CurrentUICulture属性以匹配前台线程的属性。这应该在后台线程上运行的代码的开头完成。
答案 1 :(得分:2)
尽管对这个问题的接受答案是绝对正确的,但我想用必须本地化一个相当大的系统后学到的东西来补充它。
每次需要使用Thread.CurrentCulture
时设置Thread.CurrentUICulture
和BackgroundWorker
可能非常容易出错且难以维护,特别是如果您在几个不同的部分执行此操作系统的。为避免这种情况,您可以创建一个继承自BackgroundWorker
的简单类,并始终在运行代码之前设置文化:
public class LocalizedBackgroundWorker : BackgroundWorker {
private readonly CultureInfo currentCulture;
public LocalizedBackgroundWorker() {
currentCulture = /* Get your current culture somewhere */
}
protected override void OnDoWork(DoWorkEventArgs e) {
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
base.OnDoWork(e);
}
}
现在只需使用LocalizedBackgroundWorker
课程代替BackgroundWorker
,您就可以了。