2009-10-09 11 views
24

Normalmente si può ottenere scrivendo qualcosa comeCome ottenere le impostazioni internazionali correnti in C#?

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

Ma in questo modo si può ottenere solo CultureInfo che è stato configurato l'applicazione momento è stato lanciato e non verrà aggiornato se l'impostazione sono state modificate in seguito.

Quindi, come ottenere CultureInfo correntemente configurato in Pannello di controllo -> Impostazioni internazionali e della lingua?

risposta

28

Come @Christian proposto ClearCachedData è il metodo da utilizzare. Ma secondo MSDN:

Il metodo ClearCachedData non aggiornare le informazioni nella proprietà Thread.CurrentCulture per thread esistenti

così hai bisogno di chiamare prima la funzione e quindi avviare una nuovo thread. In questa nuova discussione puoi utilizzare CurrentCulture per ottenere i nuovi valori della cultura.

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 
    } 

}

nota, che se anche è necessario reimpostare CurrentUICulture, si dovrebbe fare separatamente

Thread.CurrentThread.CurrentUICulture.ClearCachedData() 
+0

Bello uno Darin! –

+0

Ricevo errore Non è stato possibile trovare il nome dello spazio dei nomi "Stato" (manca una direttiva using o un riferimento all'assembly?) Sulla riga: var thread = new Thread ( s => ((Stato) s) .Result = Thread.CurrentThread.CurrentCulture); Il problema è sul riferimento dello stato. Qualche idea su come risolvere questo? Tks – Pascal

+0

@Pascal, 'State' è una classe privata che ho definito all'interno della classe' Program', ma potresti provare a esternarla nel proprio file e renderla pubblica. Anche 'State' probabilmente non è un nome molto buono, quindi potresti provare a rinominarlo in qualcosa di più significativo. –

6

Thread.CurrentThread.CurrentCulture.ClearCachedData() sembra che causerà la rilettura dei dati di coltura al prossimo accesso.

0

cercare di trovare le impostazioni desiderate nei SystemInformation classe o guardare in WMI utilizzando le classi in System.Management/System.Diagnostics, è possibile utilizzare LINQ to WMI troppo

2

ci siamo imbattuti in questo problema con la nostra WinForms app ed è stato a causa di Visual Studio crea il processo [MyApp] .vshost.exe che viene sempre eseguito in background ogni volta che Visual Studio è aperto.

Disattivare MyApp -> Proprietà -> Debug -> "Abilita processo di hosting di Visual Studio" ha risolto questo problema per noi.

Il processo vshost viene principalmente utilizzato per migliorare il debug, ma se non si desidera disabilitare l'impostazione, è possibile interrompere il processo in base alle esigenze.

+1

Non siamo riusciti a individuare questo problema .... questa soluzione ha funzionato per noi !! Grazie a jjacka !!!! – Jamie

3

È possibile utilizzare la funzione API Win32 GetSystemDefaultLCID. Il signiture è la seguente:

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

funzione GetSystemDefaultLCID restituisce il LCID. Può mappare la stringa di linguaggio dalla tabella folowing. Locale IDs Assigned by Microsoft

+0

Simile a questo, ma ho usato GetUserDefaultLCID() invece che mi ha ottenuto l'impostazione dell'utente, penso che il sistema predefinito sia il locale installato. – Colin

+0

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

1

ci sono le classi CultureInfo e TextInfo dallo spazio dei nomi System.Globalization. Entrambe le classi ottengono diverse impostazioni regionali di Windows definite nei pannelli di controllo. L'elenco delle impostazioni disponibili si trova nella documentazione.

Ad esempio:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

sta ottenendo il separatore di elenco per il programma in corso.

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

public static CultureInfo CurrentCultureInRegionalSettings => new CultureInfo(GetUserDefaultLCID()); 
Problemi correlati