对于支持多语言版本的程序来说,一般都是先获取系统的语言,然后根据系统的语言,自动切换到与之对应的语言。Windows sdk 也提供了获取语言的API函数:
- GetSystemDefaultLangID
- GetUserDefaultLangID
- GetSystemDefaultUILanguage
- GetUserDefaultUILanguage
那么我们到底该用哪一个?先说结论:推荐使用GetUserDefaultUILanguage。以win10为例,因为通过修改“Windows显示语言”,该Api的返回值就会发生改变。而修改“Windows显示语言”的操作,与用户的心理预期是一致的。
示例代码:
namespace
{
struct countryLang
{
LANGID langId;//
char country[16];//国际代码缩写
char lang[32];//
char userLang[32];//
};
const countryLang COUNTRY_LANG[] =
{
{0x0804, "CN", "zh", "zh_CN"},//中国
{0x0409, "US", "en", "en_US"},//美国
{0x0412, "KR", "ko", "ko_KR"},//韩国
{0x0411, "JP", "ja", "ja_JP"},//日本
{0x0421, "ID", "en", "en_ID"},//印度尼西亚
{0x0407, "DE", "de", "de_DE"},//德国
{0x040c, "FR", "fr", "fr_Fr"},//法国
{0x0410, "IT", "it", "it_IT"},//意大利
{0x0416, "BR", "pt", "pt_BR"},//葡萄牙
{0x0c0a, "ES", "es", "es_Es"},//西班牙
{0x0419, "RU", "ru", "ru_RU"},//俄国
{0x041f, "TR", "tr", "tr_TR"},//土耳其
{0x042a, "VI", "vi", "vi_VI"},//越南
{0x041e, "TH", "en", "en_TH"},//泰国
{0x0809, "GB", "en", "en_US"}//英国
};
}
//
bool GetDefaultLang(std::string& country, std::string& lang, std::string& userLang)
{
bool bFind = false;
//LANGID lang_id = GetSystemDefaultLangID();
LANGID lang_id = GetUserDefaultUILanguage();//"win10>设置>语言>Windows显示语言"
int size = sizeof(COUNTRY_LANG) / sizeof(COUNTRY_LANG[0]);
char _country[16] = { 0 };//国际代码缩写
strcpy_s(_country, "US");
char _lang[32] = { 0 };//语言
strcpy_s(_lang, "en");
char _userlang[32] = { 0 };//用户语言
strcpy_s(_userlang, "en_US");
for (int i = 0; i < size; i++)
{
if (lang_id == COUNTRY_LANG[i].langId)
{
memset(_country, 0, sizeof(_country));
memset(_lang, 0, sizeof(_lang));
memset(_userlang, 0, sizeof(_userlang));
strcpy(_country, COUNTRY_LANG[i].country);
strcpy(_lang, COUNTRY_LANG[i].lang);
strcpy(_userlang, COUNTRY_LANG[i].userLang);
bFind = true;
break;
}
}
country = std::string(_country);
lang = std::string(_lang);
userLang = std::string(_userlang);
return bFind;
}