从后台工作线程中的语言资源文件中获取本地化字符串

时间:2011-04-14 19:56:49

标签: c# backgroundworker culture localized

我开发了一个本地化的应用程序,具有多语言界面。为此,我使用winform的localazible功能和语言字符串资源。到目前为止一切顺利,它完美无缺。

问题出现了,当我不得不尝试在后台工作进程中获取本地化字符串时:它不能使用当前的UI文化,而是默认使用。 ResourceManager的GetString方法返回默认语言字符串,而不是CurrentUICulture的字符串。注意,它在主线程中完美运行,问题出在backgroundworker中。

那么,如何从后台工作线程中的语言资源文件中获取基于当前ui文化的本地化字符串?

环境:.net4,c#,Visual Studio 2010。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您需要在后台线程上设置Thread.CurrentCulture和Thread.CurrentUICulture属性以匹配前台线程的属性。这应该在后台线程上运行的代码的开头完成。

答案 1 :(得分:2)

尽管对这个问题的接受答案是绝对正确的,但我想用必须本地化一个相当大的系统后学到的东西来补充它。

每次需要使用Thread.CurrentCulture时设置Thread.CurrentUICultureBackgroundWorker可能非常容易出错且难以维护,特别是如果您在几个不同的部分执行此操作系统的。为避免这种情况,您可以创建一个继承自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,您就可以了。