从 CultureInfo 获取当前系统语言给出了错误的结果
Get current system language from CultureInfo gives wrong results
我想从 Windows 获取当前系统语言。我找到了数以千计的答案,例如 Get current language in CultureInfo,建议使用 System.Globalization 和 CultureInfo 或 Thread.CurrentThread...但解决方案不起作用。
我在 Windows 7 和 Windows 10 上测试了几乎所有解决方案,我总是得到:"en-US".
这是我的 Windows 7 设置的屏幕截图:Region and Language Settings from my 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。
我用这个 post in the unity3D forum 解决了我的问题。不好意思我没有指出我用的是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();
我想从 Windows 获取当前系统语言。我找到了数以千计的答案,例如 Get current language in CultureInfo,建议使用 System.Globalization 和 CultureInfo 或 Thread.CurrentThread...但解决方案不起作用。
我在 Windows 7 和 Windows 10 上测试了几乎所有解决方案,我总是得到:"en-US".
这是我的 Windows 7 设置的屏幕截图:Region and Language Settings from my 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。
我用这个 post in the unity3D forum 解决了我的问题。不好意思我没有指出我用的是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();