Есть ли способ установить культуру для всего приложения? Все текущие темы и новые темы?
У нас есть имя культуры, хранящееся в базе данных, и когда наше приложение запускается, мы делаем
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Но, конечно, это «теряется», когда мы хотим что-то сделать в новом потоке. Есть ли способ установить это CurrentCulture
и CurrentUICulture
для всего приложения? Так что новые темы также получают эту культуру? Или происходит какое-то событие при создании нового потока, к которому я могу подключиться?
c#
multithreading
cultureinfo
Svish
источник
источник
Ответы:
В .NET 4.5 вы можете использовать это
CultureInfo.DefaultThreadCurrentCulture
свойство, чтобы изменить культуру домена приложений.Для версий до 4.5 вы должны использовать отражение, чтобы манипулировать культурой домена приложений. Есть частное статическое поле на
CultureInfo
(m_userDefaultCulture
в .NET 2.0 mscorlib,s_userDefaultCulture
в .NET 4.0 mscorlib), которое управляет тем, чтоCurrentCulture
возвращается, если поток не установил это свойство для себя.Это не меняет локали нативного потока, и, вероятно, не стоит отправлять код, который меняет культуру таким образом. Это может быть полезно для тестирования, хотя.
источник
Это часто спрашивают. В принципе, нет, не для .NET 4.0. Вы должны сделать это вручную в начале каждого нового потока (или
ThreadPool
функции). Возможно, вы можете сохранить название культуры (или просто объект культуры) в статическом поле, чтобы избежать необходимости попадания в БД, но это все.источник
Если вы используете ресурсы, вы можете вручную форсировать их:
В диспетчере ресурсов есть автоматически сгенерированный код, который выглядит следующим образом:
Теперь каждый раз, когда вы ссылаетесь на вашу отдельную строку в этом ресурсе, он переопределяет культуру (поток или процесс) с указанным resourceCulture.
Вы можете указать язык как «fr», «de» и т. Д., Либо указать код языка как 0x0409 для en-US или 0x0410 для it-IT. Для полного списка кодов языков, пожалуйста, обратитесь к: Идентификаторы языка и локали
источник
Resource1.Culture = Null;
Для .net 4.5 и выше вы должны использовать
источник
На самом деле вы можете установить культуру потоков по умолчанию и культуру пользовательского интерфейса, но только с Framework 4.5+
Я вставил в этот статический конструктор
и установите точку останова в методе Convert объекта ValueConverter, чтобы увидеть, что получено на другом конце. CultureInfo.CurrentUICulture перестал быть en-US и вместо этого стал en-AU с моим маленьким хакером, чтобы он учитывал региональные настройки для ShortTimePattern.
Ура, все хорошо на свете! Или не. Параметр культуры, переданный методу Convert, по- прежнему используется в США. Хм, WTF ?! Но это начало. По крайней мере, так
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
будет использовать ваши индивидуальные региональные настройкиЕсли вы не можете использовать версию 4.5 платформы, то откажитесь от установки CurrentUICulture как статического свойства CultureInfo и установите его как статическое свойство одного из ваших собственных классов. Это не исправит поведение по умолчанию для string.Format или заставит StringFormat работать должным образом в привязках, затем обойдёт логическое дерево вашего приложения, чтобы воссоздать все привязки в вашем приложении и установить их культуру конвертера.
источник
Для ASP.NET5, т.е. ASPNETCORE, вы можете сделать следующее в
configure
:Вот серия постов в блоге, которые дают больше информации.
источник
Этот ответ является небольшим дополнением к великолепному ответу @ rastating. Вы можете без проблем использовать следующий код для всех версий .NET:
источник
DefaultThreadCurrentCulture
иDefaultThreadCurrentUICulture
присутствуют в Framework 4.0, но они являются частными. Используя Reflection, вы можете легко установить их. Это повлияет на все потоки, гдеCurrentCulture
явно не установлено (также запущенные потоки).источник
Вот решение для c # MVC:
Сначала: создайте пользовательский атрибут и переопределите метод следующим образом:
Второе: в App_Start найдите FilterConfig.cs, добавьте этот атрибут. (это работает для всего приложения)
Это оно !
Если вы хотите определить культуру для каждого контроллера / действия вместо всего приложения, вы можете использовать этот атрибут следующим образом:
Или:
источник
Рабочее решение для установки CultureInfo для всех потоков и окон.
источник