Как преобразовать MSI ID LANG SAP в языковой тег BCP 47?

Вызов метода get языка SAPI возвращает MS LangID, но для моей цели его необходимо преобразовать в языковой тег BCP 47 (например, en-GB) . как мы это делаем?

Я не могу сделать это с помощью LCIDToLocalName, так как для использования этой функции мне нужно сначала преобразовать возвращаемое значение в формат LCID.

Например, он возвращает "809" для английского, теперь как мне сначала преобразовать его в LCID, так как LCIDHex для английского языка - "0809", а LCIDec - "2057".

Любая помощь будет оценена.

Изменить: следующий код

if (S_OK != SpEnumTokens(SPCAT_VOICES, NULL, NULL, &voice_tokens))
    return FALSE;

unsigned long voice_count, i = 0;
hr = voice_tokens->GetCount(&voice_count);
cout << " count " << voice_count << endl;
for (unsigned int i = 0; i < voice_count; i++){
    //cout << i << endl;
    CComPtr<ISpObjectToken> voice_token;
    if (S_OK != voice_tokens->Next(1, &voice_token, NULL))
        return FALSE;

    WCHAR *description;
    if (S_OK != SpGetDescription(voice_token, &description))
        return FALSE;


    CComPtr<ISpDataKey> attributes;
    if (S_OK != voice_token->OpenKey(kAttributesKey, &attributes))
        return FALSE;

    WCHAR *gender_s;
    TtsGenderType gender;
    if (S_OK == attributes->GetStringValue(kGenderValue, &gender_s)){
        if (0 == _wcsicmp(gender_s, L"male"))
            gender = TTS_GENDER_MALE;
        else if (0 == _wcsicmp(gender_s, L"female"))
            gender = TTS_GENDER_FEMALE;
    }


    WCHAR *language;
    if (S_OK != attributes->GetStringValue(kLanguageValue, &language))
        return FALSE;

    wprintf(L"%s\n", language);

Последняя строка печатает шестнадцатеричные значения, такие как 409 и 809, но я хочу, чтобы это было в формате, подобном En-US .

1 ответ

@HansPassant правильно. У вас есть строка; разобрать его как шестнадцатеричный использование _wtoi (или ваш любимый парсер), затем перейдите к LCIDToLocaleName.

Для XP вы можете использовать DownlevelLCIDToLocaleName; требуемую DLL можно загрузить из центра загрузки Microsoft.

Другие вопросы по тегам