From 31fe72bb2119702645f745fc732d0b1f11672504 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Mon, 25 May 2026 17:00:38 +0100 Subject: [PATCH] qt: Use upstream Qt Base translations when available --- src/citra_qt/CMakeLists.txt | 21 ++++++++++++++------- src/citra_qt/citra_qt.cpp | 16 ++++++++++++---- src/citra_qt/citra_qt.h | 3 ++- src/citra_qt/configuration/configure_ui.cpp | 7 ++++++- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index 4c20b510b..c6375e76a 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -218,7 +218,8 @@ if (ENABLE_QT_UPDATE_CHECKER) endif() if (ENABLE_QT_TRANSLATION) - set(CITRA_QT_LANGUAGES "${PROJECT_SOURCE_DIR}/dist/languages" CACHE PATH "Path to the translation bundle for the Qt frontend") + set(BASE_QT_LANGUAGES "${QT_HOST_PATH}/translations" CACHE PATH "Path to the Qt's base translations") + set(CITRA_QT_LANGUAGES "${PROJECT_SOURCE_DIR}/dist/languages" CACHE PATH "Path to Citra's translations for the Qt frontend") option(GENERATE_QT_TRANSLATION "Generate en.ts as the translation source file" OFF) # Update source TS file if enabled @@ -235,17 +236,23 @@ if (ENABLE_QT_TRANSLATION) add_custom_target(translation ALL DEPENDS citra_qt_lupdate) endif() - # Find all TS files except en.ts - file(GLOB_RECURSE LANGUAGES_TS ${CITRA_QT_LANGUAGES}/*.ts) - list(REMOVE_ITEM LANGUAGES_TS ${CITRA_QT_LANGUAGES}/en.ts) + # Find all TS files for Citra translations except en.ts + file(GLOB_RECURSE CITRA_LANGUAGES_TS ${CITRA_QT_LANGUAGES}/*.ts) + list(REMOVE_ITEM CITRA_LANGUAGES_TS ${CITRA_QT_LANGUAGES}/en.ts) - # Compile TS files to QM files - qt_add_lrelease(citra_qt TS_FILES ${LANGUAGES_TS} NO_GLOBAL_TARGET QM_FILES_OUTPUT_VARIABLE LANGUAGES_QM) + # Compile Citra TS files to QM files + qt_add_lrelease(citra_qt TS_FILES ${CITRA_LANGUAGES_TS} NO_GLOBAL_TARGET QM_FILES_OUTPUT_VARIABLE CITRA_LANGUAGES_QM) + + # Find all QM files for Qt translations + file(GLOB_RECURSE QT_LANGUAGES_QM ${BASE_QT_LANGUAGES}/qtbase_*.qm) + + # Copy base QT QM files into build directory + file(COPY ${QT_LANGUAGES_QM} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # Build a QRC file from the QM file list set(LANGUAGES_QRC ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc) file(WRITE ${LANGUAGES_QRC} "\n") - foreach (QM ${LANGUAGES_QM}) + foreach (QM ${QT_LANGUAGES_QM} ${CITRA_LANGUAGES_QM}) get_filename_component(QM_FILE ${QM} NAME) file(APPEND ${LANGUAGES_QRC} "${QM_FILE}\n") endforeach (QM) diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 832f4d409..352cf7c43 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -4090,16 +4091,22 @@ void GMainWindow::LoadTranslation() { bool loaded; + const QString qtbase_prefix = QStringLiteral("qtbase_"); if (UISettings::values.language.isEmpty()) { // Use the system's default locale - loaded = translator.load(QLocale::system(), {}, {}, QStringLiteral(":/languages/")); + qtTranslator.load(qtbase_prefix + QLocale::system().name(), {}, {}, + QStringLiteral(":/languages/")); + loaded = citraTranslator.load(QLocale::system(), {}, {}, QStringLiteral(":/languages/")); } else { // Otherwise load from the specified file - loaded = translator.load(UISettings::values.language, QStringLiteral(":/languages/")); + qtTranslator.load(qtbase_prefix + UISettings::values.language, + QStringLiteral(":/languages/")); + loaded = citraTranslator.load(UISettings::values.language, QStringLiteral(":/languages/")); } if (loaded) { - qApp->installTranslator(&translator); + qApp->installTranslator(&qtTranslator); + qApp->installTranslator(&citraTranslator); } else { UISettings::values.language = QStringLiteral("en"); } @@ -4107,7 +4114,8 @@ void GMainWindow::LoadTranslation() { void GMainWindow::OnLanguageChanged(const QString& locale) { if (UISettings::values.language != QStringLiteral("en")) { - qApp->removeTranslator(&translator); + qApp->removeTranslator(&qtTranslator); + qApp->removeTranslator(&citraTranslator); } UISettings::values.language = locale; diff --git a/src/citra_qt/citra_qt.h b/src/citra_qt/citra_qt.h index 01dcaabfb..ba8b233c8 100644 --- a/src/citra_qt/citra_qt.h +++ b/src/citra_qt/citra_qt.h @@ -439,7 +439,8 @@ private: QAction* action_secondary_swap_screen; QAction* action_secondary_rotate_screen; - QTranslator translator; + QTranslator qtTranslator; + QTranslator citraTranslator; // stores default icon theme search paths for the platform QStringList default_theme_paths; diff --git a/src/citra_qt/configuration/configure_ui.cpp b/src/citra_qt/configuration/configure_ui.cpp index dae93b995..1d14b8240 100644 --- a/src/citra_qt/configuration/configure_ui.cpp +++ b/src/citra_qt/configuration/configure_ui.cpp @@ -24,12 +24,17 @@ ConfigureUi::~ConfigureUi() = default; void ConfigureUi::InitializeLanguageComboBox() { ui->language_combobox->addItem(tr(""), QString{}); - ui->language_combobox->addItem(tr("English"), QStringLiteral("en")); + ui->language_combobox->addItem(QStringLiteral("English"), QStringLiteral("en")); QDirIterator it(QStringLiteral(":/languages"), QDirIterator::NoIteratorFlags); while (it.hasNext()) { QString locale = it.next(); locale.truncate(locale.lastIndexOf(QLatin1Char{'.'})); locale.remove(0, locale.lastIndexOf(QLatin1Char{'/'}) + 1); + if (locale.startsWith(QStringLiteral("qtbase"))) { + // The Qt Base QM translation files are lumped in with ours, + // so don't show them in the language list! + continue; + } QString lang = QLocale::languageToString(QLocale(locale).language()); const QString country = QLocale::territoryToString(QLocale(locale).territory()); if (locale == QString::fromStdString("ca_ES_valencia")) {