Справка по локализации фонового рабочего процесса .Net

Я испытываю какое-то странное поведение с локализованными сообщениями, о которых сообщает мой фоновый рабочий процесс в моем приложении Windows Forms.

Приложение представляет собой установочное приложение с формами Windows. Приложение запускает фоновый рабочий процесс для выполнения сброса IIS и установки MSI.

В первый раз, когда я запускаю приложение на испанской виртуальной машине Win Server 2003, формы на испанском языке, но не сообщения BWP. Если я немедленно запущу его снова, сообщения будут на испанском языке.

Файлы .Resources являются встроенными ресурсами и извлекаются во временный каталог при запуске приложения.

Мой код извлекает локализованные строки через пользовательский класс диспетчера ресурсов. Этот класс создает файловый ресурс для файлов .Resources во временном каталоге. Это работает правильно, потому что метки и заголовок форм окон каждый раз локализуются.

Кто-нибудь испытал это? Я совсем застрял, пожалуйста, помогите. Спасибо, Эндрю


person Andrew Milsark    schedule 09.10.2008    source источник
comment
Прошло некоторое время с тех пор, как я задал этот вопрос, но я считаю, что решение заключалось в том, чтобы сначала извлечь файлы ресурсов во временный каталог Windows, прежде чем запускать BWP, и использовать CurrentUICulture для сообщений.   -  person Andrew Milsark    schedule 19.11.2008


Ответы (2)


Если ваш UIThread запускает другой UICulture, чем ваш BackgroundWorker, вы можете явно изменить культуру рабочего потока, используя обратный вызов, подобный этому:

        private delegate CultureInfo GetUICultureCallback();

        private CultureInfo GetUICulture()
        {
            if (this.InvokeRequired)
            {
                return (CultureInfo)this.Invoke(new GetUICultureCallback(GetUICulture));
            }

            return System.Threading.Thread.CurrentThread.CurrentUICulture;
        }

        void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = GetUICulture();

            for (; ; )
            {
                if (backgroundWorker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
.
.
.
person Maik Preuss    schedule 17.01.2012

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

http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture.aspx

http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture.aspx

Однако я не уверен, какова рекомендуемая практика передачи информации о культуре между потоками.

person Brian    schedule 10.10.2008