Udostępnij przez


Obsługa ustawień języka Application-Specific

Aplikacja może obsługiwać inny zestaw języków interfejsu użytkownika z tych obsługiwanych przez docelowy system operacyjny. W tym temacie omówiono ten typ pomocy technicznej przy użyciu fragmentów kodu z kompletnych przykładów.

Interpretowanie preferencji języka użytkownika

Aplikacja musi najpierw określić język interfejsu użytkownika do wyświetlenia na podstawie preferencji użytkownika. Kod może odczytywać ustawienia z pliku konfiguracji lub z ustawień rejestru.

W poniższym przykładzie zdefiniowano dwie funkcje używane do interpretowania preferencji języka użytkownika. Pierwsza funkcja ilustruje odczytywanie rozdzielanej listy języków z pliku reprezentowanego w kodzie jako "langs.txt". Ograniczniki obsługiwane w przykładzie to ",", ";", ".", i " ". Druga funkcja konwertuje ciąg odczytany z pliku na wartość wielociągową. Ta operacja jest niezbędna, ponieważ funkcje MUI używane do ustawiania języków akceptują tylko wartości wielociągowe.

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

Ustawianie języka aplikacji

Po przeczytaniu informacji o preferencjach językowych kod aplikacji musi użyć pobranego ustawienia, aby ustawić język aplikacji. W systemie Windows 7 lub nowszym aplikacja może ustawić język na poziomie procesu, wywołując funkcję SetProcessPreferredUILanguages.

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

W systemie Windows Vista i nowszym język aplikacji jest ustawiany na poziomie wątku przez wywołanie funkcji 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;

ustawianie preferencji języka aplikacji

MUI: Application-Specific Przykład Ustawień (Windows Vista)

MUI: Application-Specific Przykład ustawień (przed Windows Vista)