web-dev-qa-db-fra.com

Comment obtenir les paramètres régionaux actuels en C #?

Normalement, vous pouvez l'obtenir en écrivant quelque chose comme

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

Mais de cette façon, vous ne pouvez obtenir que CultureInfo qui a été configuré au moment du lancement de l'application et ne sera pas mis à jour si les paramètres ont été modifiés par la suite.

Alors, comment faire pour que CultureInfo soit actuellement configuré dans le Panneau de configuration -> Paramètres régionaux et linguistiques?

24
Shuric

Comme @Christian a proposé ClearCachedData est la méthode à utiliser. Mais selon MSDN:

La méthode ClearCachedData ne fonctionne pas actualise les informations dans le fichier Propriété Thread.CurrentCulture pour threads existants

Vous devrez donc d'abord appeler la fonction, puis démarrer un nouveau thread. Dans ce nouveau fil, vous pouvez utiliser CurrentCulture pour obtenir les nouvelles valeurs de la culture.

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
    }

}

Notez que si vous devez également réinitialiser CurrentUICulture, vous devez le faire séparément.

Thread.CurrentThread.CurrentUICulture.ClearCachedData()
28
Darin Dimitrov

Thread.CurrentThread.CurrentCulture.ClearCachedData() semble indiquer que les données de culture seront relues lors du prochain accès.

6
Christian Hayter

Vous pouvez utiliser la fonction GetSystemDefaultLCID de l'API Win32. La signature est la suivante:

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

La fonction GetSystemDefaultLCID renvoie le LCID. Il peut mapper la chaîne de langue à partir de la table suivante . ID de paramètres régionaux attribués par Microsoft

3
Mark Green

Nous avons rencontré ce problème avec notre application WinForms en raison de la création par Visual Studio du processus [MyApp] .vshost.exe qui s'exécutait toujours en arrière-plan lorsque Visual Studio était ouvert. 

La désactivation du paramètre MyApp -> Propriétés -> Débogage -> "Activer le processus d'hébergement Visual Studio" a résolu ce problème pour nous.

Le processus vshost est principalement utilisé pour améliorer le débogage, mais si vous ne souhaitez pas désactiver le paramètre, vous pouvez interrompre le processus à votre guise.

2
jjacka

Il existe les classes CultureInfo et TextInfo de l'espace de noms System.Globalization. Les deux classes ont plusieurs paramètres régionaux Windows définis dans les panneaux de contrôle. La liste des paramètres disponibles se trouve dans la documentation.

Par exemple:

string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator;

obtient le séparateur de liste pour le programme en cours d'exécution.

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

public static CultureInfo CurrentCultureInRegionalSettings => new CultureInfo(GetUserDefaultLCID());
0
tjsmith

Essayez de trouver les paramètres souhaités dans SystemInformation Class ou examinez WMI en utilisant les classes dans System.Management/System.Diagnostics. Vous pouvez également utiliser LINQ to WMI .

0
Arsen Mkrtchyan