125 lines
4.5 KiB
Diff
125 lines
4.5 KiB
Diff
From 199ea00a9eea13315a652c62778738629185b059 Mon Sep 17 00:00:00 2001
|
|
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
|
|
Date: Wed, 10 Mar 2021 17:14:27 +0100
|
|
Subject: [PATCH] Fix normalization of app locales
|
|
|
|
Use the internal Chromium routine to get the app locale Chromium
|
|
expects.
|
|
|
|
Fixes: QTBUG-91715
|
|
Change-Id: I5042eb066cb6879ad69628959912f2841867b4e8
|
|
Reviewed-by: Michael Brüning <michael.bruning@qt.io>
|
|
---
|
|
|
|
diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
|
|
index e13ecd8..c2c78ff 100644
|
|
--- a/src/core/content_browser_client_qt.cpp
|
|
+++ b/src/core/content_browser_client_qt.cpp
|
|
@@ -471,7 +471,12 @@
|
|
|
|
std::string ContentBrowserClientQt::GetApplicationLocale()
|
|
{
|
|
- return WebEngineLibraryInfo::getApplicationLocale();
|
|
+ std::string bcp47Name = QLocale().bcp47Name().toStdString();
|
|
+ if (m_cachedQtLocale != bcp47Name) {
|
|
+ m_cachedQtLocale = bcp47Name;
|
|
+ m_appLocale = WebEngineLibraryInfo::getApplicationLocale();
|
|
+ }
|
|
+ return m_appLocale;
|
|
}
|
|
|
|
std::string ContentBrowserClientQt::GetAcceptLangs(content::BrowserContext *context)
|
|
diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h
|
|
index 7c8aa3a..1ccd292 100644
|
|
--- a/src/core/content_browser_client_qt.h
|
|
+++ b/src/core/content_browser_client_qt.h
|
|
@@ -269,6 +269,8 @@
|
|
|
|
private:
|
|
scoped_refptr<ShareGroupQtQuick> m_shareGroupQtQuick;
|
|
+ std::string m_appLocale;
|
|
+ std::string m_cachedQtLocale;
|
|
};
|
|
|
|
} // namespace QtWebEngineCore
|
|
diff --git a/src/core/web_engine_library_info.cpp b/src/core/web_engine_library_info.cpp
|
|
index 2ad5b75..09a4141 100644
|
|
--- a/src/core/web_engine_library_info.cpp
|
|
+++ b/src/core/web_engine_library_info.cpp
|
|
@@ -46,6 +46,7 @@
|
|
#include "components/spellcheck/spellcheck_buildflags.h"
|
|
#include "content/public/common/content_paths.h"
|
|
#include "sandbox/policy/switches.h"
|
|
+#include "ui/base/l10n/l10n_util.h"
|
|
#include "ui/base/ui_base_paths.h"
|
|
#include "ui/base/ui_base_switches.h"
|
|
|
|
@@ -353,18 +354,15 @@
|
|
std::string WebEngineLibraryInfo::getApplicationLocale()
|
|
{
|
|
base::CommandLine *parsedCommandLine = base::CommandLine::ForCurrentProcess();
|
|
- if (!parsedCommandLine->HasSwitch(switches::kLang)) {
|
|
+ if (parsedCommandLine->HasSwitch(switches::kLang)) {
|
|
+ return parsedCommandLine->GetSwitchValueASCII(switches::kLang);
|
|
+ } else {
|
|
const QString &locale = QLocale().bcp47Name();
|
|
-
|
|
- // QLocale::bcp47Name returns "en" for American English locale. Chromium requires the "US" suffix
|
|
- // to clarify the dialect and ignores the shorter version.
|
|
- if (locale == "en")
|
|
- return "en-US";
|
|
-
|
|
- return locale.toStdString();
|
|
+ std::string resolvedLocale;
|
|
+ if (l10n_util::CheckAndResolveLocale(locale.toStdString(), &resolvedLocale))
|
|
+ return resolvedLocale;
|
|
}
|
|
-
|
|
- return parsedCommandLine->GetSwitchValueASCII(switches::kLang);
|
|
+ return "en-US";
|
|
}
|
|
|
|
#if defined(OS_WIN)
|
|
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
|
|
index 0219863..bf2c28a 100644
|
|
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
|
|
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
|
|
@@ -123,6 +123,7 @@
|
|
void doNotBreakLayout();
|
|
|
|
void changeLocale();
|
|
+ void mixLangLocale();
|
|
void inputMethodsTextFormat_data();
|
|
void inputMethodsTextFormat();
|
|
void keyboardEvents();
|
|
@@ -1210,6 +1211,29 @@
|
|
QCOMPARE(errorLines.first().toUtf8(), QByteArrayLiteral("Die Website ist nicht erreichbar"));
|
|
}
|
|
|
|
+void tst_QWebEngineView::mixLangLocale()
|
|
+{
|
|
+ for (QString locale : { "en_DK", "de_CH", "eu_ES" }) {
|
|
+ QLocale::setDefault(locale);
|
|
+ QWebEngineView view;
|
|
+ QSignalSpy loadSpy(&view, &QWebEngineView::loadFinished);
|
|
+
|
|
+ bool terminated = false;
|
|
+ auto sc = connect(view.page(), &QWebEnginePage::renderProcessTerminated, [&] () { terminated = true; });
|
|
+
|
|
+ view.load(QUrl("qrc:///resources/dummy.html"));
|
|
+ QTRY_VERIFY(terminated || loadSpy.count() == 1);
|
|
+
|
|
+ QVERIFY2(!terminated,
|
|
+ qPrintable(QString("Locale [%1] terminated: %2, loaded: %3").arg(locale).arg(terminated).arg(loadSpy.count())));
|
|
+ QVERIFY(loadSpy.first().first().toBool());
|
|
+
|
|
+ QString content = toPlainTextSync(view.page());
|
|
+ QVERIFY2(!content.isEmpty() && content.contains("test content"), qPrintable(content));
|
|
+ }
|
|
+ QLocale::setDefault(QLocale("en"));
|
|
+}
|
|
+
|
|
void tst_QWebEngineView::inputMethodsTextFormat_data()
|
|
{
|
|
QTest::addColumn<QString>("string");
|