From f015a208e5b979dba43ead3cc34291356a826224 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 | 25 +++++++++++++++------ src/citra_qt/citra_qt.cpp | 18 ++++++++++----- src/citra_qt/citra_qt.h | 3 ++- src/citra_qt/configuration/configure_ui.cpp | 7 +++++- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index 4c20b510b..33137ac98 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -218,7 +218,12 @@ 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") + if (EXISTS "${QT_TARGET_PATH}/translations") + set(BASE_QT_LANGUAGES "${QT_TARGET_PATH}/translations" CACHE PATH "Path to Qt base translations") + else() + set(BASE_QT_LANGUAGES "${QT_TARGET_PATH}/share/qt6/translations" CACHE PATH "Path to Qt base translations") + endif() + set(CITRA_QT_LANGUAGES "${PROJECT_SOURCE_DIR}/dist/languages" CACHE PATH "Path to Citra translations") option(GENERATE_QT_TRANSLATION "Generate en.ts as the translation source file" OFF) # Update source TS file if enabled @@ -235,17 +240,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 8a5d8dc7b..09fe54145 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 @@ -4097,7 +4098,7 @@ void GMainWindow::LoadTranslation() { UISettings::values.language = lang_en; return; } - loaded = translator.load(lang, languages_dir); + loaded = citraTranslator.load(lang, languages_dir); if (loaded) { UISettings::values.language = lang; break; @@ -4110,16 +4111,22 @@ void GMainWindow::LoadTranslation() { return; } + const QString qtbase_prefix = QStringLiteral("qtbase_"); if (UISettings::values.language.isEmpty() && !loaded) { // Use the system's default locale - loaded = translator.load(QLocale::system(), {}, {}, languages_dir); + 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, languages_dir); + 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 = lang_en; } @@ -4127,7 +4134,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")) {