Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Seu aplicativo pode suportar um conjunto diferente de idiomas de interface do usuário daqueles suportados pelo sistema operacional de destino. Este tópico discute esse tipo de suporte, usando trechos de amostras completas.
Interpretar a preferência de idioma do usuário
Seu aplicativo deve primeiro determinar qual idioma da interface do usuário exibir, com base na preferência do usuário. O código pode ler as configurações de um arquivo de configuração ou das configurações do Registro.
O exemplo a seguir define duas funções usadas para interpretar a preferência de idioma do usuário. A primeira função ilustra a leitura de uma lista delimitada de idiomas de um arquivo, representado no código como "langs.txt". Os delimitadores suportados na amostra são ",", ";", ".", e " ". A segunda função converte a cadeia de caracteres lida do arquivo em um valor de várias cadeias de caracteres. Esta operação é necessária porque as funções MUI usadas para definir idiomas só aceitam valores de várias cadeias de caracteres.
BOOL GetMyUserDefinedLanguages(WCHAR * langStr, DWORD langStrSize)
{
BOOL rtnVal = FALSE;
// Very simple implementation - assumes that first 'langStrSize' characters of the
// L".\\langs.txt" file comprises a string of one or more languages.
HANDLE langConfigFileHandle = CreateFileW(L".\\langs.txt", GENERIC_READ, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(langConfigFileHandle != INVALID_HANDLE_VALUE)
{
// Clear the input variables.
DWORD bytesActuallyRead = 0;
if(ReadFile(langConfigFileHandle, langStr, langStrSize*sizeof(WCHAR), &bytesActuallyRead, NULL)
&& bytesActuallyRead > 0)
{
rtnVal = TRUE;
DWORD nullIndex = (bytesActuallyRead/sizeof(WCHAR) < langStrSize)
? bytesActuallyRead/sizeof(WCHAR) : langStrSize;
langStr[nullIndex] = L'\0';
}
CloseHandle(langConfigFileHandle);
}
return rtnVal;
}
BOOL ConvertMyLangStrToMultiLangStr(WCHAR * langStr, WCHAR * langMultiStr, DWORD langMultiStrSize)
{
BOOL rtnVal = FALSE;
size_t strLen = 0;
rtnVal = SUCCEEDED(StringCchLengthW(langStr, USER_CONFIGURATION_STRING_BUFFER*2, &strLen));
if(rtnVal && strLen > 0 && langMultiStr && langMultiStrSize > 0)
{
WCHAR * langMultiStrPtr = langMultiStr;
WCHAR * last = langStr + (langStr[0] == 0xFEFF ? 1 : 0);
WCHAR * context = last;
WCHAR * next = wcstok_s(last,L",; :",&context);
while(next && rtnVal)
{
// Make sure you validate the user input.
if(SUCCEEDED(StringCchLengthW(last, LOCALE_NAME_MAX_LENGTH, &strLen))
&& IsValidLocaleName(next))
{
langMultiStrPtr[0] = L'\0';
rtnVal &= SUCCEEDED(StringCchCatW(langMultiStrPtr,
(langMultiStrSize - (langMultiStrPtr - langMultiStr)), next));
langMultiStrPtr += strLen + 1;
}
next = wcstok_s(NULL, L",; :", &context);
if(next)
last = next;
}
// Make sure there is a double null term for the multi-string.
if(rtnVal && (langMultiStrSize - (langMultiStrPtr - langMultiStr)))
{
langMultiStrPtr[0] = L'\0';
}
else // Fail and guard anyone whom might use the multi-string.
{
langMultiStr[0] = L'\0';
langMultiStr[1] = L'\0';
}
}
return rtnVal;
}
Definir o idioma do aplicativo
Depois de ler as informações de preferência de idioma, o código do aplicativo deve usar a configuração recuperada para definir o idioma do aplicativo. No Windows 7 e posterior, o aplicativo pode definir o idioma no nível do processo chamando a funçãoSetProcessPreferredUILanguages.
DWORD langCount = 0;
// Using SetProcessPreferredUILanguages is recommended for new applications (esp. multi-threaded applications).
if(!SetProcessPreferredUILanguages(MUI_LANGUAGE_NAME, userLanguagesMultiString, &langCount) || langCount == 0)
{
swprintf_s(displayBuffer, SUFFICIENTLY_LARGE_ERROR_BUFFER,
L"FAILURE: Unable to set the user defined languages, last error = %d.", GetLastError());
MessageBoxW(NULL, displayBuffer, L"HelloMUI ERROR!", MB_OK | MB_ICONERROR);
return 1; // Exit.
}
No Windows Vista e nos sistemas posteriores, a língua da aplicação é definida ao nível da thread ao invocar a função SetThreadPreferredUILanguages.
DWORD langCount = 0;
// The following line of code is supported on Windows Vista and later.
if(!SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, userLanguagesMultiString, &langCount) || langCount == 0)
{
swprintf_s(displayBuffer, SUFFICIENTLY_LARGE_ERROR_BUFFER,
L"FAILURE: Unable to set the user defined languages, last error = %d.", GetLastError());
MessageBoxW(NULL, displayBuffer, L"HelloMUI ERROR!", MB_OK | MB_ICONERROR);
return 1; // Exit.
}
return 1;
Tópicos relacionados
-
MUI: Exemplo de Configurações Application-Specific (Windows Vista)
-
MUI: Exemplo de configurações de Application-Specific (anterior ao Windows Vista)