Share via


Unterstützung Application-Specific Spracheinstellungen

Ihre Anwendung kann einen anderen Satz von Benutzeroberflächensprachen unterstützen als die sprachen, die vom Zielbetriebssystem unterstützt werden. In diesem Thema wird diese Art von Unterstützung anhand von Codeausschnitten aus vollständigen Beispielen erläutert.

Interpretieren der Spracheinstellung des Benutzers

Ihre Anwendung muss zunächst anhand der Benutzereinstellungen ermitteln, welche Sprache der Benutzeroberfläche angezeigt werden soll. Der Code kann die Einstellungen aus einer Konfigurationsdatei oder aus Registrierungseinstellungen lesen.

Im folgenden Beispiel werden zwei Funktionen definiert, die zum Interpretieren der Spracheinstellung des Benutzers verwendet werden. Die erste Funktion veranschaulicht das Lesen einer durch Trennzeichen gekennzeichneten Liste von Sprachen aus einer Datei, die im Code als "langs.txt" dargestellt wird. Die im Beispiel unterstützten Trennzeichen sind ",",";";"." und "". Die zweite Funktion konvertiert die aus der Datei gelesene Zeichenfolge in einen Wert mit mehreren Zeichenfolgen. Dieser Vorgang ist erforderlich, da die MUI-Funktionen, die zum Festlegen von Sprachen verwendet werden, nur Werte mit mehreren Zeichenfolgen akzeptieren.

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;
}

Festlegen der Anwendungssprache

Nach dem Lesen der Spracheinstellungsinformationen muss der Anwendungscode die abgerufene Einstellung verwenden, um die Anwendungssprache festzulegen. Unter Windows 7 und höher kann die Anwendung die Sprache auf Prozessebene festlegen, indem sie die SetProcessPreferredUILanguages-Funktion aufruft .

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.
}

Unter Windows Vista und höher wird die Anwendungssprache auf Threadebene festgelegt, indem die SetThreadPreferredUILanguages-Funktion aufgerufen wird.

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;

Festlegen von Anwendungsspracheneinstellungen

MUI: beispiel für Application-Specific einstellungen (Windows Vista)

MUI: Application-Specific-Einstellungsbeispiel (Vor Windows Vista)