Application-Specific Dil Ayarlarını Destekleme

Uygulamanız, hedef işletim sistemi tarafından desteklenenlerden farklı bir kullanıcı arabirimi dili kümesini destekleyebilir. Bu başlıkta, eksiksiz örneklerden kod parçacıkları kullanılarak bu tür destek ele alınmaktadır.

Kullanıcının Dil Tercihlerini Yorumlama

Uygulamanızın önce kullanıcı tercihine göre hangi kullanıcı arabirimi dilinin görüntüleneceğini belirlemesi gerekir. Kod, yapılandırma dosyasından veya kayıt defteri ayarlarından ayarları okuyabilir.

Aşağıdaki örnek, kullanıcının dil tercihini yorumlamak için kullanılan iki işlevi tanımlar. İlk işlev, kodda "langs.txt" olarak temsil edilen bir dosyadan ayrılmış dil listesinin okunmasını gösterir. Örnekte desteklenen sınırlayıcılar şunlardır: ",",";";"." ve " ". İkinci işlev, dosyadan okunan dizeyi çok dizeli bir değere dönüştürür. Dilleri ayarlamak için kullanılan MUI işlevleri yalnızca çok dizeli değerleri kabul ettiğinden bu işlem gereklidir.

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

Uygulama Dilini Ayarlama

Dil tercih bilgilerini okuduktan sonra, uygulama kodunun uygulama dilini ayarlamak için alınan ayarı kullanması gerekir. Windows 7 ve sonraki sürümlerde uygulama, SetProcessPreferredUILanguages işlevini çağırarak dili işlem düzeyinde ayarlayabilir.

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

Windows Vista ve sonraki sürümlerde uygulama dili, SetThreadPreferredUILanguages işlevi çağrılarak iş parçacığı düzeyinde ayarlanır.

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;

uygulama dili tercihlerini ayarlama

MUI: Application-Specific Ayarları Örneği (Windows Vista)

MUI: Application-Specific Ayarları Örneği (Windows Vista Öncesi)