From: Soeren Apel Date: Mon, 11 Nov 2019 20:18:42 +0000 (+0100) Subject: Add language chooser widget and handling X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=380f4ee6f9e2995084afd395698b7eafc7012942;p=pulseview.git Add language chooser widget and handling --- diff --git a/pv/application.cpp b/pv/application.cpp index e933f962..67e0444f 100644 --- a/pv/application.cpp +++ b/pv/application.cpp @@ -21,6 +21,9 @@ #include #include +#include +#include +#include #include @@ -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) diff --git a/pv/application.hpp b/pv/application.hpp index a653ab45..78b2f9ec 100644 --- a/pv/application.hpp +++ b/pv/application.hpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -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); diff --git a/pv/dialogs/settings.cpp b/pv/dialogs/settings.cpp index 9854af4f..3b4d67de 100644 --- a/pv/dialogs/settings.cpp +++ b/pv/dialogs/settings.cpp @@ -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(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& 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(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(); } diff --git a/pv/dialogs/settings.hpp b/pv/dialogs/settings.hpp index 9aff1f13..50f3be65 100644 --- a/pv/dialogs/settings.hpp +++ b/pv/dialogs/settings.hpp @@ -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);