]> sigrok.org Git - pulseview.git/commitdiff
Add language chooser widget and handling
authorSoeren Apel <redacted>
Mon, 11 Nov 2019 20:18:42 +0000 (21:18 +0100)
committerSoeren Apel <redacted>
Mon, 13 Jan 2020 21:51:02 +0000 (22:51 +0100)
pv/application.cpp
pv/application.hpp
pv/dialogs/settings.cpp
pv/dialogs/settings.hpp

index e933f96214d94c72620a088f7e766e8a675b574b..67e0444f435b53fa8c67ae3f51a6058db0ba7e37 100644 (file)
@@ -21,6 +21,9 @@
 #include <typeinfo>
 
 #include <QDebug>
+#include <QDir>
+#include <QMessageBox>
+#include <QWidget>
 
 #include <boost/version.hpp>
 
@@ -61,6 +64,22 @@ Application::Application(int &argc, char* argv[]) :
        setOrganizationDomain("sigrok.org");
 }
 
+QStringList Application::get_languages()
+{
+       QStringList files = QDir(":/l10n/").entryList(QStringList("*.qm"), QDir::Files);
+
+       QStringList result;
+       result << "en";  // Add default language to the set
+
+       // Remove file extensions
+       for (QString file : files)
+               result << file.split(".").front();
+
+       result.sort(Qt::CaseInsensitive);
+
+       return result;
+}
+
 void Application::switch_language(const QString& language)
 {
        removeTranslator(&app_translator_);
@@ -81,6 +100,20 @@ void Application::switch_language(const QString& language)
                else
                        qWarning() << "Translation resource" << resource << "not found";
        }
+
+       if (!topLevelWidgets().empty()) {
+               // Force all windows to update
+               for (QWidget *widget : topLevelWidgets())
+                       widget->update();
+
+               QMessageBox msg(topLevelWidgets().front());
+               msg.setText(tr("Some parts of the application may still " \
+                               "use the previous language. Re-opening the affected windows or " \
+                               "restarting the application will remedy this."));
+               msg.setStandardButtons(QMessageBox::Ok);
+               msg.setIcon(QMessageBox::Information);
+               msg.exec();
+       }
 }
 
 void Application::on_setting_changed(const QString &key, const QVariant &value)
index a653ab45c7d9e2c5a82050295480f6f0fe9d9f02..78b2f9ec50571dc0b28e65793314c374f15d0d66 100644 (file)
@@ -23,6 +23,7 @@
 #include <vector>
 
 #include <QApplication>
+#include <QStringList>
 #include <QTranslator>
 
 #include <libsigrokcxx/libsigrokcxx.hpp>
@@ -40,6 +41,7 @@ class Application : public QApplication, public pv::GlobalSettingsInterface
 public:
        Application(int &argc, char* argv[]);
 
+       QStringList get_languages();
        void switch_language(const QString& language);
        void on_setting_changed(const QString &key, const QVariant &value);
 
index 9854af4fe67a8b2a2e5712154435fb19a17f48cc..3b4d67de766fde17814116083e92eba9a70d7a22 100644 (file)
@@ -216,6 +216,26 @@ QWidget *Settings::get_general_settings_form(QWidget *parent) const
        QFormLayout *general_layout = new QFormLayout();
        general_group->setLayout(general_layout);
 
+       // Generate language combobox
+       QComboBox *language_cb = new QComboBox();
+       Application* a = qobject_cast<Application*>(QApplication::instance());
+
+       QString current_language = settings.value(GlobalSettings::Key_General_Language).toString();
+       for (QString language : a->get_languages()) {
+               QLocale locale = QLocale(language);
+               QString desc = locale.languageToString(locale.language());
+               language_cb->addItem(desc, language);
+
+               if (language == current_language) {
+                       int index = language_cb->findText(desc, Qt::MatchFixedString);
+                       language_cb->setCurrentIndex(index);
+               }
+       }
+       connect(language_cb, SIGNAL(currentIndexChanged(const QString&)),
+               this, SLOT(on_general_language_changed(const QString&)));
+       general_layout->addRow(tr("User interface language"), language_cb);
+
+       // Theme combobox
        QComboBox *theme_cb = new QComboBox();
        for (const pair<QString, QString>& entry : Themes)
                theme_cb->addItem(entry.first, entry.second);
@@ -223,13 +243,14 @@ QWidget *Settings::get_general_settings_form(QWidget *parent) const
        theme_cb->setCurrentIndex(
                settings.value(GlobalSettings::Key_General_Theme).toInt());
        connect(theme_cb, SIGNAL(currentIndexChanged(int)),
-               this, SLOT(on_general_theme_changed_changed(int)));
+               this, SLOT(on_general_theme_changed(int)));
        general_layout->addRow(tr("User interface theme"), theme_cb);
 
        QLabel *description_1 = new QLabel(tr("(You may need to restart PulseView for all UI elements to update)"));
        description_1->setAlignment(Qt::AlignRight);
        general_layout->addRow(description_1);
 
+       // Style combobox
        QComboBox *style_cb = new QComboBox();
        style_cb->addItem(tr("System Default"), "");
        for (QString& s : QStyleFactory::keys())
@@ -250,6 +271,7 @@ QWidget *Settings::get_general_settings_form(QWidget *parent) const
        description_2->setAlignment(Qt::AlignRight);
        general_layout->addRow(description_2);
 
+       // Misc
        cb = create_checkbox(GlobalSettings::Key_General_SaveWithSetup,
                SLOT(on_general_save_with_setup_changed(int)));
        general_layout->addRow(tr("Save session &setup along with .sr file"), cb);
@@ -583,10 +605,24 @@ void Settings::on_page_changed(QListWidgetItem *current, QListWidgetItem *previo
        pages->setCurrentIndex(page_list->row(current));
 }
 
-void Settings::on_general_theme_changed_changed(int state)
+void Settings::on_general_language_changed(const QString &text)
+{
+       GlobalSettings settings;
+       Application* a = qobject_cast<Application*>(QApplication::instance());
+
+       for (QString language : a->get_languages()) {
+               QLocale locale = QLocale(language);
+               QString desc = locale.languageToString(locale.language());
+
+               if (text == desc)
+                       settings.setValue(GlobalSettings::Key_General_Language, language);
+       }
+}
+
+void Settings::on_general_theme_changed(int value)
 {
        GlobalSettings settings;
-       settings.setValue(GlobalSettings::Key_General_Theme, state);
+       settings.setValue(GlobalSettings::Key_General_Theme, value);
        settings.apply_theme();
 
        QMessageBox msg(this);
@@ -608,15 +644,15 @@ void Settings::on_general_theme_changed_changed(int state)
        }
 }
 
-void Settings::on_general_style_changed(int state)
+void Settings::on_general_style_changed(int value)
 {
        GlobalSettings settings;
 
-       if (state == 0)
+       if (value == 0)
                settings.setValue(GlobalSettings::Key_General_Style, "");
        else
                settings.setValue(GlobalSettings::Key_General_Style,
-                       QStyleFactory::keys().at(state - 1));
+                       QStyleFactory::keys().at(value - 1));
 
        settings.apply_theme();
 }
index 9aff1f137f0a2bcac155e60c76c8bb2ac70cb35d..50f3be65c51fe9fb97569f917034c501c85f5220 100644 (file)
@@ -58,8 +58,9 @@ public:
 
 private Q_SLOTS:
        void on_page_changed(QListWidgetItem *current, QListWidgetItem *previous);
-       void on_general_theme_changed_changed(int state);
-       void on_general_style_changed(int state);
+       void on_general_language_changed(const QString &text);
+       void on_general_theme_changed(int value);
+       void on_general_style_changed(int value);
        void on_general_save_with_setup_changed(int state);
        void on_view_zoomToFitDuringAcq_changed(int state);
        void on_view_zoomToFitAfterAcq_changed(int state);