C++ 如何获取Windows操作系统的语言

本文解释了在多语言程序中如何选择合适的API(GetSystemDefaultLangID vs. GetUserDefaultUILanguage),推荐GetUserDefaultUILanguage,并以Win10为例,说明其与用户语言设置的一致性。提供示例代码和详细解释。
摘要由CSDN通过智能技术生成

对于支持多语言版本的程序来说,一般都是先获取系统的语言,然后根据系统的语言,自动切换到与之对应的语言。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;
}
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值