Skip to content

Commit

Permalink
GUI - Give the user the option whether or not to restart Sonic Pi whe…
Browse files Browse the repository at this point in the history
…n changing the language

Also clean up/refactor SonicPii18n class
  • Loading branch information
SunderB committed Mar 21, 2021
1 parent 6dc0e9c commit 6780ea2
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 50 deletions.
37 changes: 22 additions & 15 deletions app/gui/qt/utils/sonicpi_i18n.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -132,9 +131,17 @@ QStringList SonicPii18n::getAvailableLanguages() {
return list;
}

std::map<QString, QString> 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") {
Expand All @@ -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;
}
}
Expand Down
18 changes: 13 additions & 5 deletions app/gui/qt/utils/sonicpi_i18n.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<QString, QString> 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<QString, QString> native_language_names;

QStringList findAvailableLanguages();
Expand Down
88 changes: 58 additions & 30 deletions app/gui/qt/widgets/settingswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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.<br/>" +
"We rely on crowdsourcing to help create and maintain translations.<br/>" +
"<a href=\"https://github.com/sonic-pi-net/sonic-pi/blob/main/TRANSLATION.md\">" +
"Please consider helping to translate Sonic Pi to your language.</a> "
);
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.<br/>" +
"We rely on crowdsourcing to help create and maintain translations.<br/>" +
"<a href=\"https://github.com/sonic-pi-net/sonic-pi/blob/main/TRANSLATION.md\">" +
"Please consider helping to translate Sonic Pi to your language.</a> "
);
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);
Expand Down Expand Up @@ -491,17 +493,20 @@ 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! :)"));

QVBoxLayout *language_box_layout = new QVBoxLayout;

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);
Expand Down Expand Up @@ -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("<b>The new language will be applied when you next start Sonic Pi.</b>")
+ " "
+ 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
Expand Down Expand Up @@ -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()))
);
}

Expand Down
1 change: 1 addition & 0 deletions app/gui/qt/widgets/settingswidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ private slots:

QComboBox *language_combo;
QLabel *language_option_label;
QLabel *language_details_label;
QLabel *language_info_label;

// TODO
Expand Down

0 comments on commit 6780ea2

Please sign in to comment.