2012-01-16 9 views
7

Jak mogę uzyskać bieżącą lokalizację urządzenia zgodnie z ustawieniem Region i język systemu operacyjnego? Próbowałem już uzyskać to z klasy RegionInfo, ale zwraca Lokalizacja, jak określono w Format rozwiń Region i język.Uzyskaj aktualną lokalizację (jak określono w regionie i języku) w C#

Aby wyjaśnić, co mam na myśli, jeśli otworzysz Region i język z Panelu sterowania urządzenia, chcę przeczytać Lokalizacja, jak określono w zakładce Lokalizacja. RegionInfo podaje wartość określoną w menu rozwijanym Formatowanie karty Formaty.

+3

@ Sai Uważam, że PO oznacza położenie geograficzne. – Glenn

+0

Myślę, że chce Lokalizacja jak na * Ukrainie, w Stanach Zjednoczonych, Wielkiej Brytanii * jak mądry i nic wspólnego z kulturą – V4Vendetta

+0

To prawda. Na przykład mogę mieć swoją kulturę jako angielski (Stany Zjednoczone) i moją lokalizację jako Indie. Możesz zmienić oba te ustawienia niezależnie w panelu sterowania Region i Język. –

Odpowiedz

2

tak .. ale łatwiej:

CultureInfo info = CultureInfo.CurrentCulture; 
+0

To nie działa. Na przykład moja karta Lokalizacja jest ustawiona na Japan. Jednak powyższy kod wygenerowany en-US. – Dono

+0

*** To samo *** 'Panel sterowania: Opcje regionalne i językowe-> Standardy i formaty' niż' Panel sterowania: Opcje regionalne i językowe-> Lokalizacja' – Kiquenet

1

można spróbować użyć

RegionInfo.CurrentRegion.DisplayName;

Czy ta daje żądaną nazwę lokalizacji, jak zamierzają

+0

Próbowałem tego, ale to daje mi obecny Format, a nie bieżąca lokalizacja określona w oknie dialogowym Region i język (Panel sterowania -> Region i język) –

+0

Nie będzie działać. Moja lokalizacja to Japonia, ale powyższe pokazuje "Stany Zjednoczone". – Dono

+0

*** Nie to samo *** 'Panel sterowania: Opcje regionalne i językowe-> Standardy i formaty' niż' Panel sterowania: Opcje regionalne i językowe-> Lokalizacja' – Kiquenet

17

Po wielu googlowania, w końcu mam odpowiedź. Następujące dwa linki mi pomóc obecna maszyna lokalizacja-

http://social.msdn.microsoft.com/Forums/eu/csharpgeneral/thread/6dfaa142-c588-4cb0-b044-fa1e8138b299

http://www.siao2.com/2007/02/21/1733999.aspx

zrobiłem następującą klasę użytkową, jeśli ktoś jest zainteresowany końcowym Code

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> 
    public static string GetMachineCurrentLocation() 
    { 
     int geoId = GetUserGeoID(GeoClass.Nation); ; 
     int lcid = GetUserDefaultLCID(); 
     StringBuilder locationBuffer = new StringBuilder(100); 
     GetGeoInfo(geoId, GEO_FRIENDLYNAME, locationBuffer, locationBuffer.Capacity, lcid); 

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

    #endregion 
} 
+2

To jest TYLKO działające rozwiązanie dla wielu systemów operacyjnych, takich jak Win7 + Win8. Nie rozumiem, dlaczego w ogóle nie jest oceniany ... – Raffaeu

+0

'using (var regKeyGeo = Microsoft.Win32.Registry.CurrentUser.OpenSubKey (@" Panel sterowania \ International \ Geo ")) { Response.Write ("
Geo Nation "+ regKeyGeo.GetValue (" Nation "). ToString()); } ' – Kiquenet

+0

@Kiquenet Korzystanie z rejestru jest czymś, czego zdecydowanie unikam. Zasadniczo jest to nieudokumentowane i nieobsługiwane, możesz być pewien, że w pewnym momencie się zepsuje. – Poorkenny

0

Base „Kontroli Panel> Region> Lokalizacja domu ", możesz otrzymać RegionInfo. Wypróbuj to -

var regKeyGeoId = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Control Panel\International\Geo"); 
var geoID = (string)regKeyGeoId.GetValue("Nation"); 
var allRegions = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(x => new RegionInfo(x.ToString())); 
var regionInfo = allRegions.FirstOrDefault(r => r.GeoId == Int32.Parse(geoID)); 
Powiązane problemy