diff --git a/app/gui/qt/utils/sonicpi_i18n.cpp b/app/gui/qt/utils/sonicpi_i18n.cpp index b362a6da6d..ea75607d12 100644 --- a/app/gui/qt/utils/sonicpi_i18n.cpp +++ b/app/gui/qt/utils/sonicpi_i18n.cpp @@ -18,23 +18,12 @@ SonicPii18n::SonicPii18n(QString rootpath) { this->available_languages = findAvailableLanguages(); this->currently_loaded_language = "en"; - //checkAllTranslations(); // For testing and debugging purposes } SonicPii18n::~SonicPii18n() { } -QStringList SonicPii18n::findSystemLanguages() { - QLocale locale; - QStringList preferred_languages = locale.uiLanguages(); - std::cout << "Looping through preferred ui languages" << std::endl; - for (int i = 0; i < preferred_languages.length(); i += 1) { - preferred_languages[i] = preferred_languages[i].replace("-", "_"); - } - return preferred_languages; -} - QString SonicPii18n::determineUILanguage(QString lang_pref) { QStringList available_languages = getAvailableLanguages(); //std::cout << available_languages.join("\n").toUtf8().constData() << std::endl; @@ -76,6 +65,16 @@ QString SonicPii18n::determineUILanguage(QString lang_pref) { return "en"; } +QStringList SonicPii18n::findSystemLanguages() { + QLocale locale; + QStringList preferred_languages = locale.uiLanguages(); + std::cout << "Looping through preferred ui languages" << std::endl; + for (int i = 0; i < preferred_languages.length(); i += 1) { + preferred_languages[i] = preferred_languages[i].replace("-", "_"); + } + return preferred_languages; +} + QStringList SonicPii18n::findAvailableLanguages() { QStringList languages; @@ -132,9 +131,17 @@ QStringList SonicPii18n::getAvailableLanguages() { return list; } -std::map SonicPii18n::getNativeLanguageNameList() { - return native_language_names; -} +QStringList SonicPii18n::getSystemLanguages() { + return system_languages; +}; + +bool SonicPii18n::isSystemLanguageAvailable() { + return system_language_available; +}; + +QString SonicPii18n::currentlyLoadedLanguage() { + return currently_loaded_language; +}; QString SonicPii18n::getNativeLanguageName(QString lang) { if (lang == "system_language") { @@ -153,7 +160,7 @@ QString SonicPii18n::getNativeLanguageName(QString lang) { if (name != "C" && name != "") { return locale.nativeLanguageName(); } else { - std::cout << "Warning: Invalid language code '" << lang.toUtf8().constData() << "'" << std::endl; + std::cout << "Warning: Invalid language code: '" << lang.toUtf8().constData() << "'" << std::endl; return lang; } } diff --git a/app/gui/qt/utils/sonicpi_i18n.h b/app/gui/qt/utils/sonicpi_i18n.h index e30c956cb1..a12949a998 100644 --- a/app/gui/qt/utils/sonicpi_i18n.h +++ b/app/gui/qt/utils/sonicpi_i18n.h @@ -22,23 +22,31 @@ class SonicPii18n : public QObject { SonicPii18n(QString rootpath); ~SonicPii18n(); - QStringList system_languages; - bool system_language_available; - QString currently_loaded_language; public slots: QString determineUILanguage(QString lang_pref); + bool loadTranslations(QString lang); + QStringList getAvailableLanguages(); - std::map getNativeLanguageNameList(); + QStringList getSystemLanguages(); + bool isSystemLanguageAvailable(); + QString currentlyLoadedLanguage(); + QString getNativeLanguageName(QString lang); QStringList getNativeLanguageNames(QStringList languages); - bool loadTranslations(QString lang); + private: QString root_path; + QTranslator qtTranslator; QTranslator translator; + QStringList available_languages; + QStringList system_languages; + bool system_language_available; + QString currently_loaded_language; + static std::map native_language_names; QStringList findAvailableLanguages(); diff --git a/app/gui/qt/widgets/settingswidget.cpp b/app/gui/qt/widgets/settingswidget.cpp index 7765914a1c..7844a1cda2 100644 --- a/app/gui/qt/widgets/settingswidget.cpp +++ b/app/gui/qt/widgets/settingswidget.cpp @@ -26,7 +26,6 @@ SettingsWidget::SettingsWidget(int port, bool i18n, SonicPiSettings *piSettings, this->piSettings = piSettings; this->i18n = i18n; this->sonicPii18n = sonicPii18n; - this->localeNames = sonicPii18n->getNativeLanguageNameList(); this->available_languages = sonicPii18n->getAvailableLanguages(); server_osc_cues_port = port; @@ -53,25 +52,28 @@ SettingsWidget::SettingsWidget(int port, bool i18n, SonicPiSettings *piSettings, QGroupBox *language_prefs_box = createLanguagePrefsTab(); prefTabs->addTab(language_prefs_box, tr("Language")); - if (!sonicPii18n->system_language_available) { - QGroupBox *translation_box = new QGroupBox("Translation"); - QVBoxLayout *translation_box_layout = new QVBoxLayout; - QLabel *go_translate = new QLabel; - go_translate->setOpenExternalLinks(true); - go_translate->setText( - "Sonic Pi hasn't been translated to " + - QLocale::languageToString(QLocale::system().language()) + - " yet.
" + - "We rely on crowdsourcing to help create and maintain translations.
" + - "" + - "Please consider helping to translate Sonic Pi to your language. " - ); - go_translate->setTextFormat(Qt::RichText); - translation_box_layout->addWidget(go_translate); - translation_box->setLayout(translation_box_layout); - - grid->addWidget(translation_box, 3, 0, 1, 2); + if (piSettings->language == "system_language") { + if (!sonicPii18n->isSystemLanguageAvailable()) { + QGroupBox *translation_box = new QGroupBox("Translation"); + QVBoxLayout *translation_box_layout = new QVBoxLayout; + QLabel *go_translate = new QLabel; + go_translate->setOpenExternalLinks(true); + go_translate->setText( + "Sonic Pi hasn't been translated to " + + QLocale::languageToString(QLocale::system().language()) + + " yet.
" + + "We rely on crowdsourcing to help create and maintain translations.
" + + "" + + "Please consider helping to translate Sonic Pi to your language. " + ); + go_translate->setTextFormat(Qt::RichText); + translation_box_layout->addWidget(go_translate); + translation_box->setLayout(translation_box_layout); + + grid->addWidget(translation_box, 3, 0, 1, 2); + } } + settingsChanged(); connectAll(); setLayout(grid); @@ -491,10 +493,12 @@ QGroupBox* SettingsWidget::createLanguagePrefsTab() { language_combo = new QComboBox(); add_language_combo_box_entries(language_combo); - language_combo->setToolTip(tr("Change the language of the UI & Tutorial (Requires a restart to take effect)")); + language_combo->setToolTip(tr("Change the language of the UI & Tutorial")); language_combo->setMinimumContentsLength(2); language_combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength); + language_details_label = new QLabel; + language_info_label = new QLabel; language_info_label->setText(tr("Translations have been generously provided by volunteers \non https://hosted.weblate.org/projects/sonic-pi/. Thank you! :)")); @@ -502,6 +506,7 @@ QGroupBox* SettingsWidget::createLanguagePrefsTab() { language_box_layout->addWidget(language_option_label); language_box_layout->addWidget(language_combo); + language_box_layout->addWidget(language_details_label); language_box_layout->addWidget(language_info_label); language_box->setLayout(language_box_layout); @@ -572,22 +577,46 @@ void SettingsWidget::updateUILanguage(int index) { QMessageBox msgBox(this); msgBox.setText(QString(tr("You've selected a new language: %1")).arg(new_lang)); - QString info_text = tr("Do you want to apply this language?") + "\n" + tr("Applying the new language will stop any current runs & recordings, and restart Sonic Pi."); + QString info_text = ( + tr("Do you want to apply this language?") + + "\n" + + tr("The new language will be applied when you next start Sonic Pi.") + ); if (lang == "system_language") { - info_text = tr("System languages found %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->system_languages).join(", ")) + "\n" + info_text; + info_text = tr("System languages found: %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->getSystemLanguages()).join(", ")) + "\n" + info_text; } msgBox.setInformativeText(info_text); - QPushButton *restartButton = msgBox.addButton(tr("Apply and Restart"), QMessageBox::ActionRole); + QPushButton *applyButton = msgBox.addButton(tr("Apply"), QMessageBox::ActionRole); QPushButton *dismissButton = msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole); - msgBox.setDefaultButton(restartButton); - msgBox.setIcon(QMessageBox::Information); + msgBox.setDefaultButton(applyButton); + msgBox.setIcon(QMessageBox::Question); msgBox.exec(); - if (msgBox.clickedButton() == (QAbstractButton*)restartButton) { - piSettings->language = lang; + if (msgBox.clickedButton() == (QAbstractButton*)applyButton) { + piSettings->language = lang; + updateSelectedUILanguage(piSettings->language); + emit uiLanguageChanged(piSettings->language); + + language_details_label->setText( + tr("The new language will be applied when you next start Sonic Pi.") + + " " + + tr("Current UI language: %1").arg(sonicPii18n->getNativeLanguageName(sonicPii18n->currentlyLoadedLanguage())) + ); + + QMessageBox restartMsgBox(this); + restartMsgBox.setText(QString(tr("Restart Sonic Pi?"))); + QString info_text = (tr("Do you want to restart Sonic Pi now? This will stop any current runs & recordings.")); + QPushButton *restartButton = restartMsgBox.addButton(tr("Restart"), QMessageBox::ActionRole); + QPushButton *dismissButton = restartMsgBox.addButton(tr("Dismiss"), QMessageBox::RejectRole); + restartMsgBox.setInformativeText(info_text); + restartMsgBox.setDefaultButton(dismissButton); + restartMsgBox.setIcon(QMessageBox::Question); + restartMsgBox.exec(); + if (restartMsgBox.clickedButton() == (QAbstractButton*)restartButton) { emit restartApp(); + } //emit uiLanguageChanged(lang); } else if (msgBox.clickedButton() == (QAbstractButton*)dismissButton) { // Don't apply the new language settings @@ -779,9 +808,8 @@ void SettingsWidget::updateSettings() { void SettingsWidget::settingsChanged() { language_combo->setCurrentIndex(available_languages.indexOf(piSettings->language)); if (piSettings->language == "system_language") { - language_info_label->setText( - tr("System languages: %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->system_languages).join(", ")) + "\n" + tr("Current UI language: %1").arg(sonicPii18n->getNativeLanguageName(sonicPii18n->currently_loaded_language)) - + "\n\n" + tr("Translations have been generously provided by volunteers \non https://hosted.weblate.org/projects/sonic-pi/. Thank you! :)") + language_details_label->setText( + tr("System languages: %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->getSystemLanguages()).join(", ")) + "\n" + tr("Current UI language: %1").arg(sonicPii18n->getNativeLanguageName(sonicPii18n->currentlyLoadedLanguage())) ); } diff --git a/app/gui/qt/widgets/settingswidget.h b/app/gui/qt/widgets/settingswidget.h index 148f8242b0..384f686b49 100644 --- a/app/gui/qt/widgets/settingswidget.h +++ b/app/gui/qt/widgets/settingswidget.h @@ -168,6 +168,7 @@ private slots: QComboBox *language_combo; QLabel *language_option_label; + QLabel *language_details_label; QLabel *language_info_label; // TODO