diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-11-23 07:13:00 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-11-23 07:13:00 +0100 |
commit | 1ed7a67a4cef8350103e4ea33b4bbd084f5d4c2d (patch) | |
tree | 03dd7b6f8d9ccc02da6d0d882793ec62c71b00f7 /src/corelib/tools | |
parent | dbb7817e13bc7f7ccb8f04b00a65eb3dcf8d25f8 (diff) | |
parent | 6a2b17eeec2d171d2afa17bdbc36456346bfd13b (diff) |
Merge remote-tracking branch 'origin/5.6' into dev
Conflicts:
src/corelib/kernel/qcoreapplication.cpp
src/corelib/thread/qthread_unix.cpp
Change-Id: Ia08d613c3f0bd08cb6dc3e3a57257207dfd4a099
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qlocale_win.cpp | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp index 574453f4ca..a5eb7ec058 100644 --- a/src/corelib/tools/qlocale_win.cpp +++ b/src/corelib/tools/qlocale_win.cpp @@ -48,6 +48,8 @@ #endif #ifdef Q_OS_WINRT +#include <qfunctions_winrt.h> + #include <wrl.h> #include <windows.foundation.h> #include <windows.foundation.collections.h> @@ -644,21 +646,53 @@ QVariant QSystemLocalePrivate::uiLanguages() } ComPtr<ABI::Windows::Foundation::Collections::IVectorView<HSTRING> > languageList; - appLanguagesStatics->get_ManifestLanguages(&languageList); - - if (!languageList) - return QStringList(); - + // Languages is a ranked list of "long names" (e.g. en-US) of preferred languages, which matches + // languages from the manifest with languages from the user's system. + HRESULT hr = appLanguagesStatics->get_Languages(&languageList); + Q_ASSERT_SUCCEEDED(hr); unsigned int size; - languageList->get_Size(&size); + hr = languageList->get_Size(&size); + Q_ASSERT_SUCCEEDED(hr); + result.reserve(size); for (unsigned int i = 0; i < size; ++i) { HString language; - languageList->GetAt(i, language.GetAddressOf()); + hr = languageList->GetAt(i, language.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); UINT32 length; PCWSTR rawString = language.GetRawBuffer(&length); result << QString::fromWCharArray(rawString, length); } + // ManifestLanguages covers all languages given in the manifest and uses short names (like "en"). + hr = appLanguagesStatics->get_ManifestLanguages(&languageList); + Q_ASSERT_SUCCEEDED(hr); + hr = languageList->get_Size(&size); + Q_ASSERT_SUCCEEDED(hr); + for (unsigned int i = 0; i < size; ++i) { + HString language; + hr = languageList->GetAt(i, language.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); + UINT32 length; + PCWSTR rawString = language.GetRawBuffer(&length); + const QString qLanguage = QString::fromWCharArray(rawString, length); + bool found = false; + // Since ApplicationLanguages:::Languages uses long names, we compare the "pre-dash" part of + // the language and filter it out, if it is already covered by a more specialized form. + foreach (const QString &lang, result) { + int dashIndex = lang.indexOf('-'); + // There will not be any long name after the first short name was found, so we can stop. + if (dashIndex == -1) + break; + + if (lang.leftRef(dashIndex) == qLanguage) { + found = true; + break; + } + } + if (!found) + result << qLanguage; + } + return result; #endif // Q_OS_WINRT } |