2

我想从 Windows 获取当前的系统语言。我找到了数千个答案,例如Get current language in CultureInfo并建议使用 System.Globalization 和 CultureInfo 或 Thread.CurrentThread ... 但这些解决方案不起作用。

我在我的 Windows 7 和我的 Windows 10 上测试了几乎所有的解决方案,我总是得到:“en-US”。

这是我的 Windows 7 设置的屏幕截图:我的 Windows 7 的区域和语言设置

我找到了一个可行的解决方案,但我认为 System.Globalization 是一种更好的方法,我也想要“de-DE”而不是“de-de”作为结果。

 [DllImport("kernel32.dll")]
 static extern int GetUserGeoID(int geoId);
 [DllImport("kernel32.dll")]
 static extern int GetGeoInfo(int geoid, int GeoType, StringBuilder lpGeoData, int cchData, int langid);
 [DllImport("kernel32.dll")]
 static extern int GetUserDefaultLCID();

 private const int GEOCLASS_NATION = 16;
 //SYSGEOTYPE
 private const int GEO_NATION = 1;
 private const int GEO_LATITUDE = 2;
 private const int GEO_LONGITUDE = 3;
 private const int GEO_ISO2 = 4;
 private const int GEO_ISO3 = 5;
 private const int GEO_RFC1766 = 6;
 private const int GEO_LCID = 7;
 private const int GEO_FRIENDLYNAME = 8;
 private const int GEO_OFFICIALNAME = 9;
 private const int GEO_TIMEZONES = 10;
 private const int GEO_OFFICIALLANGUAGES = 11;

 public string language;

 // ***********************************************************

 // Code 
 int geoId = GetUserGeoID(GEOCLASS_NATION);
 int lcid = GetUserDefaultLCID();
 StringBuilder bldr = new StringBuilder(50);
 GetGeoInfo(geoId, GEO_RFC1766, bldr, bldr.Capacity, lcid);

 Debug.Log(lcid);

 language = bldr.ToString();

有谁知道我必须做什么才能让 CultureInfo 工作?

编辑:我忘了提到我还在 HKEY_USERS\[Any Folder]\Control Panel\International 检查了我的注册表,并且所有语言都正确设置了 LocaleName = de-DE。

4

1 回答 1

1

我用unity3D 论坛中的这篇文章解决了我的问题。对不起,我没有指出我使用 Unity,但我不知道该程序可以产生这样的效果。

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern int GetUserDefaultLCID();

//*************************************************************************

CultureInfo culture = CultureInfo.GetCultureInfo(GetUserDefaultLCID());
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;

language = culture.ToString();
于 2017-03-08T14:04:35.727 回答