吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1483|回复: 4
收起左侧

[其他转载] VC获取当前机器支持的所有语言列表(全网没找到自己写的)

[复制链接]
JerusalemSky 发表于 2020-12-4 08:38
本帖最后由 JerusalemSky 于 2020-12-4 13:59 编辑

网上找遍全网没找到一个现有的方案,自己写了一套,已经经过测试,代码提供两种列表显示,一种是国际ISO缩略语(en_US, cn_ZH),一种是全称(English_United States.1252)。公司电脑加密,直接上源码,随意取用,不谢

#include <WinNls.h>
#include <vector>

typedef std::vector<std::wstring> tLocales;
std::vector<std::wstring> g_locales;

BOOL CALLBACK MyLocaleEnumProc(LPTSTR szLocaleString)
{
    g_locales.push_back(szLocaleString);
    return TRUE;
}

//LCID码转语言和国家全称(English_United States.1252)
std::wstring& LCID2NLS(LCID lcid, std::wstring& bstrRetBuf)
{
    TCHAR arcBuf[128];

    memset(arcBuf, 0, sizeof(arcBuf));

    GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, arcBuf, 127);
    bstrRetBuf = arcBuf;
    memset(arcBuf, 0, sizeof(arcBuf));
    //Loading the English name for the country/region
    GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, arcBuf, 127);
    if (*arcBuf)
    {
        bstrRetBuf += TEXT("_");
        bstrRetBuf += arcBuf;
    }
    //Loading the code page
    memset(arcBuf, 0, sizeof(arcBuf));
    if ((GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, arcBuf, 127)
        || GetLocaleInfo(lcid, LOCALE_IDEFAULTCODEPAGE, arcBuf, 127))
        && *arcBuf)
    {
        bstrRetBuf += TEXT(".");
        bstrRetBuf += arcBuf;
    }

    return bstrRetBuf;
}

//LCID码转语言和国家缩写(en_US)
std::wstring& LCID2NLSAbbr(LCID lcid, std::wstring& bstrRetBuf)
{
    TCHAR arcBuf[128];

    memset(arcBuf, 0, sizeof(arcBuf));

    GetLocaleInfo(lcid, LOCALE_SISO639LANGNAME, arcBuf, 127);
    bstrRetBuf = arcBuf;
    memset(arcBuf, 0, sizeof(arcBuf));
    //Loading the English name for the country/region
    GetLocaleInfo(lcid, LOCALE_SISO3166CTRYNAME, arcBuf, 127);
    if (*arcBuf)
    {
        bstrRetBuf += TEXT("_");
        bstrRetBuf += arcBuf;
    }

    return bstrRetBuf;
}

std::string WString2String(std::wstring ws)
{
    std::string strLocale = setlocale(LC_ALL, "");
    std::string strResult;
    const __wchar_t* wchSrc = ws.c_str();
    size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;
    char* chDest = new char[nDestSize];
    memset(chDest, 0, nDestSize);
    wcstombs(chDest, wchSrc, nDestSize);
    strResult = chDest;
    delete[]chDest;
    setlocale(LC_ALL, strLocale.c_str());

    return strResult;
}

std::vector<std::string> GetAllLocales()
{
    EnumSystemLocales(&MyLocaleEnumProc, LCID_INSTALLED);
    std::vector<std::string> vwNLS;
    std::string strResult;
    std::wstring ws;

    for (tLocales::const_iterator i = g_locales.begin(); i != g_locales.end(); i++)
    {
        //目前调用LCID2NLSAbbr返回多语言国际标准中的缩写列表
        LCID2NLSAbbr(wcstoul(i->c_str(), nullptr, 16), ws);

        strResult = WString2String(ws);

        vwNLS.emplace_back(strResult);
    }

    return vwNLS;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
dbm21166 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yoxi011 发表于 2020-12-4 09:20
看不懂 还是支持下
daxionglyly 发表于 2020-12-4 10:04
你怎么能干   那么优秀   那么棒  爱你哟  
千城忆梦 发表于 2020-12-4 10:46
加了下面两个还是报错。。。
#include <vector>
#include <sstream>
Snipaste_2020-12-04_10-46-25.png
 楼主| JerusalemSky 发表于 2020-12-4 14:00
千城忆梦 发表于 2020-12-4 10:46
加了下面两个还是报错。。。
#include
#include

sorry, 一些本项目用到的自定义变量漏替换了,现在已更新,你可以再试试哦
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表