Получение локализованных строк из файлов языковых ресурсов в потоке фонового рабочего - PullRequest
4 голосов
/ 14 апреля 2011

Я разрабатываю приложение, которое локализовано, имеет многоязычный интерфейс. Для этого я использую локализуемые функции winform, а также ресурсы языковых строк. Пока все хорошо, работает отлично.

Проблема возникает, когда мне нужно попытаться получить локализованную строку внутри фонового рабочего процесса: он не может использовать текущую культуру пользовательского интерфейса, но вместо этого используется по умолчанию. Метод GetString в ResourceManager возвращает строку языка по умолчанию, а не строку CurrentUICulture. Обратите внимание, что он отлично работает в основном потоке, проблема внутри backgroundworker.

Итак, как я могу получить свои локализованные строки - на основе текущей культуры пользовательского интерфейса - из файлов языковых ресурсов в потоке фонового рабочего?

Среда: .net4, c #, Visual Studio 2010.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011

Вам необходимо установить свойства Thread.CurrentCulture и Thread.CurrentUICulture в фоновом потоке, чтобы они соответствовали свойствам потока переднего плана. Это должно быть сделано в начале кода, который выполняется в фоновом потоке.

2 голосов
/ 23 апреля 2015

Несмотря на то, что принятый ответ на этот вопрос является абсолютно правильным, я хотел бы дополнить его тем, что я узнал после локализации довольно большой системы.

Настройка 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 и все готово.

...