diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 868513513e..e7d93e63ac 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -797,7 +797,7 @@ qt_internal_extend_target(Core CONDITION APPLE text/qlocale_mac.mm ) -qt_internal_extend_target(Core CONDITION UNIX AND NOT APPLE +qt_internal_extend_target(Core CONDITION UNIX AND NOT APPLE AND NOT WASM SOURCES text/qlocale_unix.cpp ) @@ -807,6 +807,11 @@ qt_internal_extend_target(Core CONDITION WIN32 text/qlocale_win.cpp ) +qt_internal_extend_target(Core CONDITION WASM + SOURCES + text/qlocale_wasm.cpp +) + # On MS-Win, clang has two flavors, one of which immitates MSVC (so claims to be it) qt_internal_extend_target(Core CONDITION MSVC LIBRARIES diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 7004ad9f0a..adaa1774ee 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -720,6 +720,17 @@ QSystemLocale::QSystemLocale() : next(_systemLocale) _systemLocale = this; systemLocaleData.m_language_id = 0; + +#ifdef Q_OS_WASM + onLanguageChanged = std::make_unique( + emscripten::val::global("window"), "languagechange", [](emscripten::val) { + systemLocaleData.m_language_id = 0; + QEvent languageChangeEvent(QEvent::LanguageChange); + QCoreApplication::sendEvent(qApp, &languageChangeEvent); + QEvent localeChangeEvent(QEvent::LocaleChange); + QCoreApplication::sendEvent(qApp, &localeChangeEvent); + }); +#endif } /*! diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h index f8814c4417..aa429e1e3b 100644 --- a/src/corelib/text/qlocale_p.h +++ b/src/corelib/text/qlocale_p.h @@ -25,6 +25,9 @@ #include #include #include +#ifdef Q_OS_WASM +#include +#endif #include #include @@ -103,6 +106,10 @@ struct QLocaleData; class Q_CORE_EXPORT QSystemLocale { QSystemLocale *next = nullptr; // Maintains a stack. +#ifdef Q_OS_WASM + std::unique_ptr onLanguageChanged; +#endif + public: QSystemLocale(); virtual ~QSystemLocale(); diff --git a/src/corelib/text/qlocale_wasm.cpp b/src/corelib/text/qlocale_wasm.cpp new file mode 100644 index 0000000000..e67eccb122 --- /dev/null +++ b/src/corelib/text/qlocale_wasm.cpp @@ -0,0 +1,54 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qlocale_p.h" + +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +#ifndef QT_NO_SYSTEMLOCALE + +namespace { + +QStringList navigatorLanguages() +{ + using emscripten::val; + const val navigator = val::global("navigator"); + const auto languages = emscripten::vecFromJSArray(navigator["languages"]); + QStringList qtLanguages; + for (const std::string& language : languages) + qtLanguages.append(QString::fromStdString(language)); + return qtLanguages; +} + +} + +QVariant QSystemLocale::query(QueryType query, QVariant in) const +{ + Q_UNUSED(in); + + switch (query) { + case QSystemLocale::UILanguages: + return QVariant(navigatorLanguages()); + default: + break; + } + + return QVariant(); +} + +QLocale QSystemLocale::fallbackLocale() const +{ + const QStringList languages = navigatorLanguages(); + if (languages.isEmpty()) + return QLocale(u"en-US"); + return QLocale(languages[0]); +} + +#endif // QT_NO_SYSTEMLOCALE + +QT_END_NAMESPACE