From 7e0afc641c520d85780074ec685fac1d9fc3e215 Mon Sep 17 00:00:00 2001 From: Kyle Kienapfel Date: Fri, 24 Jun 2022 21:16:34 -0700 Subject: [PATCH] Translate english plurals Turns out that for Qt to properly handle plurals in English a translation needs to be provided, otherwise the user is left with messages such as "Building: 2 shader(s)" Plurals for other all other languages are handled on transifex. I wrote the README.md to just refer to it as a translation collaboration site just in case we ever switch. These translations being out of date won't pose any technical problems so I believe it is fine to handle them manually on a "best effort" basis. The files are generated into the source directory so that the relative filenames are correct. The generated file is added to .gitignore --- .gitignore | 2 +- .reuse/dep5 | 3 +- dist/english_plurals/README.md | 19 +++++++ dist/english_plurals/en.ts | 67 +++++++++++++++++++++++++ src/yuzu/CMakeLists.txt | 14 +++++- src/yuzu/configuration/configure_ui.cpp | 1 + src/yuzu/main.cpp | 5 -- 7 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 dist/english_plurals/README.md create mode 100644 dist/english_plurals/en.ts diff --git a/.gitignore b/.gitignore index 6207765d8..cdf37962a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ doc-build/ # Generated source files src/common/scm_rev.cpp -.travis.descriptor.json +dist/english_plurals/generated_en.ts # Project/editor files *.swp diff --git a/.reuse/dep5 b/.reuse/dep5 index b4ac2ac26..228cc1b59 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -2,7 +2,8 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Comment: It is best to use this file to record copyright information about generated, binary and third party files -Files: dist/icons/controller/*.png +Files: dist/english_plurals/* + dist/icons/controller/*.png dist/icons/overlay/*.png dist/languages/* dist/qt_themes/*/icons/index.theme diff --git a/dist/english_plurals/README.md b/dist/english_plurals/README.md new file mode 100644 index 000000000..a4954f6a6 --- /dev/null +++ b/dist/english_plurals/README.md @@ -0,0 +1,19 @@ +# English Plurals + +Qt has "Translation Rules for Plurals", small example + + // Take a source line like + tr("Building: %n shader(s)", "", i) + + // i = 1: + Building: 1 shader + // i = 2: + Building: 2 shaders + +For yuzu the source language used is English, for all other languages handling of plurals is handled by Qt and the translation collaboration site. Handling plurals in the source language (English) requires special consideration. + +With CMake flag GENERATE_QT_TRANSLATION a generated_en.ts file is created from the source. It ignored by git (`.gitignore` in the project root). It is placed in this directory so that the relative refrences with the source code is correct. + +Having the plurals look nice isn't critical, and automation to use translation collaboration sites may require specifing the project language as "Pirate English", so this has been done manually. + +The en.ts in this directory is taken from a build, edited in Qt Linguist and then committed. As the code is in XML, using the tool is not strictly required. diff --git a/dist/english_plurals/en.ts b/dist/english_plurals/en.ts new file mode 100644 index 000000000..172cd4bba --- /dev/null +++ b/dist/english_plurals/en.ts @@ -0,0 +1,67 @@ + + + + + GMainWindow + + + %n file(s) remaining + + %n file remaining + %n files remaining + + + + + %n file(s) were newly installed + + + %n file was newly installed + + %n files were newly installed + + + + + + %n file(s) were overwritten + + + %n file was overwritten + + %n were overwritten + + + + + + %n file(s) failed to install + + + %n file failed to install + + %n files failed to install + + + + + + Building: %n shader(s) + + Building: %n shader + Building: %n shaders + + + + + GameListSearchField + + + %1 of %n result(s) + + %1 of %n result + %1 of %n results + + + + diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index f6b389ede..50007338f 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -221,6 +221,9 @@ if (ENABLE_QT_TRANSLATION) # Update source TS file if enabled if (GENERATE_QT_TRANSLATION) get_target_property(SRCS yuzu SOURCES) + # these calls to qt_create_translation also creates a rule to generate en.qm which conflicts with providing english plurals + # so we have to set a OUTPUT_LOCATION so that we don't have multiple rules to generate en.qm + set_source_files_properties(${YUZU_QT_LANGUAGES}/en.ts PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/translations") qt_create_translation(QM_FILES ${SRCS} ${UIS} @@ -229,7 +232,13 @@ if (ENABLE_QT_TRANSLATION) -source-language en_US -target-language en_US ) - add_custom_target(translation ALL DEPENDS ${YUZU_QT_LANGUAGES}/en.ts) + + # Generate plurals into dist/english_plurals/generated_en.ts so it can be used to revise dist/english_plurals/en.ts + set(GENERATED_PLURALS_FILE ${PROJECT_SOURCE_DIR}/dist/english_plurals/generated_en.ts) + set_source_files_properties(${GENERATED_PLURALS_FILE} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/plurals") + qt_create_translation(QM_FILES ${SRCS} ${UIS} ${GENERATED_PLURALS_FILE} OPTIONS -pluralonly -source-language en_US -target-language en_US) + + add_custom_target(translation ALL DEPENDS ${YUZU_QT_LANGUAGES}/en.ts ${GENERATED_PLURALS_FILE}) endif() # Find all TS files except en.ts @@ -239,6 +248,9 @@ if (ENABLE_QT_TRANSLATION) # Compile TS files to QM files qt_add_translation(LANGUAGES_QM ${LANGUAGES_TS}) + # Compile english plurals TS file to en.qm + qt_add_translation(LANGUAGES_QM ${PROJECT_SOURCE_DIR}/dist/english_plurals/en.ts) + # Build a QRC file from the QM file list set(LANGUAGES_QRC ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc) file(WRITE ${LANGUAGES_QRC} "\n") diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 2e98ede8e..48f71b53c 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -219,6 +219,7 @@ void ConfigureUi::InitializeLanguageComboBox() { for (const auto& lang : languages) { if (QString::fromLatin1(lang.id) == QStringLiteral("en")) { ui->language_combobox->addItem(lang.name, QStringLiteral("en")); + language_files.removeOne(QStringLiteral("en.qm")); continue; } for (int i = 0; i < language_files.size(); ++i) { diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index f8c234082..d03f1ef69 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -3975,11 +3975,6 @@ void GMainWindow::UpdateUITheme() { } void GMainWindow::LoadTranslation() { - // If the selected language is English, no need to install any translation - if (UISettings::values.language == QStringLiteral("en")) { - return; - } - bool loaded; if (UISettings::values.language.isEmpty()) {