2009-10-09 15 views
24

Zwykle można je dostać pisząc cośJak uzyskać bieżące ustawienia regionalne w języku C#?

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

Ale w ten sposób można dostać tylko CultureInfo która została skonfigurowana w aplikacji moment był uruchomiony i nie zaktualizuje jeśli ustawienie zostały zmienione później.

Jak uzyskać konfigurację CultureInfo obecnie w Panelu sterowania -> Ustawienia regionalne i językowe?

Odpowiedz

28

Jak @Christian zaproponował ClearCachedData jest metoda. Ale zgodnie z MSDN:

Sposób ClearCachedData nie odświeżyć informacje w nieruchomości Thread.CurrentCulture dla istniejących wątków

więc trzeba najpierw wywołać funkcję, a następnie rozpocząć nowy wątek. W tym nowym wątku możesz użyć CurrentCulture, aby uzyskać świeże wartości kultury.

class Program 
{ 
    private class State 
    { 
     public CultureInfo Result { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     Thread.CurrentThread.CurrentCulture.ClearCachedData(); 
     var thread = new Thread(
      s => ((State)s).Result = Thread.CurrentThread.CurrentCulture); 
     var state = new State(); 
     thread.Start(state); 
     thread.Join(); 
     var culture = state.Result; 
     // Do something with the culture 
    } 

}

Zauważ, że jeśli trzeba także zresetować CurrentUICulture, należy to zrobić oddzielnie

Thread.CurrentThread.CurrentUICulture.ClearCachedData() 
+0

Niezły! –

+0

Występuje błąd Nie można znaleźć typu lub przestrzeni nazw "Stan" (czy brakuje instrukcji użycia lub odniesienia do zespołu?) W linii: var thread = new Thread ( s => ((Stan) s) .Result = Thread.CurrentThread.CurrentCulture); Problem dotyczy odwołania do stanu. Masz pomysł, jak rozwiązać ten problem? Tks – Pascal

+0

@Pascal, 'State' to prywatna klasa, którą zdefiniowałem w klasie' Program', ale możesz spróbować uzewnętrznić ją do własnego pliku i upublicznić. Również 'State' nie jest prawdopodobnie bardzo dobrą nazwą, więc możesz spróbować zmienić jego nazwę na coś bardziej znaczącego. –

6

Thread.CurrentThread.CurrentCulture.ClearCachedData() Wygląda na to, że spowoduje ponowne odczytanie danych kultury przy następnym dostępie.

0

Spróbuj znaleźć ustawienia, które chcesz w SystemInformation klasy lub zajrzeć do WMI przy użyciu klas w System.Management/System.Diagnostics, można użyć LINQ to WMI zbyt

2

Wpadliśmy do tej kwestii z naszej aplikacji WinForms i było spowodowane Visual Studio tworzy proces [MyApp] .vshost.exe, który zawsze działa w tle, gdy program Visual Studio jest otwarty.

Wyłączenie funkcji MyApp -> Właściwości -> Debugowanie -> "Włącz proces hostingu Visual Studio" naprawiło to za nas.

Proces vshost służy głównie do poprawy debugowania, ale jeśli nie chcesz wyłączyć tego ustawienia, możesz zabić proces w razie potrzeby.

+1

Nie mogliśmy zlokalizować tego problemu ... to rozwiązanie działało dla nas !! Dzięki jjacka !!!! – Jamie

3

Możesz użyć funkcji Win32 API GetSystemDefaultLCID. signiture jest następująca:

[DllImport("kernel32.dll")] 
static extern uint GetSystemDefaultLCID(); 

funkcja GetSystemDefaultLCID zwraca LCID. Może odwzorować łańcuch językowy z poniższej tabeli. Locale IDs Assigned by Microsoft

+0

Podobny do tego, ale użyłem GetUserDefaultLCID() zamiast, które dostałem mi ustawienie użytkownika, myślę, że domyślny system jest zainstalowany locale. – Colin

+0

[DllImport ("kernel32.dll")] static extern int GetSystemDefaultLCID(); var name = new System.Globalization.CultureInfo (GetSystemDefaultLCID()). Name; –

1

Istnieją klasy CultureInfo i TextInfo z przestrzeni nazw System.Globalization. Obie klasy otrzymują kilka ustawień regionalnych systemu Windows zdefiniowanych w panelach kontrolnych. Lista dostępnych ustawień znajduje się w dokumentacji.

Na przykład:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

jest coraz separator listy dla programu, który jest uruchomiony.

0
[DllImport("kernel32.dll")] 
private static extern int GetUserDefaultLCID(); 

public static CultureInfo CurrentCultureInRegionalSettings => new CultureInfo(GetUserDefaultLCID()); 
Powiązane problemy