다음을 통해 공유


Application-Specific 언어 설정 지원

애플리케이션은 대상 운영 체제에서 지원하는 것과 다른 사용자 인터페이스 언어 집합을 지원할 수 있습니다. 이 항목에서는 전체 샘플의 코드 조각을 사용하여 이러한 유형의 지원에 대해 설명합니다.

사용자의 언어 기본 설정 해석

애플리케이션은 먼저 사용자 기본 설정에 따라 표시할 사용자 인터페이스 언어를 결정해야 합니다. 코드는 구성 파일 또는 레지스트리 설정에서 설정을 읽을 수 있습니다.

다음 예제에서는 사용자의 언어 기본 설정을 해석하는 데 사용되는 두 가지 함수를 정의합니다. 첫 번째 함수는 코드에 "langs.txt"로 표시된 파일에서 구분된 언어 목록을 읽는 것을 보여 줍니다. 샘플에서 지원되는 구분 기호는 ",",";";"" 및 "입니다. 두 번째 함수는 파일에서 읽은 문자열을 다중 문자열 값으로 변환합니다. 언어를 설정하는 데 사용되는 MUI 함수는 다중 문자열 값만 허용하기 때문에 이 작업이 필요합니다.

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

애플리케이션 언어 설정

언어 기본 설정 정보를 읽은 후 애플리케이션 코드는 검색된 설정을 사용하여 애플리케이션 언어를 설정해야 합니다. Windows 7 이상에서 애플리케이션은 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.
}

Windows Vista 이상에서는 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;

애플리케이션 언어 기본 설정

MUI: Application-Specific 설정 샘플(Windows Vista)

MUI: Application-Specific 설정 샘플(Windows Vista 이전)