Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Uw toepassing kan ondersteuning bieden voor een andere set talen van de gebruikersinterface dan talen die worden ondersteund door het doelbesturingssysteem. In dit onderwerp wordt dit type ondersteuning besproken met behulp van fragmenten uit volledige voorbeelden.
Taalvoorkeur van gebruiker interpreteren
Uw toepassing moet eerst bepalen welke gebruikersinterfacetaal moet worden weergegeven, op basis van de gebruikersvoorkeur. De code kan de instellingen lezen uit een configuratiebestand of vanuit registerinstellingen.
In het volgende voorbeeld worden twee functies gedefinieerd die worden gebruikt om de taalvoorkeur van de gebruiker te interpreteren. De eerste functie illustreert het lezen van een lijst met talen met scheidingstekens uit een bestand, die in de code wordt weergegeven als 'langs.txt'. De scheidingstekens die in het voorbeeld worden ondersteund, zijn ',',';';'' en '. De tweede functie converteert de tekenreeks die uit het bestand is gelezen naar een waarde met meerdere tekenreeksen. Deze bewerking is nodig omdat de MUI-functies die worden gebruikt voor het instellen van talen alleen waarden met meerdere tekenreeksen accepteren.
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;
}
De toepassingstaal instellen
Nadat u de taalvoorkeurinformatie hebt gelezen, moet de toepassingscode de opgehaalde instelling gebruiken om de taal van de toepassing in te stellen. In Windows 7 en hoger kan de toepassing de taal instellen op procesniveau door de functie SetProcessPreferredUILanguages aan te roepen.
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.
}
In Windows Vista en hoger wordt de toepassingstaal ingesteld op threadniveau door de SetThreadPreferredUILanguages aan te roepen functie.
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;
Verwante onderwerpen
-
MUI: Application-Specific Instellingenvoorbeeld (Windows Vista)
-
MUI: Application-Specific-instellingenvoorbeeld (pre-Windows Vista)