Gibt es eine Möglichkeit, die Kultur für eine gesamte Anwendung festzulegen? Alle aktuellen Threads und neuen Threads?
Wir haben den Namen der Kultur in einer Datenbank gespeichert, und wenn unsere Anwendung startet, tun wir dies
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Aber dies geht natürlich "verloren", wenn wir etwas in einem neuen Thread tun wollen. Gibt es eine Möglichkeit, dies CurrentCulture
und CurrentUICulture
für die gesamte Anwendung einzustellen? Damit neue Threads auch diese Kultur bekommen? Oder wird ein Ereignis ausgelöst, wenn ein neuer Thread erstellt wird, an den ich mich anschließen kann?
c#
multithreading
cultureinfo
Svish
quelle
quelle
Antworten:
In .NET 4.5 können Sie die
CultureInfo.DefaultThreadCurrentCulture
Eigenschaft verwenden, um die Kultur einer AppDomain zu ändern.Für Versionen vor 4.5 müssen Sie Reflection verwenden, um die Kultur einer AppDomain zu manipulieren. Es gibt ein privates statisches Feld in
CultureInfo
(m_userDefaultCulture
in .NET 2.0 mscorlib,s_userDefaultCulture
in .NET 4.0 mscorlib), das steuert, wasCurrentCulture
zurückgegeben wird, wenn ein Thread diese Eigenschaft nicht für sich selbst festgelegt hat.Dies ändert das native Thread-Gebietsschema nicht und es ist wahrscheinlich keine gute Idee, Code zu versenden, der die Kultur auf diese Weise ändert. Es kann jedoch zum Testen nützlich sein.
quelle
Das wird oft gefragt. Grundsätzlich gibt es keine, nicht für .NET 4.0. Sie müssen dies manuell zu Beginn jedes neuen Threads (oder jeder neuen
ThreadPool
Funktion) tun . Sie könnten vielleicht den Kulturnamen (oder nur das Kulturobjekt) in einem statischen Feld speichern, um zu vermeiden, dass Sie die Datenbank treffen müssen, aber das war es auch schon.quelle
Wenn Sie Ressourcen verwenden, können Sie diese manuell erzwingen, indem Sie:
Im Ressourcenmanager gibt es einen automatisch generierten Code, der wie folgt lautet:
Jedes Mal, wenn Sie auf Ihre individuelle Zeichenfolge in dieser Ressource verweisen, wird die Kultur (Thread oder Prozess) mit der angegebenen Ressourcenkultur überschrieben.
Sie können entweder die Sprache wie in "fr", "de" usw. angeben oder den Sprachcode wie in 0x0409 für en-US oder 0x0410 für it-IT eingeben. Eine vollständige Liste der Sprachcodes finden Sie unter: Sprachkennungen und Gebietsschemas
quelle
Resource1.Culture = Null;
Für .net 4.5 und höher sollten Sie verwenden
quelle
Eigentlich Sie können die Standard - Thread Kultur und UI - Kultur gesetzt, sondern nur mit Rahmen 4.5+
Ich habe diesen statischen Konstruktor eingefügt
und setzen Sie einen Haltepunkt in die Convert-Methode eines ValueConverter, um zu sehen, was am anderen Ende angekommen ist. CultureInfo.CurrentUICulture war nicht mehr en-US und wurde stattdessen en-AU mit meinem kleinen Hack, um die regionalen Einstellungen für ShortTimePattern zu berücksichtigen.
Hurra, alles ist gut in der Welt! Oder nicht. Der an die Convert-Methode übergebene Kulturparameter ist weiterhin en-US. Ähm, WTF?! Aber es ist ein Anfang. Zumindest so
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
verwendet Ihre benutzerdefinierten regionalen EinstellungenWenn Sie Version 4.5 des Frameworks nicht verwenden können, geben Sie das Festlegen von CurrentUICulture als statische Eigenschaft von CultureInfo auf und legen Sie es als statische Eigenschaft einer Ihrer eigenen Klassen fest. Dadurch wird das Standardverhalten von string.Format nicht behoben oder StringFormat funktioniert ordnungsgemäß in Bindungen. Gehen Sie dann durch den logischen Baum Ihrer App, um alle Bindungen in Ihrer App neu zu erstellen und ihre Konverterkultur festzulegen.
quelle
Für ASP.NET5, dh ASPNETCORE, können Sie Folgendes tun
configure
:Hier ist eine Reihe von Blog-Posts , die weitere Informationen enthalten.
quelle
Diese Antwort ist eine kleine Erweiterung für die großartige Antwort von @ rastating. Sie können den folgenden Code für alle Versionen von .NET ohne Bedenken verwenden:
quelle
DefaultThreadCurrentCulture
undDefaultThreadCurrentUICulture
sind auch in Framework 4.0 vorhanden, aber sie sind privat. Mit Reflection können Sie sie einfach einstellen. Dies betrifft alle Threads, dieCurrentCulture
nicht explizit festgelegt sind (auch das Ausführen von Threads).quelle
Hier ist die Lösung für c # MVC:
Erstens: Erstellen Sie ein benutzerdefiniertes Attribut und überschreiben Sie die Methode wie folgt:
Zweitens: Suchen Sie in App_Start nach FilterConfig.cs und fügen Sie dieses Attribut hinzu. (Dies funktioniert für die gesamte Anwendung)
Das ist es !
Wenn Sie anstelle der gesamten Anwendung eine Kultur für jeden Controller / jede Aktion definieren möchten, können Sie dieses Attribut wie folgt verwenden:
Oder:
quelle
Arbeitslösung zum Festlegen von CultureInfo für alle Threads und Fenster.
quelle