From f19baeb9a596226aaef9dfaa842c800051875a93 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 11 Jan 2021 16:50:34 +0100 Subject: [PATCH] Wizards: Extend translation support Don't just create the ts file, but also make sure it is embedded in the application (if supported by the build system) and make the application load it if it matches the current locale. Task-number: QTCREATORBUG-25079 Change-Id: Ie3a0b1975531b12acb008e8c1312dab97f158751 Reviewed-by: Christian Stenger --- .../wizards/projects/consoleapp/file.pro | 2 ++ .../wizards/projects/consoleapp/file.qbs | 8 ++++++++ .../wizards/projects/consoleapp/main.cpp | 16 ++++++++++++++++ .../projects/qtquickapplication/app.pro | 2 ++ .../projects/qtquickapplication/app.qbs | 8 ++++++++ .../projects/qtquickapplication/main.cpp | 17 +++++++++++++++++ .../projects/qtwidgetsapplication/main.cpp | 16 ++++++++++++++++ .../projects/qtwidgetsapplication/project.pro | 2 ++ .../projects/qtwidgetsapplication/project.qbs | 8 ++++++++ .../qtsupport/translationwizardpage.cpp | 18 +++--------------- 10 files changed, 82 insertions(+), 15 deletions(-) diff --git a/share/qtcreator/templates/wizards/projects/consoleapp/file.pro b/share/qtcreator/templates/wizards/projects/consoleapp/file.pro index dafae633029..b4bc36eceef 100644 --- a/share/qtcreator/templates/wizards/projects/consoleapp/file.pro +++ b/share/qtcreator/templates/wizards/projects/consoleapp/file.pro @@ -13,6 +13,8 @@ SOURCES += \\ TRANSLATIONS += \\ %{TsFileName} +CONFIG += lrelease +CONFIG += embed_translations @endif # Default rules for deployment. diff --git a/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs b/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs index 3f06621d453..35ce99c77ac 100644 --- a/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs +++ b/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs @@ -16,6 +16,14 @@ QtApplication { "%{TsFileName}", @endif ] +@if %{HasTranslation} + + Group { + fileTagsFilter: "qm" + Qt.core.resourcePrefix: "/i18n" + fileTags: "qt.core.resource_data" + } +@endif Group { // Properties for the produced executable fileTagsFilter: "application" diff --git a/share/qtcreator/templates/wizards/projects/consoleapp/main.cpp b/share/qtcreator/templates/wizards/projects/consoleapp/main.cpp index e45deafe127..3609b36c4e1 100644 --- a/share/qtcreator/templates/wizards/projects/consoleapp/main.cpp +++ b/share/qtcreator/templates/wizards/projects/consoleapp/main.cpp @@ -1,10 +1,26 @@ %{Cpp:LicenseTemplate}\ %{JS: QtSupport.qtIncludes([ 'QtCore/QCoreApplication' ], [ 'QtCore/QCoreApplication' ]) }\ +@if %{HasTranslation} +#include +#include +@endif int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); +@if %{HasTranslation} + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "%{JS: value('ProjectName') + '_'}" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + a.installTranslator(&translator); + break; + } + } +@endif return a.exec(); } diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.pro b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.pro index 18767f8623a..670917fc8b2 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.pro +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.pro @@ -18,6 +18,8 @@ RESOURCES += qml.qrc TRANSLATIONS += \\ %{TsFileName} +CONFIG += lrelease +CONFIG += embed_translations @endif # Additional import path used to resolve QML modules in Qt Creator's code model diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs index c432214ce2f..80526d5b8dd 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs @@ -26,6 +26,14 @@ CppApplication { "%{TsFileName}", @endif ] + @if %{HasTranslation} + + Group { + fileTagsFilter: "qm" + Qt.core.resourcePrefix: "/i18n" + fileTags: "qt.core.resource_data" + } +@endif Group { // Properties for the produced executable fileTagsFilter: "application" diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp b/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp index 466c23fe69a..af10517cf8d 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp @@ -1,5 +1,10 @@ %{Cpp:LicenseTemplate}\ %{JS: QtSupport.qtIncludes([], ["QtGui/QGuiApplication", "QtQml/QQmlApplicationEngine"])} +@if %{HasTranslation} +#include +#include +@endif + int main(int argc, char *argv[]) { @if %{UseVirtualKeyboard} @@ -22,6 +27,18 @@ int main(int argc, char *argv[]) @endif QGuiApplication app(argc, argv); +@if %{HasTranslation} + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "%{JS: value('ProjectName') + '_'}" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + app.installTranslator(&translator); + break; + } + } +@endif QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); diff --git a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/main.cpp b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/main.cpp index 5c64f1d05e9..e876c29b2c1 100644 --- a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/main.cpp +++ b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/main.cpp @@ -2,10 +2,26 @@ #include "%{HdrFileName}" %{JS: QtSupport.qtIncludes([ 'QtGui/QApplication' ], [ 'QtWidgets/QApplication' ]) }\ +@if %{HasTranslation} +#include +#include +@endif int main(int argc, char *argv[]) { QApplication a(argc, argv); +@if %{HasTranslation} + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "%{JS: value('ProjectName') + '_'}" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + a.installTranslator(&translator); + break; + } + } +@endif %{Class} w; w.show(); return a.exec(); diff --git a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.pro b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.pro index abf62ced022..c41e3d0ef1d 100644 --- a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.pro +++ b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.pro @@ -23,6 +23,8 @@ FORMS += \\ TRANSLATIONS += \\ %{TsFileName} +CONFIG += lrelease +CONFIG += embed_translations @endif # Default rules for deployment. diff --git a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.qbs b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.qbs index dfba4acf115..ac04224c843 100644 --- a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.qbs +++ b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/project.qbs @@ -20,6 +20,14 @@ QtApplication { "%{TsFileName}", @endif ] +@if %{HasTranslation} + + Group { + fileTagsFilter: "qm" + Qt.core.resourcePrefix: "/i18n" + fileTags: "qt.core.resource_data" + } +@endif install: true installDir: qbs.targetOS.contains("qnx") ? FileInfo.joinPaths("/tmp", name, "bin") : base diff --git a/src/plugins/qtsupport/translationwizardpage.cpp b/src/plugins/qtsupport/translationwizardpage.cpp index d90d2a9e0c5..b15743d557b 100644 --- a/src/plugins/qtsupport/translationwizardpage.cpp +++ b/src/plugins/qtsupport/translationwizardpage.cpp @@ -65,9 +65,7 @@ private: QComboBox m_languageComboBox; QLineEdit m_fileNameLineEdit; - QLabel m_suffixLabel; const QString m_enabledExpr; - bool m_lineEditEdited = false; }; TranslationWizardPageFactory::TranslationWizardPageFactory() @@ -113,15 +111,10 @@ TranslationWizardPage::TranslationWizardPage(const QString &enabledExpr) m_languageComboBox.addItem(lp.first, lp.second); formLayout->addRow(tr("Language:"), &m_languageComboBox); const auto fileNameLayout = new QHBoxLayout; + m_fileNameLineEdit.setReadOnly(true); fileNameLayout->addWidget(&m_fileNameLineEdit); - m_suffixLabel.setText(".ts"); - fileNameLayout->addWidget(&m_suffixLabel); fileNameLayout->addStretch(1); formLayout->addRow(tr("Translation file:"), fileNameLayout); - connect(&m_fileNameLineEdit, &QLineEdit::textEdited, this, [this] { - emit completeChanged(); - m_lineEditEdited = true; - }); connect(&m_languageComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &TranslationWizardPage::updateLineEdit); } @@ -152,14 +145,9 @@ bool TranslationWizardPage::validatePage() void TranslationWizardPage::updateLineEdit() { m_fileNameLineEdit.setEnabled(m_languageComboBox.currentIndex() != 0); - m_suffixLabel.setEnabled(m_fileNameLineEdit.isEnabled()); if (m_fileNameLineEdit.isEnabled()) { - if (!m_lineEditEdited) { - const QString projectName - = static_cast(wizard())->stringValue("ProjectName"); - m_fileNameLineEdit.setText(projectName + '_' - + m_languageComboBox.currentData().toString()); - } + const QString projectName = static_cast(wizard())->stringValue("ProjectName"); + m_fileNameLineEdit.setText(projectName + '_' + m_languageComboBox.currentData().toString()); } else { m_fileNameLineEdit.clear(); m_fileNameLineEdit.setPlaceholderText(tr(""));