как преобразовать идентификатор MS LANG ID SAPI в языковой тег BCP 47?

Вызов метода SAPI get language возвращает 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.


person Yash    schedule 16.08.2014    source источник
comment
LCID — это просто число. Если вы получили строку типа 809, вам нужно преобразовать ее из шестнадцатеричного представления, чтобы получить 2057. Это можно сделать множеством способов, конечно, зависит от вашего любимого языка программирования.   -  person Hans Passant    schedule 16.08.2014
comment
Можете ли вы добавить код, который у вас есть сейчас?   -  person Eric Brown    schedule 17.08.2014


Ответы (1)


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

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

person Eric Brown    schedule 20.08.2014
comment
Это действительно сработало. Спасибо. Но есть одна проблема. LCIDToLocaleName недоступен в Windows XP. Но мне нужно сделать это и в win xp. Искал альтернативы, но не нашел. Итак, есть идеи, как мы можем сделать то же самое на Win XP? - person Yash; 22.08.2014