2017-09-14 8 views
1

Je cours sous Windows 10. Lorsque j'ouvre "Paramètres de langue Région &" dans le menu Démarrer, je peux sélectionner un "Pays ou région". J'essaie d'obtenir cette valeur dans un programme C#.En C#, comment obtenir le "Pays ou région" sélectionné sous "Région et langue" dans Windows 10?

Je suis au Danemark. J'ai essayé de changer mon pays en Allemagne (voir screenshot), mais je ne peux pas obtenir mon code pour retourner en Allemagne. Redémarrer l'ordinateur n'a pas aidé. J'ai écrit du code inspiré de this thread.

Mon code ressemble à ceci (en essayant différentes choses à la fois, faire toutes les choses que la région/culture que je peux penser):

private static void Main(string[] args) 
{ 
    Thread.CurrentThread.CurrentCulture.ClearCachedData(); 
    Thread.CurrentThread.CurrentUICulture.ClearCachedData(); 
    var thread = new Thread(() => ((Action) (() => 
    { 
     Console.WriteLine("Current culture: {0}", Thread.CurrentThread.CurrentCulture.Name); 
     Console.WriteLine("Current UI culture: {0}", Thread.CurrentThread.CurrentUICulture.Name); 
     Console.WriteLine("Installed UI culture: {0}", CultureInfo.InstalledUICulture.Name); 
     Console.WriteLine("Current region: {0}", RegionInfo.CurrentRegion.ThreeLetterISORegionName); 
     Console.WriteLine("System default LCID: {0}", GetSystemDefaultLCID()); 
    }))()); 
    thread.Start(); 
    thread.Join(); 
    Console.ReadKey(); 
} 

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

Il produit:

Current culture: en-DK 
Current UI culture: en-US 
Installed UI culture: en-US 
Current region: DNK 
System default LCID: 1033 

Comment puis-je obtenir mon programme pour détecter que j'ai choisi l'Allemagne? Quelle méthode ou propriété dois-je appeler? Et quels redémarrages ou effacement de cache peuvent être nécessaires?

+2

[RegionInfo.CurrentRegion] (https://msdn.microsoft.com/en-us/library/system.globalization.regioninfo. currentrion (v = vs.110) .aspx). Il est temps de mettre à jour votre Google-Fu. –

+0

Il existe un onglet "Administratif" dans le Panneau de configuration de la région [Win32], pas celui des paramètres modernes. Cliquez sur "Copy Settings" & "Change System Locale". Probablement pourrait résoudre votre demande –

+0

J'ai finalement trouvé la réponse à ma question dans ce fil: https://stackoverflow.com/questions/8879259/get-current-location-as-specified-in-region-and-language-in- c-sharp –

Répondre

2

J'ai trouvé la réponse à ma question this thread.

J'utilise le code ci-dessous, tel que proposé par @SanjaySingh dans ce thread et seulement légèrement modifié.

Si j'appelle GetMachineCurrentLocation avec le jeu de paramètres geoFriendlyname-5, je reçois trois lettres code région ISO Je veux (pour l'Allemagne c'est "DEU"). Les valeurs pour geoFriendlyname peuvent être trouvées here.

public static class RegionAndLanguageHelper 
{ 
    #region Constants 

    private const int GEO_FRIENDLYNAME = 8; 

    #endregion 

    #region Private Enums 

    private enum GeoClass : int 
    { 
     Nation = 16, 
     Region = 14, 
    }; 

    #endregion 

    #region Win32 Declarations 

    [DllImport("kernel32.dll", ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    private static extern int GetUserGeoID(GeoClass geoClass); 

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

    [DllImport("kernel32.dll")] 
    private static extern int GetGeoInfo(int geoid, int geoType, StringBuilder lpGeoData, int cchData, int langid); 

    #endregion 

    #region Public Methods 

    /// <summary> 
    /// Returns machine current location as specified in Region and Language settings. 
    /// </summary> 
    /// <param name="geoFriendlyname"></param> 
    public static string GetMachineCurrentLocation(int geoFriendlyname) 
    { 
     int geoId = GetUserGeoID(GeoClass.Nation); ; 
     int lcid = GetUserDefaultLCID(); 
     StringBuilder locationBuffer = new StringBuilder(100); 
     GetGeoInfo(geoId, geoFriendlyname, locationBuffer, locationBuffer.Capacity, lcid); 

     return locationBuffer.ToString().Trim(); 
    } 

    #endregion 
} 
+0

Pouvez-vous me montrer ce que vous avez passé à 'GetMachineCurrentLocation (?)' Et qu'avez-vous obtenu en appelant la méthode 'GetMachineCurrentLocation()'? –

+0

Dans mon cas: 'var test = RegionAndLanguageHelper.GetMachineCurrentLocation (RegionInfo.CurrentRegion.GeoId);' => 'test' est" "(vide) –

0

Read msdn documentation: RegionInfo Properties

var regionInfo = RegionInfo.CurrentRegion; 
var name = regionInfo.Name; 
var englishName = regionInfo.EnglishName; 
var displayName = regionInfo.DisplayName; 

Console.WriteLine("Name: {0}", name); 
Console.WriteLine("EnglishName: {0}", englishName); 
Console.WriteLine("DisplayName: {0}", displayName); 

Nom: DE
EnglishName: Allemagne
DisplayName: Allemagne

+0

J'ai essayé cela, comme indiqué dans mon message original. Cela n'a pas aidé. CurrentThread.CurrentCulture n'a pas changé lorsque j'ai changé de pays dans "Paramètres régionaux et linguistiques". –

+0

@ClausAppel Avez-vous essayé avec 'var regionInfo = RegionInfo.CurrentRegion;'? travaillant pour moi. –

+0

@ClausAppel, from msdn: * "La classe RegionInfo ne détecte pas automatiquement les changements dans les paramètres du système, mais le [CurrentRegion] (https://msdn.microsoft.com/en-us/library/system.globalization.regioninfo. La propriété currentregion (v = vs.110) .aspx) est mise à jour lorsque vous appelez [ClearCachedData] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.clearcacheddata (v = vs. 110) .aspx) méthode "*. – Sinatr

0

Essayez

var geographicRegion = new Windows.Globalization.GeographicRegion(); 
    var code = geographicRegion.CodeTwoLetter; 

ou

var region = Windows.System.UserProfile.GlobalizationPreferences.HomeGeographicRegion; 
+1

Ceci est une solution UWP. – Sinatr