Czy istnieje sposób na ustalenie kultury dla całej aplikacji? Wszystkie aktualne i nowe wątki?
Mamy nazwę kultury przechowywanej w bazie danych i po uruchomieniu naszej aplikacji tak
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Ale oczywiście to się „gubi”, gdy chcemy coś zrobić w nowym wątku. Czy istnieje sposób na ustawienie tego CurrentCulture
i CurrentUICulture
dla całej aplikacji? Czy więc nowe wątki również otrzymują tę kulturę? A może jest to jakieś zdarzenie uruchamiane za każdym razem, gdy tworzony jest nowy wątek, do którego mogę się podłączyć?
c#
multithreading
cultureinfo
Svish
źródło
źródło
Odpowiedzi:
W .NET 4,5 można użyć
CultureInfo.DefaultThreadCurrentCulture
właściwości, aby zmienić kulturę AppDomain.W przypadku wersji wcześniejszych niż 4,5 musisz użyć odbicia, aby manipulować kulturą AppDomain. Istnieje prywatne pole statyczne
CultureInfo
(m_userDefaultCulture
w .NET 2.0 mscorlib,s_userDefaultCulture
w .NET 4.0 mscorlib), które kontroluje, co jestCurrentCulture
zwracane, jeśli wątek nie ustawił tej właściwości na sobie.Nie zmienia to rodzimych ustawień regionalnych wątku i prawdopodobnie nie jest dobrym pomysłem wysyłanie kodu, który zmienia kulturę w ten sposób. Może być jednak przydatne do testowania.
źródło
To jest często zadawane. Zasadniczo nie, nie ma, nie dla .NET 4.0. Musisz to zrobić ręcznie na początku każdego nowego wątku (lub
ThreadPool
funkcji). Być może możesz przechowywać nazwę kultury (lub tylko obiekt kultury) w polu statycznym, aby zaoszczędzić konieczności trafiania do bazy danych, ale to wszystko.źródło
Jeśli korzystasz z zasobów, możesz wymusić to ręcznie:
W menedżerze zasobów znajduje się automatycznie generowany kod, który wygląda następująco:
Teraz za każdym razem, gdy odwołujesz się do indywidualnego ciągu w tym zasobie, zastępuje on kulturę (wątek lub proces) określonym resourceCulture.
Możesz określić język jako „fr”, „de” itp. Lub wprowadzić kod języka jako 0x0409 dla en-US lub 0x0410 dla it-IT. Aby uzyskać pełną listę kodów języków, zobacz: Identyfikatory języków i ustawienia regionalne
źródło
Resource1.Culture = Null;
W przypadku .net 4.5 i nowszych należy użyć
źródło
W rzeczywistości można ustawić domyślną kulturę wątku i kulturę interfejsu użytkownika, ale tylko w przypadku Framework 4.5+
Wstawiłem ten statyczny konstruktor
i umieść punkt przerwania w metodzie Convert elementu ValueConverter, aby zobaczyć, co dotarło na drugi koniec. CultureInfo.CurrentUICulture przestało być en-US i stało się en-AU kompletne z moim małym hackem, aby respektować ustawienia regionalne dla ShortTimePattern.
Hurra, wszystko jest dobrze na świecie! Albo nie. Parametr kultury przekazany do metody Convert jest nadal en-US. Erm, WTF ?! Ale to początek. Przynajmniej w ten sposób
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
użyje Twoich niestandardowych ustawień regionalnychJeśli nie możesz użyć wersji 4,5 struktury, zrezygnuj z ustawienia CurrentUICulture jako statycznej właściwości CultureInfo i ustaw ją jako statyczną właściwość jednej z własnych klas. Nie naprawi to domyślnego zachowania string.Format lub spraw, aby StringFormat działał poprawnie w powiązaniach, a następnie przejdź przez drzewo logiczne aplikacji, aby odtworzyć wszystkie powiązania w aplikacji i ustawić ich kulturę konwertera.
źródło
W przypadku ASP.NET5, czyli ASPNETCORE, możesz wykonać następujące czynności w
configure
:Oto seria postów na blogu, które zawierają więcej informacji.
źródło
Ta odpowiedź jest trochę rozwinięciem wspaniałej odpowiedzi @ rastating. Możesz bez obaw użyć następującego kodu dla wszystkich wersji .NET:
źródło
DefaultThreadCurrentCulture
iDefaultThreadCurrentUICulture
są również obecne w Framework 4.0, ale są prywatne. Korzystając z Odbicia możesz łatwo je ustawić. Wpłynie to na wszystkie wątki, w którychCurrentCulture
nie jest to jawnie ustawione (również na uruchamiane wątki).źródło
Oto rozwiązanie dla języka C # MVC:
Po pierwsze: utwórz atrybut niestandardowy i zastąp metodę w następujący sposób:
Po drugie: w App_Start znajdź FilterConfig.cs, dodaj ten atrybut. (to działa dla CAŁEJ aplikacji)
Otóż to !
Jeśli chcesz zdefiniować kulturę dla każdego kontrolera / akcji zamiast całej aplikacji, możesz użyć tego atrybutu w następujący sposób:
Lub:
źródło
Rozwiązanie robocze do ustawiania CultureInfo dla wszystkich wątków i okien.
źródło