Skip to content

Commit 18d6ce6

Browse files
committed
Fix bugs, enable all language translations
1 parent a36be4d commit 18d6ce6

File tree

12 files changed

+144
-130
lines changed

12 files changed

+144
-130
lines changed

app/gui/qt/SonicPi.qrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@
190190
<file>lang/sonic-pi_ug.qm</file>
191191
<file>lang/sonic-pi_uk.qm</file>
192192
<file>lang/sonic-pi_vi.qm</file>
193-
<file>lang/sonic-pi_zh-Hans.qm</file>
193+
<file>lang/sonic-pi_zh_Hans.qm</file>
194194
<file>lang/sonic-pi_zh_HK.qm</file>
195195
<file>lang/sonic-pi_zh.qm</file>
196196
<file>lang/sonic-pi_zh_TW.qm</file>
File renamed without changes.

app/gui/qt/main.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
#include <QPixmap>
1919
#include <QBitmap>
2020
#include <QLabel>
21-
#include <QTranslator>
22-
#include <QSettings>
2321
#include <QLibraryInfo>
2422

2523
#include "mainwindow.h"

app/gui/qt/mainwindow.cpp

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ MainWindow::MainWindow(QApplication &app, QSplashScreen* splash)
150150
initProcess->waitForFinished();
151151

152152
// Throw all stdout into ~/.sonic-pi/log/gui.log
153-
//setupLogPathAndRedirectStdOut();
153+
setupLogPathAndRedirectStdOut();
154154

155155
std::cout << "[GUI] - Welcome to the Sonic Pi GUI" << std::endl;
156156
std::cout << "[GUI] - ===========================" << std::endl;
@@ -1940,39 +1940,41 @@ void MainWindow::changeSystemPreAmp(int val, int silent)
19401940
statusBar()->showMessage(tr("Updating System Volume..."), 2000);
19411941
}
19421942

1943+
// TODO: Implement real-time language switching
19431944
void MainWindow::changeUILanguage(QString lang) {
19441945
if (lang != piSettings->language) {
1945-
std::cout << "New language selected: " << lang.toUtf8().constData() << std::endl;
1946-
QString old_lang = sonicPii18n->getNativeLanguageName(piSettings->language);
1947-
QString new_lang = sonicPii18n->getNativeLanguageName(lang);
1948-
1949-
// Load new language
1950-
//QString language = sonicPii18n->determineUILanguage(lang);
1951-
//sonicPii18n->loadTranslations(language);
1952-
//QString title_new = tr("Updated the UI language from %s to %s").arg();
1953-
1954-
QMessageBox msgBox(this);
1955-
msgBox.setText(tr("You've selected a new language: %s").arg(new_lang));
1956-
msgBox.setInformativeText(tr("Do you want to apply these new settings?\nApplying the new language will restart Sonic Pi."));
1957-
QPushButton *restartButton = msgBox.addButton(tr("Apply & Restart"), QMessageBox::ActionRole);
1958-
QPushButton *dismissButton = msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1959-
msgBox.setDefaultButton(restartButton);
1960-
msgBox.setIcon(QMessageBox::Information);
1961-
msgBox.exec();
1962-
1963-
if (msgBox.clickedButton() == (QAbstractButton*)restartButton) {
1964-
piSettings->language = lang;
1965-
writeSettings();
1966-
restartApp();
1967-
//statusBar()->showMessage(tr("Updated UI language setting, please restart Sonic Pi to apply it"), 2000);
1968-
} else if (msgBox.clickedButton() == (QAbstractButton*)dismissButton) {
1969-
settingsWidget->updateSelectedUILanguage(piSettings->language);
1970-
}
1946+
std::cout << "Current language: " << piSettings->language.toUtf8().constData() << std::endl;
1947+
std::cout << "New language selected: " << lang.toUtf8().constData() << std::endl;
1948+
QString old_lang = sonicPii18n->getNativeLanguageName(piSettings->language);
1949+
QString new_lang = sonicPii18n->getNativeLanguageName(lang);
1950+
1951+
// Load new language
1952+
//QString language = sonicPii18n->determineUILanguage(lang);
1953+
//sonicPii18n->loadTranslations(language);
1954+
//QString title_new = tr("Updated the UI language from %s to %s").arg();
1955+
1956+
QMessageBox msgBox(this);
1957+
msgBox.setText(QString(tr("You've selected a new language: %1")).arg(new_lang));
1958+
msgBox.setInformativeText(tr("Do you want to apply this language?\nApplying the new language will restart Sonic Pi."));
1959+
QPushButton *restartButton = msgBox.addButton(tr("Apply and Restart"), QMessageBox::ActionRole);
1960+
QPushButton *dismissButton = msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1961+
msgBox.setDefaultButton(restartButton);
1962+
msgBox.setIcon(QMessageBox::Information);
1963+
msgBox.exec();
1964+
1965+
if (msgBox.clickedButton() == (QAbstractButton*)restartButton) {
1966+
piSettings->language = lang;
1967+
writeSettings();
1968+
restartApp();
1969+
//statusBar()->showMessage(tr("Updated UI language setting, please restart Sonic Pi to apply it"), 2000);
1970+
} else if (msgBox.clickedButton() == (QAbstractButton*)dismissButton) {
1971+
// Don't apply the new language settings
1972+
settingsWidget->updateSelectedUILanguage(piSettings->language);
1973+
}
19711974

1972-
// Load previously set language
1973-
//sonicPii18n->loadTranslations(ui_language);
1975+
// Load previously set language
1976+
//sonicPii18n->loadTranslations(ui_language);
19741977
}
1975-
19761978
}
19771979

19781980

@@ -3912,6 +3914,8 @@ void MainWindow::updateContext(int line, int index){
39123914

39133915
}
39143916

3917+
// TODO: Implement real-time language switching
3918+
// This is currently unused, but put in place to aid in implementing real-time language switching in the future
39153919
void MainWindow::updateTranslatedUIText() {
39163920
// Widget titles
39173921
prefsWidget->setWindowTitle(tr("Preferences"));

app/gui/qt/mainwindow.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ class MainWindow : public QMainWindow
296296

297297
// void initPrefsWindow();
298298
void initDocsWindow(QString language);
299+
void addTutorialDocsTab(QString lang);
299300
void addLangDocsTab();
300301
void addSynthDocsTab();
301302
void addFXDocsTab();
@@ -324,8 +325,6 @@ class MainWindow : public QMainWindow
324325
void addUniversalCopyShortcuts(QTextEdit *te);
325326
void updateTranslatedUIText();
326327

327-
void restartApp();
328-
329328
QMenu *liveMenu, *codeMenu, *audioMenu, *displayMenu, *viewMenu, *ioMenu, *ioMidiInMenu, *ioMidiOutMenu, *ioMidiOutChannelMenu, *localIpAddressesMenu, *themeMenu, *scopeKindVisibilityMenu;
330329

331330
SonicPiSettings *piSettings;

app/gui/qt/ruby_help.tmpl

Lines changed: 0 additions & 18 deletions
This file was deleted.

app/gui/qt/utils/lang_list.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@
2121
std::map<QString, QString> SonicPii18n::native_language_names = {
2222
{"system_locale", ""},
2323
{"bg", "български"},
24+
{"bn", "বাংলা"},
2425
{"bs", "Bosanski/босански"},
2526
{"ca", "Català"},
27+
{"ca@valencia", "Valencià"},
2628
{"cs", "Čeština"},
2729
{"da", "Dansk"},
2830
{"de", "Deutsch"},
2931
{"el", "ελληνικά"},
30-
{"en-GB", "English (UK)"},
31-
{"en-US", "English (US)"},
32+
{"en_AU", "English (Australian)"},
33+
{"en_GB", "English (UK)"},
34+
{"en_US", "English (US)"},
35+
{"eo", "Esperanto"},
3236
{"es", "Español"},
3337
{"et", "Eesti keel"},
3438
{"fa", "فارسی"},
@@ -50,22 +54,22 @@ std::map<QString, QString> SonicPii18n::native_language_names = {
5054
{"nl", "Nederlands"},
5155
{"pl", "Polski"},
5256
{"pt", "Português"},
53-
{"pt-BR", "Português do Brasil"},
57+
{"pt_BR", "Português do Brasil"},
5458
{"ro", "Română"},
5559
{"ru", "Pусский"},
5660
{"si", "සිංහල"},
5761
{"sk", "Slovenčina"},
5862
{"sl", "Slovenščina"},
5963
{"sv", "Svenska"},
6064
{"sw", "Kiswahili"},
61-
{"ti", "ไทย"},
65+
{"th", "ไทย"},
6266
{"tr", "Türkçe"},
6367
{"ug", "ئۇيغۇر تىلى"},
6468
{"uk", "Українська"},
6569
{"vi", "Tiếng Việt"},
66-
{"zh", "繁體中文"},
67-
{"zh-Hans", "简体中文"},
68-
{"zh-Hk", "廣東話"},
69-
{"zh-TW", "臺灣華語"}
70+
{"zh", "简体中文"},
71+
{"zh_Hans", "简体中文"},
72+
{"zh_HK", "廣東話"},
73+
{"zh_TW", "臺灣華語"}
7074
};
7175
#endif

app/gui/qt/utils/sonic_pi_i18n.cpp

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
#include <QString>
33
#include <QStringList>
44
#include <QLocale>
5-
#include <QLanguage>
65
#include <QTranslator>
7-
#include <QMainWindow>
86
#include <QApplication>
97
#include <QLibraryInfo>
108

@@ -16,11 +14,29 @@
1614
SonicPii18n::SonicPii18n(QString rootpath) {
1715
this->root_path = rootpath;
1816
this->available_languages = findAvailableLanguages();
17+
// Set to true unless we can't load the system language
18+
this->system_language_available = true;
19+
20+
// // Print all Qt's language codes for debugging
21+
// QList<QLocale> allLocales = QLocale::matchingLocales(
22+
// QLocale::AnyLanguage,
23+
// QLocale::AnyScript,
24+
// QLocale::AnyCountry);
25+
// QStringList iso639LanguageCodes;
26+
//
27+
// for(const QLocale &locale : allLocales) {
28+
// iso639LanguageCodes << locale.name();
29+
// }
30+
//
31+
// std::cout << iso639LanguageCodes.join("\n").toUtf8().constData() << std::endl;
32+
}
33+
34+
SonicPii18n::~SonicPii18n() {
1935
}
2036

2137
QString SonicPii18n::determineUILanguage(QString lang_pref) {
2238
QStringList available_languages = getAvailableLanguages();
23-
std::cout << available_languages.join("\n").toUtf8().constData() << '\n';
39+
std::cout << available_languages.join("\n").toUtf8().constData() << std::endl;
2440
QLocale locale;
2541

2642
if (lang_pref != "system_locale") {
@@ -34,22 +50,28 @@ QString SonicPii18n::determineUILanguage(QString lang_pref) {
3450
general_name.truncate(general_name.lastIndexOf('-'));
3551

3652
if (available_languages.contains(general_name)) {
37-
return lang_pref;
53+
return general_name;
3854
}
3955
} else {
4056
QStringList preferred_languages = locale.uiLanguages();
4157
// If the specified language isn't available, or if the setting is set to system_locale...
4258
// ...run through the list of preferred languages
4359
std::cout << "Looping through preferred ui languages" << std::endl;
4460

61+
QString l;
4562
for (int i = 0; i < preferred_languages.length(); i += 1) {
46-
if (available_languages.contains(preferred_languages[i])) {
47-
return lang_pref;
63+
l = preferred_languages[i];
64+
l.replace("-", "_");
65+
66+
std::cout << preferred_languages[i].toUtf8().constData() << std::endl;
67+
if (available_languages.contains(l)) {
68+
return l;
4869
}
4970
}
5071
}
5172

52-
// Fallback to English
73+
// Fpreferred_languages[i]preferred_languages[i]preferred_languages[i]allback to English
74+
this->system_language_available = false;
5375
return "en";
5476
}
5577

@@ -65,12 +87,16 @@ QStringList SonicPii18n::findAvailableLanguages() {
6587
for (int i = 0; i < fileNames.size(); ++i) {
6688
// get locale extracted by filename
6789
QString locale;
68-
locale = fileNames[i]; // "TranslationExample_de.qm"
69-
locale.truncate(locale.lastIndexOf('.')); // "TranslationExample_de"
70-
locale.remove(0, locale.lastIndexOf("sonic-pi_") + 9); // "de"
90+
locale = fileNames[i]; // "sonic-pi_pt_BR.qm"
91+
locale.truncate(locale.lastIndexOf('.')); // "sonic-pi_pt_BR"
92+
locale.remove(0, locale.lastIndexOf("sonic-pi_") + 9); // "pt_BR"
93+
//locale.replace("_", "-"); // Replace underscores with dashes so it matches the language codes e.g: "pt-BR"
7194
std::cout << locale.toUtf8().constData() << '\n';
7295
languages << locale;
7396
}
97+
// Add the source language
98+
languages << "en_GB";
99+
languages.sort();
74100
return languages;
75101
}
76102

@@ -99,25 +125,29 @@ bool SonicPii18n::loadTranslations(QString lang) {
99125
}
100126

101127
QStringList SonicPii18n::getAvailableLanguages() {
102-
return self->available_languages;
128+
return this->available_languages;
103129
}
104130

105-
static std::map<QString, QString> SonicPii18n::getLanguageNameList() {
106-
return self->native_language_names;
131+
std::map<QString, QString> SonicPii18n::getNativeLanguageNameList() {
132+
return native_language_names;
107133
}
108134

109-
static QString SonicPii18n::getNativeLanguageName(QString lang) {
110-
if (native_language_names.contains(lang))
111-
return self->native_language_names[lang];
112-
else if (lang == "system_locale") {
113-
return tr("System language")
135+
QString SonicPii18n::getNativeLanguageName(QString lang) {
136+
std::map<QString, QString>::iterator it = native_language_names.find(lang);
137+
if(it != native_language_names.end()) {
138+
// language found
139+
return native_language_names[lang];
140+
} else if (lang == "system_locale") {
141+
return tr("System language");
114142
} else {
143+
std::cout << "Warning: Predefined language name not found'" << lang.toUtf8().constData() << "'" << std::endl;
115144
// Try using QLocale to find the native language name
116145
QLocale locale(lang);
117-
if (locale.language != QLanguage::C) {
146+
QString name = locale.nativeLanguageName();
147+
if (name != "C" && name != "") {
118148
return locale.nativeLanguageName();
119149
} else {
120-
std::cout << "Warning: Invalid language code '" << lang.toUtf8().constData() << "'" << std:endl;
150+
std::cout << "Warning: Invalid language code '" << lang.toUtf8().constData() << "'" << std::endl;
121151
return lang;
122152
}
123153
}

app/gui/qt/utils/sonic_pi_i18n.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@
2020
class SonicPii18n : public QObject {
2121
public:
2222
SonicPii18n(QString rootpath);
23+
~SonicPii18n();
2324

2425
public slots:
2526
QString determineUILanguage(QString lang_pref);
2627
QStringList getAvailableLanguages();
27-
static std::map<QString, QString> getLanguageNameList();
28-
static QString getNativeLanguageName(QString lang);
28+
std::map<QString, QString> getNativeLanguageNameList();
29+
QString getNativeLanguageName(QString lang);
2930
bool loadTranslations(QString lang);
31+
32+
bool system_language_available;
3033

3134
private:
3235
QString root_path;
@@ -36,7 +39,5 @@ public slots:
3639
static std::map<QString, QString> native_language_names;
3740

3841
QStringList findAvailableLanguages();
39-
40-
4142
};
4243
#endif

0 commit comments

Comments
 (0)