Skip to content

Commit cee7fc0

Browse files
committed
GUI - Give the user the option whether or not to restart Sonic Pi when changing the language
Also clean up/refactor SonicPii18n class
1 parent fc7881e commit cee7fc0

File tree

4 files changed

+94
-50
lines changed

4 files changed

+94
-50
lines changed

app/gui/qt/utils/sonicpi_i18n.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,12 @@ SonicPii18n::SonicPii18n(QString rootpath) {
1818
this->available_languages = findAvailableLanguages();
1919
this->currently_loaded_language = "en";
2020

21-
2221
//checkAllTranslations(); // For testing and debugging purposes
2322
}
2423

2524
SonicPii18n::~SonicPii18n() {
2625
}
2726

28-
QStringList SonicPii18n::findSystemLanguages() {
29-
QLocale locale;
30-
QStringList preferred_languages = locale.uiLanguages();
31-
std::cout << "Looping through preferred ui languages" << std::endl;
32-
for (int i = 0; i < preferred_languages.length(); i += 1) {
33-
preferred_languages[i] = preferred_languages[i].replace("-", "_");
34-
}
35-
return preferred_languages;
36-
}
37-
3827
QString SonicPii18n::determineUILanguage(QString lang_pref) {
3928
QStringList available_languages = getAvailableLanguages();
4029
//std::cout << available_languages.join("\n").toUtf8().constData() << std::endl;
@@ -76,6 +65,16 @@ QString SonicPii18n::determineUILanguage(QString lang_pref) {
7665
return "en";
7766
}
7867

68+
QStringList SonicPii18n::findSystemLanguages() {
69+
QLocale locale;
70+
QStringList preferred_languages = locale.uiLanguages();
71+
std::cout << "Looping through preferred ui languages" << std::endl;
72+
for (int i = 0; i < preferred_languages.length(); i += 1) {
73+
preferred_languages[i] = preferred_languages[i].replace("-", "_");
74+
}
75+
return preferred_languages;
76+
}
77+
7978
QStringList SonicPii18n::findAvailableLanguages() {
8079
QStringList languages;
8180

@@ -132,9 +131,17 @@ QStringList SonicPii18n::getAvailableLanguages() {
132131
return list;
133132
}
134133

135-
std::map<QString, QString> SonicPii18n::getNativeLanguageNameList() {
136-
return native_language_names;
137-
}
134+
QStringList SonicPii18n::getSystemLanguages() {
135+
return system_languages;
136+
};
137+
138+
bool SonicPii18n::isSystemLanguageAvailable() {
139+
return system_language_available;
140+
};
141+
142+
QString SonicPii18n::currentlyLoadedLanguage() {
143+
return currently_loaded_language;
144+
};
138145

139146
QString SonicPii18n::getNativeLanguageName(QString lang) {
140147
if (lang == "system_language") {
@@ -153,7 +160,7 @@ QString SonicPii18n::getNativeLanguageName(QString lang) {
153160
if (name != "C" && name != "") {
154161
return locale.nativeLanguageName();
155162
} else {
156-
std::cout << "Warning: Invalid language code '" << lang.toUtf8().constData() << "'" << std::endl;
163+
std::cout << "Warning: Invalid language code: '" << lang.toUtf8().constData() << "'" << std::endl;
157164
return lang;
158165
}
159166
}

app/gui/qt/utils/sonicpi_i18n.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,31 @@ class SonicPii18n : public QObject {
2222
SonicPii18n(QString rootpath);
2323
~SonicPii18n();
2424

25-
QStringList system_languages;
26-
bool system_language_available;
27-
QString currently_loaded_language;
2825

2926
public slots:
3027
QString determineUILanguage(QString lang_pref);
28+
bool loadTranslations(QString lang);
29+
3130
QStringList getAvailableLanguages();
32-
std::map<QString, QString> getNativeLanguageNameList();
31+
QStringList getSystemLanguages();
32+
bool isSystemLanguageAvailable();
33+
QString currentlyLoadedLanguage();
34+
3335
QString getNativeLanguageName(QString lang);
3436
QStringList getNativeLanguageNames(QStringList languages);
35-
bool loadTranslations(QString lang);
37+
3638

3739
private:
3840
QString root_path;
41+
3942
QTranslator qtTranslator;
4043
QTranslator translator;
44+
4145
QStringList available_languages;
46+
QStringList system_languages;
47+
bool system_language_available;
48+
QString currently_loaded_language;
49+
4250
static std::map<QString, QString> native_language_names;
4351

4452
QStringList findAvailableLanguages();

app/gui/qt/widgets/settingswidget.cpp

Lines changed: 58 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ SettingsWidget::SettingsWidget(int port, bool i18n, SonicPiSettings *piSettings,
2626
this->piSettings = piSettings;
2727
this->i18n = i18n;
2828
this->sonicPii18n = sonicPii18n;
29-
this->localeNames = sonicPii18n->getNativeLanguageNameList();
3029
this->available_languages = sonicPii18n->getAvailableLanguages();
3130
server_osc_cues_port = port;
3231

@@ -53,25 +52,28 @@ SettingsWidget::SettingsWidget(int port, bool i18n, SonicPiSettings *piSettings,
5352
QGroupBox *language_prefs_box = createLanguagePrefsTab();
5453
prefTabs->addTab(language_prefs_box, tr("Language"));
5554

56-
if (!sonicPii18n->system_language_available) {
57-
QGroupBox *translation_box = new QGroupBox("Translation");
58-
QVBoxLayout *translation_box_layout = new QVBoxLayout;
59-
QLabel *go_translate = new QLabel;
60-
go_translate->setOpenExternalLinks(true);
61-
go_translate->setText(
62-
"Sonic Pi hasn't been translated to " +
63-
QLocale::languageToString(QLocale::system().language()) +
64-
" yet.<br/>" +
65-
"We rely on crowdsourcing to help create and maintain translations.<br/>" +
66-
"<a href=\"https://github.com/sonic-pi-net/sonic-pi/blob/main/TRANSLATION.md\">" +
67-
"Please consider helping to translate Sonic Pi to your language.</a> "
68-
);
69-
go_translate->setTextFormat(Qt::RichText);
70-
translation_box_layout->addWidget(go_translate);
71-
translation_box->setLayout(translation_box_layout);
72-
73-
grid->addWidget(translation_box, 3, 0, 1, 2);
55+
if (piSettings->language == "system_language") {
56+
if (!sonicPii18n->isSystemLanguageAvailable()) {
57+
QGroupBox *translation_box = new QGroupBox("Translation");
58+
QVBoxLayout *translation_box_layout = new QVBoxLayout;
59+
QLabel *go_translate = new QLabel;
60+
go_translate->setOpenExternalLinks(true);
61+
go_translate->setText(
62+
"Sonic Pi hasn't been translated to " +
63+
QLocale::languageToString(QLocale::system().language()) +
64+
" yet.<br/>" +
65+
"We rely on crowdsourcing to help create and maintain translations.<br/>" +
66+
"<a href=\"https://github.com/sonic-pi-net/sonic-pi/blob/main/TRANSLATION.md\">" +
67+
"Please consider helping to translate Sonic Pi to your language.</a> "
68+
);
69+
go_translate->setTextFormat(Qt::RichText);
70+
translation_box_layout->addWidget(go_translate);
71+
translation_box->setLayout(translation_box_layout);
72+
73+
grid->addWidget(translation_box, 3, 0, 1, 2);
74+
}
7475
}
76+
7577
settingsChanged();
7678
connectAll();
7779
setLayout(grid);
@@ -491,17 +493,20 @@ QGroupBox* SettingsWidget::createLanguagePrefsTab() {
491493

492494
language_combo = new QComboBox();
493495
add_language_combo_box_entries(language_combo);
494-
language_combo->setToolTip(tr("Change the language of the UI & Tutorial (Requires a restart to take effect)"));
496+
language_combo->setToolTip(tr("Change the language of the UI & Tutorial"));
495497
language_combo->setMinimumContentsLength(2);
496498
language_combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
497499

500+
language_details_label = new QLabel;
501+
498502
language_info_label = new QLabel;
499503
language_info_label->setText(tr("Translations have been generously provided by volunteers \non https://hosted.weblate.org/projects/sonic-pi/. Thank you! :)"));
500504

501505
QVBoxLayout *language_box_layout = new QVBoxLayout;
502506

503507
language_box_layout->addWidget(language_option_label);
504508
language_box_layout->addWidget(language_combo);
509+
language_box_layout->addWidget(language_details_label);
505510
language_box_layout->addWidget(language_info_label);
506511

507512
language_box->setLayout(language_box_layout);
@@ -572,22 +577,46 @@ void SettingsWidget::updateUILanguage(int index) {
572577

573578
QMessageBox msgBox(this);
574579
msgBox.setText(QString(tr("You've selected a new language: %1")).arg(new_lang));
575-
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.");
580+
QString info_text = (
581+
tr("Do you want to apply this language?")
582+
+ "\n"
583+
+ tr("The new language will be applied when you next start Sonic Pi.")
584+
);
576585

577586
if (lang == "system_language") {
578-
info_text = tr("System languages found %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->system_languages).join(", ")) + "\n" + info_text;
587+
info_text = tr("System languages found: %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->getSystemLanguages()).join(", ")) + "\n" + info_text;
579588
}
580589

581590
msgBox.setInformativeText(info_text);
582-
QPushButton *restartButton = msgBox.addButton(tr("Apply and Restart"), QMessageBox::ActionRole);
591+
QPushButton *applyButton = msgBox.addButton(tr("Apply"), QMessageBox::ActionRole);
583592
QPushButton *dismissButton = msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
584-
msgBox.setDefaultButton(restartButton);
585-
msgBox.setIcon(QMessageBox::Information);
593+
msgBox.setDefaultButton(applyButton);
594+
msgBox.setIcon(QMessageBox::Question);
586595
msgBox.exec();
587596

588-
if (msgBox.clickedButton() == (QAbstractButton*)restartButton) {
589-
piSettings->language = lang;
597+
if (msgBox.clickedButton() == (QAbstractButton*)applyButton) {
598+
piSettings->language = lang;
599+
updateSelectedUILanguage(piSettings->language);
600+
emit uiLanguageChanged(piSettings->language);
601+
602+
language_details_label->setText(
603+
tr("<b>The new language will be applied when you next start Sonic Pi.</b>")
604+
+ " "
605+
+ tr("Current UI language: %1").arg(sonicPii18n->getNativeLanguageName(sonicPii18n->currentlyLoadedLanguage()))
606+
);
607+
608+
QMessageBox restartMsgBox(this);
609+
restartMsgBox.setText(QString(tr("Restart Sonic Pi?")));
610+
QString info_text = (tr("Do you want to restart Sonic Pi now? This will stop any current runs & recordings."));
611+
QPushButton *restartButton = restartMsgBox.addButton(tr("Restart"), QMessageBox::ActionRole);
612+
QPushButton *dismissButton = restartMsgBox.addButton(tr("Dismiss"), QMessageBox::RejectRole);
613+
restartMsgBox.setInformativeText(info_text);
614+
restartMsgBox.setDefaultButton(dismissButton);
615+
restartMsgBox.setIcon(QMessageBox::Question);
616+
restartMsgBox.exec();
617+
if (restartMsgBox.clickedButton() == (QAbstractButton*)restartButton) {
590618
emit restartApp();
619+
}
591620
//emit uiLanguageChanged(lang);
592621
} else if (msgBox.clickedButton() == (QAbstractButton*)dismissButton) {
593622
// Don't apply the new language settings
@@ -779,9 +808,8 @@ void SettingsWidget::updateSettings() {
779808
void SettingsWidget::settingsChanged() {
780809
language_combo->setCurrentIndex(available_languages.indexOf(piSettings->language));
781810
if (piSettings->language == "system_language") {
782-
language_info_label->setText(
783-
tr("System languages: %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->system_languages).join(", ")) + "\n" + tr("Current UI language: %1").arg(sonicPii18n->getNativeLanguageName(sonicPii18n->currently_loaded_language))
784-
+ "\n\n" + tr("Translations have been generously provided by volunteers \non https://hosted.weblate.org/projects/sonic-pi/. Thank you! :)")
811+
language_details_label->setText(
812+
tr("System languages: %1").arg(sonicPii18n->getNativeLanguageNames(sonicPii18n->getSystemLanguages()).join(", ")) + "\n" + tr("Current UI language: %1").arg(sonicPii18n->getNativeLanguageName(sonicPii18n->currentlyLoadedLanguage()))
785813
);
786814
}
787815

app/gui/qt/widgets/settingswidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ private slots:
168168

169169
QComboBox *language_combo;
170170
QLabel *language_option_label;
171+
QLabel *language_details_label;
171172
QLabel *language_info_label;
172173

173174
// TODO

0 commit comments

Comments
 (0)