Событие создания потока для настройки CurrentCulture - PullRequest
4 голосов
/ 24 декабря 2008

Наше приложение позволяет пользователю изменять культуру, в которой он работает, и эта культура может отличаться от базовой культуры ОС. Единственный способ сделать это - установить Thread.CurrentThread.CurrentCulture и Thread.CurrentThread.CurrentUICulture для каждого потока.

Единственная проблема с этим заключается в том, что мы должны установить культуру для каждого потока, и мы должны помнить, чтобы делать это всякий раз, когда мы создаем новый поток. Если вы установите поток в другой культуре, а затем создадите новый поток, он получит культуру ОС, а не потока, который его создал.

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

  1. Установите культуру на уровне приложения, чтобы все потоки по умолчанию соответствовали этой культуре. Возможно ли это?
  2. Есть ли где-нибудь событие создания потока, на которое я могу подписаться? Таким образом, я могу настроить один обработчик для установки культуры при создании потока.

Любые идеи или помощь будут приветствоваться, даже если мне нужно PInvoke до Win32 API. Заранее спасибо.

РЕДАКТИРОВАТЬ: Я нашел этот вопрос , который похож, но ответ не был найден.

Ответы [ 4 ]

1 голос
/ 24 декабря 2008
  1. Вы можете поместить все свои файлы логики и статических ресурсов в слой UI / Presentation и беспокоиться только о культуре потока пользовательского интерфейса (при условии, что приложение Desktop здесь). Это будет включать любые переводы, которые находятся в файлах ресурсов, любое форматирование с учетом культуры и т. Д.
  2. Если первая идея не может быть реализована, вы можете создать класс помощника потока, который устанавливает для вас культуру при создании долго работающих потоков. Вам также нужно будет установить культуру всех потоков пула потоков.

Культура является концепцией, ориентированной на потоки в Windows, а потоки в Windows на самом деле не зависят от процесса или домена приложения. Не существует уровня абстракции между потоком и ОС, в которой хранится информация о культуре (о которой я знаю), поэтому вы должны установить ее в каждом потоке.

1 голос
/ 01 мая 2014

Два новых свойства были добавлены в класс CultureInfo в .NET 4.5, которые решают эту проблему, DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture .

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

1 голос
/ 24 декабря 2008

Не может быть точным решением, но как насчет создания класса, отвечающего за создание вашего потока?

class MyThreadFactory
{
    public static Thread getThread()
    {
        Thread a = new Thread(..);
        a.CurrentCulture = xxxx;
        return a;
    }
}

Использование:

Thread newThread = MyThreadFactory.getThread();
0 голосов
/ 02 мая 2018

Просто чтобы добавить в ответ @Rob Prouse. Вот быстрая демонстрация.

  1. Настройка культуры при инициализации приложения:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      {
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       }
    
  2. Использование информации о культуре в моем .ToString ().

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)
    
...