Создание темы для установки CurrentCulture

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

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

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

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

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

EDIT: Я нашел этот вопрос, который аналогичен, но ответа не найдено.

3 ответа

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

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


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

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


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

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

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

Thread newThread = MyThreadFactory.getThread();

licensed under cc by-sa 3.0 with attribution.