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
1614SonicPii18n::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
2137QString 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
101127QStringList 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 }
0 commit comments