Application-Specific言語設定のサポート
アプリケーションは、ターゲット オペレーティング システムでサポートされているものとは異なるユーザー インターフェイス言語のセットをサポートできます。 このトピックでは、完全なサンプルのスニペットを使用して、この種類のサポートについて説明します。
ユーザーの言語設定を解釈する
アプリケーションでは、まず、ユーザー設定に基づいて、表示するユーザー インターフェイス言語を決定する必要があります。 コードは、構成ファイルまたはレジストリ設定から設定を読み取ることができます。
次の例では、ユーザーの言語設定を解釈するために使用される 2 つの関数を定義します。 最初の関数は、コード内で "langs.txt" として表される、区切られた言語リストをファイルから読み取る方法を示しています。 サンプルでサポートされている区切り記号は、",",";";"." および " " です。 2 番目の関数は、ファイルから読み取った文字列を複数の文字列値に変換します。 言語の設定に使用される 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;
関連トピック