GetUserPreferredUILanguages()永远不会返回两种以上的语言

时间:2018-10-17 07:16:15

标签: windows winapi internationalization translation multilingual

我正在尝试从C ++ / Qt应用程序中检索用户首选语言的完整列表,如用户首选项的“区域和语言”页面中所配置的那样:

Preferred languages

为此,我正在尝试在最新的Windows 10 Pro系统上使用WinAPI函数GetUserPreferredUILanguages()

但是,该函数始终仅返回第一个条目(Windows主要显示语言)和“ en-US”。如果将英语配置为主语言,则仅返回“ en-US”。例如,如果我配置了(德语,法语,英语),则返回[“ de-de”,“ en-US”],则省略了法语。如果我将更多语言添加到列表中,它们也会被省略。 我也看了User Interface Language Management,但无济于事。例如,GetSystemPreferredUILanguages()仅返回“ en-US”。 GetUILanguageFallbackList()返回[“ de-de”,“ de”,“ en-US”,“ en”]。

我使用的代码:

// calling GetUserPreferredUILanguages() twice, once to get number of 
// languages and required buffer size, then to get the actual data

ULONG numberOfLanguages = 0;
DWORD bufferLength = 0;
const auto result1 = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME,
                                                 &numberOfLanguages,
                                                 nullptr,
                                                 &bufferLength);
// result1 is true, numberOfLanguages=2

QVector<wchar_t> languagesBuffer(static_cast<int>(bufferLength));
const auto result2 = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME,
                                                 &numberOfLanguages,
                                                 languagesBuffer.data(),
                                                 &bufferLength);

// result2 is true, languageBuffer contains "de-de", "en-US"

这不是正确使用的功能,还是我对Windows 10中的语言配置有误解?如何获得首选语言的完整列表?我看到UWP API可能可以完成这项工作,但如果可能的话,我想使用C API,因为它可以更轻松地与手头的C ++代码库集成。 (即非托管C ++)

1 个答案:

答案 0 :(得分:2)

"可用于非托管C ++,因为awk -F: '{if ($3 > 1000) print $1}' passw | ... 具有DualApiPartitionAttribute。 这是使用GlobalizationPreferences.Languages的C ++ / WinRT示例:

GlobalizationPreferences

还有一个无法迁移到C ++ 17的WRL示例:

GlobalizationPreferences.Languages