2009-10-09 42 views
24

Normalmente se puede conseguir escribiendo algo así como¿Cómo obtener la configuración regional actual en C#?

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

pero fue puesto en marcha esta manera sólo se puede obtener CultureInfo que fue configurado en la aplicación momento y no se actualizará si el ajuste se han cambiado después.

Entonces, ¿cómo obtener CultureInfo actualmente configurado en el Panel de control -> Configuración regional y de idioma?

Respuesta

28

Como @Christian propuso ClearCachedData es el método a utilizar. Pero de acuerdo con MSDN:

El método ClearCachedData no actualizar la información de la propiedad Thread.CurrentCulture para hilos existentes

por lo que tendrá que llamar primero la función y luego iniciar una nuevo hilo. En este nuevo hilo, puede usar CurrentCulture para obtener los valores nuevos de la 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 
    } 

}

Tenga en cuenta, que si también es necesario para restablecer CurrentUICulture, debe hacerlo por separado

Thread.CurrentThread.CurrentUICulture.ClearCachedData() 
+0

Nice one Darin! –

+0

Recibo un error El tipo o el nombre del espacio de nombres 'Estado' no se pudo encontrar (¿falta una directiva using o una referencia de ensamblado?) En la línea: var thread = new Tema ( s => ((Estado) s) .Result = Thread.CurrentThread.CurrentCulture); El problema está en la referencia del estado. Alguna idea sobre como resolver esto? Tks – Pascal

+0

@Pascal, 'State' es una clase privada que he definido dentro de la clase' Program', pero podrías intentar externalizarla en su propio archivo y hacerlo público. Además, 'State' probablemente no sea un nombre muy bueno, por lo que puedes intentar cambiarle el nombre a algo más significativo. –

6

Thread.CurrentThread.CurrentCulture.ClearCachedData() Parece que hará que los datos de cultivo se vuelvan a leer cuando se acceda a ellos.

0

tratar de encontrar valores que desee en SystemInformation clase o mirar en WMI utilizando las clases en System.Management/System.Diagnostics, puede utilizar LINQ to WMI demasiado

2

nos encontramos a este problema con nuestra aplicación WinForms y fue debido a Visual Studio crea el proceso [MyApp] .vshost.exe que siempre se ejecuta en segundo plano cada vez que Visual Studio está abierto.

Al desactivar la configuración MyApp -> Propiedades -> Depurar -> "Habilitar el proceso de alojamiento de Visual Studio" solucionó esto.

El proceso vshost se usa principalmente para mejorar la depuración, pero si no desea deshabilitar la configuración, puede matar el proceso según sea necesario.

+1

No pudimos identificar este problema ... ¡esta solución funcionó para nosotros! Gracias jjacka !!!! – Jamie

3

Puede usar la función Win32 API GetSystemDefaultLCID. El signiture es la siguiente:

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

función GetSystemDefaultLCID devuelve el LCID. Puede mapear la cadena de idioma de la siguiente tabla. Locale IDs Assigned by Microsoft

+0

Similar a esto, pero usé GetUserDefaultLCID() que me dio la configuración del usuario, creo que el sistema predeterminado es la configuración regional instalada. – Colin

+0

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

1

No son las clases CultureInfo y TextInfo del espacio de nombres System.Globalization. Ambas clases obtienen varias configuraciones regionales de Windows definidas en los paneles de control. La lista de configuraciones disponibles se encuentra en la documentación.

Por ejemplo:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

es conseguir el separador de listas para el programa que se está ejecutando.

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

public static CultureInfo CurrentCultureInRegionalSettings => new CultureInfo(GetUserDefaultLCID()); 
Cuestiones relacionadas