Вызов метода 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.