X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fapplication.cpp;h=cce6393c39054fb4a961fdc1bd789863e9495d69;hp=1bc844a4420c98ccbcfb289ef3db40bedc589013;hb=HEAD;hpb=2e2ddbe9fdfff5e90faacc81607d29b515a43e36 diff --git a/pv/application.cpp b/pv/application.cpp index 1bc844a4..cce6393c 100644 --- a/pv/application.cpp +++ b/pv/application.cpp @@ -17,13 +17,14 @@ * along with this program; if not, see . */ -#include "application.hpp" -#include "config.h" - #include #include #include +#include +#include +#include +#include #include @@ -35,6 +36,12 @@ #include #endif +#include + +#include "application.hpp" +#include "config.h" +#include "globalsettings.hpp" + using std::cout; using std::endl; using std::exception; @@ -60,13 +67,96 @@ Application::Application(int &argc, char* argv[]) : setOrganizationDomain("sigrok.org"); } -void Application::collect_version_info(shared_ptr context) +const QStringList Application::get_languages() const +{ + const QStringList files = QDir(":/l10n/").entryList(QStringList("*.qm"), QDir::Files); + + QStringList result; + result << "en"; // Add default language to the set + + // Remove file extensions + for (const QString& file : files) + result << file.split(".").front(); + + result.sort(Qt::CaseInsensitive); + + return result; +} + +const QString Application::get_language_editors(const QString& language) const +{ + if (language == "de") return "Sören Apel, Uwe Hermann"; + if (language == "es_MX") return "Carlos Diaz, Ulices Avila Hernandez"; + if (language == "ja_jp") return "Yukari Shoji"; + if (language == "zh_cn") return "ZtyPro"; + + return QString(); +} + +void Application::switch_language(const QString& language) +{ + removeTranslator(&app_translator_); + removeTranslator(&qt_translator_); + removeTranslator(&qtbase_translator_); + + if ((language != "C") && (language != "en")) { + // Application translations + QString resource = ":/l10n/" + language +".qm"; + if (app_translator_.load(resource)) + installTranslator(&app_translator_); + else + qWarning() << "Translation resource" << resource << "not found"; + + // Qt translations +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QString tr_path(QLibraryInfo::path(QLibraryInfo::TranslationsPath)); +#else + QString tr_path(QLibraryInfo::location(QLibraryInfo::TranslationsPath)); +#endif + + if (qt_translator_.load("qt_" + language, tr_path)) + installTranslator(&qt_translator_); + else + qWarning() << "QT translations for" << language << "not found at" << + tr_path << ", Qt translations package is probably missing"; + + // Qt base translations + if (qtbase_translator_.load("qtbase_" + language, tr_path)) + installTranslator(&qtbase_translator_); + else + qWarning() << "QT base translations for" << language << "not found at" << + tr_path << ", Qt translations package is probably missing"; + } + + 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) +{ + if (key == pv::GlobalSettings::Key_General_Language) + switch_language(value.toString()); +} + +void Application::collect_version_info(pv::DeviceManager &device_manager) { // Library versions and features version_info_.emplace_back(applicationName(), applicationVersion()); version_info_.emplace_back("Qt", qVersion()); version_info_.emplace_back("glibmm", PV_GLIBMM_VERSION); version_info_.emplace_back("Boost", BOOST_LIB_VERSION); + version_info_.emplace_back("exprtk", QString::fromUtf8(exprtk::information::date)); version_info_.emplace_back("libsigrok", QString("%1/%2 (rt: %3/%4)") .arg(SR_PACKAGE_VERSION_STRING, SR_LIB_VERSION_STRING, @@ -115,29 +205,30 @@ void Application::collect_version_info(shared_ptr context) // Firmware paths l_orig = sr_resourcepaths_get(SR_RESOURCE_FIRMWARE); for (GSList *l = l_orig; l; l = l->next) - fw_path_list_.push_back(QString((char*)l->data)); + fw_path_list_.emplace_back((char*)l->data); g_slist_free_full(l_orig, g_free); // PD paths #ifdef ENABLE_DECODE l_orig = srd_searchpaths_get(); for (GSList *l = l_orig; l; l = l->next) - pd_path_list_.push_back(QString((char*)l->data)); + pd_path_list_.emplace_back((char*)l->data); g_slist_free_full(l_orig, g_free); #endif // Device drivers - for (auto entry : context->drivers()) - driver_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), - QString::fromUtf8(entry.second->long_name().c_str())); + for (auto& entry : device_manager.context()->drivers()) + if (device_manager.driver_supported(entry.second)) + driver_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), + QString::fromUtf8(entry.second->long_name().c_str())); // Input formats - for (auto entry : context->input_formats()) + for (auto& entry : device_manager.context()->input_formats()) input_format_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), QString::fromUtf8(entry.second->description().c_str())); // Output formats - for (auto entry : context->output_formats()) + for (auto& entry : device_manager.context()->output_formats()) output_format_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), QString::fromUtf8(entry.second->description().c_str())); @@ -159,35 +250,35 @@ void Application::print_version_info() cout << PV_TITLE << " " << PV_VERSION_STRING << endl; cout << endl << "Libraries and features:" << endl; - for (pair &entry : version_info_) + for (pair& entry : version_info_) cout << " " << entry.first.toStdString() << " " << entry.second.toStdString() << endl; cout << endl << "Firmware search paths:" << endl; - for (QString &entry : fw_path_list_) + for (QString& entry : fw_path_list_) cout << " " << entry.toStdString() << endl; cout << endl << "Protocol decoder search paths:" << endl; - for (QString &entry : pd_path_list_) + for (QString& entry : pd_path_list_) cout << " " << entry.toStdString() << endl; cout << endl << "Supported hardware drivers:" << endl; - for (pair &entry : driver_list_) + for (pair& entry : driver_list_) cout << " " << entry.first.leftJustified(21, ' ').toStdString() << entry.second.toStdString() << endl; cout << endl << "Supported input formats:" << endl; - for (pair &entry : input_format_list_) + for (pair& entry : input_format_list_) cout << " " << entry.first.leftJustified(21, ' ').toStdString() << entry.second.toStdString() << endl; cout << endl << "Supported output formats:" << endl; - for (pair &entry : output_format_list_) + for (pair& entry : output_format_list_) cout << " " << entry.first.leftJustified(21, ' ').toStdString() << entry.second.toStdString() << endl; #ifdef ENABLE_DECODE cout << endl << "Supported protocol decoders:" << endl; - for (pair &entry : pd_list_) + for (pair& entry : pd_list_) cout << " " << entry.first.leftJustified(21, ' ').toStdString() << entry.second.toStdString() << endl; #endif