diff --git a/src/lib/gui/CMakeLists.txt b/src/lib/gui/CMakeLists.txt index e4388cde4..97b8a620c 100644 --- a/src/lib/gui/CMakeLists.txt +++ b/src/lib/gui/CMakeLists.txt @@ -119,6 +119,8 @@ add_library(${target} STATIC widgets/ScreenSetupView.h widgets/SearchWidget.h widgets/SearchWidget.cpp + widgets/StatusBar.cpp + widgets/StatusBar.h widgets/TrashScreenWidget.cpp widgets/TrashScreenWidget.h ) diff --git a/src/lib/gui/MainWindow.cpp b/src/lib/gui/MainWindow.cpp index 2061a663c..8b28b0ef1 100644 --- a/src/lib/gui/MainWindow.cpp +++ b/src/lib/gui/MainWindow.cpp @@ -29,6 +29,7 @@ #include "gui/ipc/DaemonIpcClient.h" #include "gui/widgets/LogDock.h" #include "net/FingerprintDatabase.h" +#include "widgets/StatusBar.h" #include #include @@ -63,10 +64,7 @@ MainWindow::MainWindow() m_guiDupeChecker{new QLocalServer(this)}, m_daemonIpcClient{new ipc::DaemonIpcClient(this)}, m_logDock{new LogDock(this)}, - m_lblSecurityStatus{new QLabel(this)}, - m_lblStatus{new QLabel(this)}, - m_btnFingerprint{new QPushButton(this)}, - m_btnUpdate{new QPushButton(this)}, + m_statusBar{new StatusBar(this)}, m_menuFile{new QMenu(this)}, m_menuEdit{new QMenu(this)}, m_menuView{new QMenu(this)}, @@ -224,31 +222,7 @@ void MainWindow::setupControls() } else { ui->btnSaveServerConfig->setIconSize(QSize(22, 22)); } - - static const auto btnHeight = ui->statusBar->height() - 2; - static const auto btnSize = QSize(btnHeight, btnHeight); - static const auto iconSize = QSize(fontMetrics().height() + 2, fontMetrics().height() + 2); - - m_btnFingerprint->setFlat(true); - m_btnFingerprint->setIcon(QIcon::fromTheme(QStringLiteral("fingerprint"))); - m_btnFingerprint->setFixedSize(btnSize); - m_btnFingerprint->setIconSize(iconSize); - ui->statusBar->insertPermanentWidget(0, m_btnFingerprint); - - m_lblSecurityStatus->setVisible(false); - m_lblSecurityStatus->setFixedSize(iconSize); - m_lblSecurityStatus->setScaledContents(true); - ui->statusBar->insertPermanentWidget(1, m_lblSecurityStatus); - - ui->statusBar->insertPermanentWidget(2, m_lblStatus, 1); - - m_btnUpdate->setVisible(false); - m_btnUpdate->setFlat(true); - m_btnUpdate->setLayoutDirection(Qt::RightToLeft); - m_btnUpdate->setIcon(QIcon::fromTheme(QStringLiteral("software-updates-release"))); - m_btnUpdate->setFixedHeight(btnHeight); - m_btnUpdate->setIconSize(iconSize); - ui->statusBar->insertPermanentWidget(3, m_btnUpdate); + setStatusBar(m_statusBar); } ////////////////////////////////////////////////////////////////////////////// @@ -274,6 +248,7 @@ void MainWindow::connectSlots() connect( &m_coreProcess, &CoreProcess::daemonIpcClientConnectionFailed, this, &MainWindow::daemonIpcClientConnectionFailed ); + connect(&m_coreProcess, &CoreProcess::securityLevelChanged, m_statusBar, &StatusBar::setSecurityLevel); connect(m_actionAbout, &QAction::triggered, this, &MainWindow::openAboutDialog); connect(m_actionClearSettings, &QAction::triggered, this, &MainWindow::clearSettings); @@ -288,8 +263,6 @@ void MainWindow::connectSlots() connect(m_actionRestartCore, &QAction::triggered, this, &MainWindow::resetCore); connect(m_actionStopCore, &QAction::triggered, this, &MainWindow::stopCore); - connect(&m_versionChecker, &VersionChecker::updateFound, this, &MainWindow::versionCheckerUpdateFound); - // Mac os tray will only show a menu if (!deskflow::platform::isMac()) connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconActivated); @@ -317,14 +290,15 @@ void MainWindow::connectSlots() connect(ui->btnConfigureServer, &QPushButton::clicked, this, [this] { showConfigureServer(""); }); connect(ui->btnConfigureClient, &QPushButton::clicked, this, [this] { showConfigureClient(); }); connect(ui->lblComputerName, &QLabel::linkActivated, this, &MainWindow::openSettings); - connect(m_btnFingerprint, &QPushButton::clicked, this, &MainWindow::showMyFingerprint); connect(ui->rbModeServer, &QRadioButton::toggled, this, &MainWindow::coreModeToggled); connect(ui->rbModeClient, &QRadioButton::toggled, this, &MainWindow::coreModeToggled); connect(m_logDock->toggleViewAction(), &QAction::toggled, this, &MainWindow::toggleLogVisible); - connect(m_btnUpdate, &QPushButton::clicked, this, &MainWindow::openGetNewVersionUrl); + connect(m_statusBar, &StatusBar::requestShowMyFingerprints, this, &MainWindow::showMyFingerprint); + connect(m_statusBar, &StatusBar::requestUpdateVersion, this, &MainWindow::openGetNewVersionUrl); + connect(&m_versionChecker, &VersionChecker::updateFound, m_statusBar, &StatusBar::updateFound); connect(m_guiDupeChecker, &QLocalServer::newConnection, this, &MainWindow::showAndActivate); @@ -382,7 +356,7 @@ void MainWindow::settingsChanged(const QString &key) qWarning() << tr("invalid certificate, generating a new one"); TlsUtility::generateCertificate(); } - updateSecurityIcon(m_lblSecurityStatus->isVisible()); + updateSecurityIcon(m_statusBar->securityIconVisible()); return; } } @@ -399,12 +373,6 @@ void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason) isVisible() ? hide() : showAndActivate(); } -void MainWindow::versionCheckerUpdateFound(const QString &version) -{ - m_btnUpdate->setVisible(true); - m_btnUpdate->setToolTip(tr("A new version v%1 is available").arg(version)); -} - void MainWindow::coreProcessError(CoreProcess::Error error) { if (error == CoreProcess::Error::AddressMissing) { @@ -608,18 +576,10 @@ void MainWindow::updateModeControlLabels() void MainWindow::updateSecurityIcon(bool visible) { - m_lblSecurityStatus->setVisible(visible); + m_statusBar->setSecurityIconVisible(visible); if (!visible) return; - - bool secureSocket = TlsUtility::isEnabled(); - - const auto txt = - secureSocket ? tr("%1 Encryption Enabled").arg(m_coreProcess.secureSocketVersion()) : tr("Encryption Disabled"); - m_lblSecurityStatus->setToolTip(txt); - - const auto icon = QIcon::fromTheme(secureSocket ? QIcon::ThemeIcon::SecurityHigh : QIcon::ThemeIcon::SecurityLow); - m_lblSecurityStatus->setPixmap(icon.pixmap(QSize(32, 32))); + m_statusBar->setSecurityIcon(TlsUtility::isEnabled()); } void MainWindow::updateNetworkInfo() @@ -672,11 +632,6 @@ void MainWindow::open() } } -void MainWindow::setStatus(const QString &status) -{ - m_lblStatus->setText(status); -} - void MainWindow::createMenuBar() { m_menuFile->addAction(m_actionStartCore); @@ -900,64 +855,13 @@ void MainWindow::showFirstConnectedMessage() void MainWindow::updateStatus() { + using enum ProcessState; const auto connection = m_coreProcess.connectionState(); const auto process = m_coreProcess.processState(); const bool isServer = (m_coreProcess.mode() == CoreMode::Server); - - updateSecurityIcon(false); - switch (process) { - using enum ProcessState; - - case Starting: - setStatus(tr("%1 is starting...").arg(kAppName)); - break; - - case RetryPending: - setStatus(tr("%1 will retry in a moment...").arg(kAppName)); - break; - - case Stopping: - setStatus(tr("%1 is stopping...").arg(kAppName)); - break; - - case Stopped: + if (process == Stopped || process == Started) updateNetworkInfo(); - setStatus(tr("%1 is not running").arg(kAppName)); - break; - - case Started: { - updateNetworkInfo(); - switch (connection) { - using enum ConnectionState; - - case Listening: { - if (isServer) { - updateSecurityIcon(true); - setStatus(tr("%1 is waiting for clients").arg(kAppName)); - } - - break; - } - - case Connecting: - setStatus(tr("%1 is connecting...").arg(kAppName)); - break; - - case Connected: { - updateSecurityIcon(true); - if (!isServer) { - setStatus(tr("%1 is connected as client of %2") - .arg(kAppName, Settings::value(Settings::Client::RemoteHost).toString())); - } - break; - } - - case Disconnected: - setStatus(tr("%1 is disconnected").arg(kAppName)); - break; - } - } break; - } + m_statusBar->setStatus(connection, process, isServer); } void MainWindow::coreProcessStateChanged(ProcessState state) @@ -1021,7 +925,7 @@ void MainWindow::coreConnectionStateChanged(ConnectionState state) void MainWindow::updateLocalFingerprint() { - m_btnFingerprint->setVisible(TlsUtility::isEnabled() && !m_fingerprint.data.isEmpty()); + m_statusBar->setBtnFingerprintVisible(TlsUtility::isEnabled() && !m_fingerprint.data.isEmpty()); } void MainWindow::hide() @@ -1085,10 +989,6 @@ void MainWindow::updateText() m_actionQuit->setShortcut(QKeySequence(tr("Ctrl+Q"))); m_actionTrayQuit->setShortcut(QKeySequence(tr("Ctrl+Q"))); } - - // General controls - m_btnFingerprint->setToolTip(tr("View local fingerprint")); - m_btnUpdate->setText(tr("Update available")); } void MainWindow::showConfigureServer(const QString &message) @@ -1111,7 +1011,7 @@ void MainWindow::showConfigureClient() void MainWindow::secureSocket(bool secureSocket) { m_secureSocket = secureSocket; - updateSecurityIcon(m_lblSecurityStatus->isVisible()); + updateSecurityIcon(m_statusBar->securityIconVisible()); } void MainWindow::updateScreenName() @@ -1213,21 +1113,7 @@ void MainWindow::serverClientsChanged(const QStringList &clients) { if (m_coreProcess.mode() != CoreMode::Server || !m_coreProcess.isStarted()) return; - - if (clients.isEmpty()) { - setStatus(tr("%1 is waiting for clients").arg(kAppName)); - ui->statusBar->setToolTip(""); - return; - } - - //: Shown when in server mode and at least 1 client is connected - //: %1 is replaced by the app name - //: %2 will be a list of at least one client - //: %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - setStatus(tr("%1 is connected, with %n client(s): %2", "", clients.size()).arg(kAppName, clients.join(", "))); - - const auto toolTipString = clients.count() == 1 ? "" : tr("Clients:\n %1").arg(clients.join("\n")); - ui->statusBar->setToolTip(toolTipString); + m_statusBar->setServerClients(clients); } void MainWindow::daemonIpcClientConnectionFailed() diff --git a/src/lib/gui/MainWindow.h b/src/lib/gui/MainWindow.h index 084572b9a..47a54309c 100644 --- a/src/lib/gui/MainWindow.h +++ b/src/lib/gui/MainWindow.h @@ -48,6 +48,7 @@ class QLocalServer; class DeskflowApplication; class LogDock; +class StatusBar; namespace Ui { class MainWindow; @@ -108,7 +109,7 @@ private: void coreProcessError(CoreProcess::Error error); void coreConnectionStateChanged(ConnectionState state); void coreProcessStateChanged(ProcessState state); - void versionCheckerUpdateFound(const QString &version); + void trayIconActivated(QSystemTrayIcon::ActivationReason reason); void serverConnectionConfigureClient(const QString &clientName); @@ -135,7 +136,6 @@ private: void setupTrayIcon(); void applyConfig(); void setTrayIcon(); - void setStatus(const QString &status); void updateFromLogLine(const QString &line); void checkConnected(const QString &line); void checkFingerprint(const QString &line); @@ -204,10 +204,7 @@ private: deskflow::gui::ipc::DaemonIpcClient *m_daemonIpcClient = nullptr; LogDock *m_logDock; - QLabel *m_lblSecurityStatus = nullptr; - QLabel *m_lblStatus = nullptr; - QPushButton *m_btnFingerprint = nullptr; - QPushButton *m_btnUpdate = nullptr; + StatusBar *m_statusBar = nullptr; // Window Menu QMenu *m_menuFile = nullptr; diff --git a/src/lib/gui/MainWindow.ui b/src/lib/gui/MainWindow.ui index 101ef8413..b7596a311 100644 --- a/src/lib/gui/MainWindow.ui +++ b/src/lib/gui/MainWindow.ui @@ -497,7 +497,6 @@ - diff --git a/src/lib/gui/widgets/StatusBar.cpp b/src/lib/gui/widgets/StatusBar.cpp new file mode 100644 index 000000000..a52796543 --- /dev/null +++ b/src/lib/gui/widgets/StatusBar.cpp @@ -0,0 +1,178 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 - 2026 Deskflow Developers + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#include "StatusBar.h" +#include "common/Constants.h" +#include "common/Settings.h" + +#include +#include +#include + +StatusBar::StatusBar(QWidget *parent) + : QStatusBar{parent}, + m_btnFingerprint{new QPushButton(this)}, + m_lblSecurityIcon{new QLabel(this)}, + m_lblStatus{new QLabel(this)}, + m_btnUpdate{new QPushButton(this)} +{ + static const auto btnHeight = height() - 2; + static const auto btnSize = QSize(btnHeight, btnHeight); + static const auto iconSize = QSize(fontMetrics().height() + 2, fontMetrics().height() + 2); + + m_btnFingerprint->setFlat(true); + m_btnFingerprint->setIcon(QIcon::fromTheme(QStringLiteral("fingerprint"))); + m_btnFingerprint->setFixedSize(btnSize); + m_btnFingerprint->setIconSize(iconSize); + insertPermanentWidget(0, m_btnFingerprint); + connect(m_btnFingerprint, &QPushButton::clicked, this, &StatusBar::requestShowMyFingerprints); + + m_lblSecurityIcon->setVisible(false); + m_lblSecurityIcon->setFixedSize(iconSize); + m_lblSecurityIcon->setScaledContents(true); + insertPermanentWidget(1, m_lblSecurityIcon); + + m_lblStatus->setText(tr("%1 is not running").arg(kAppName)); + insertPermanentWidget(2, m_lblStatus, 1); + + m_btnUpdate->setVisible(false); + m_btnUpdate->setFlat(true); + m_btnUpdate->setLayoutDirection(Qt::RightToLeft); + m_btnUpdate->setIcon(QIcon::fromTheme(QStringLiteral("software-updates-release"))); + m_btnUpdate->setFixedHeight(btnHeight); + m_btnUpdate->setIconSize(iconSize); + insertPermanentWidget(3, m_btnUpdate); + connect(m_btnUpdate, &QPushButton::clicked, this, &StatusBar::requestUpdateVersion); + + updateText(); + adjustSize(); +} + +// clang-format off +void StatusBar::setStatus(ConnectionState connectionState, ProcessState processState, bool isServer) +{ + setSecurityIconVisible(false); + switch (processState) { + using enum ProcessState; + case Starting: + m_lblStatus->setText(tr("%1 is starting...").arg(kAppName)); + break; + + case RetryPending: + m_lblStatus->setText(tr("%1 will retry in a moment...").arg(kAppName)); + break; + + case Stopping: + m_lblStatus->setText(tr("%1 is stopping...").arg(kAppName)); + break; + + case Stopped: + m_lblStatus->setText(tr("%1 is not running").arg(kAppName)); + break; + + case Started: { + switch (connectionState) { + using enum ConnectionState; + + case Listening: { + if (isServer) { + setSecurityIconVisible(true); + m_lblStatus->setText(tr("%1 is waiting for clients").arg(kAppName)); + } + break; + } + + case Connecting: + m_lblStatus->setText(tr("%1 is connecting...").arg(kAppName)); + break; + + case Connected: { + setSecurityIconVisible(true); + if (!isServer) { + m_lblStatus->setText(tr("%1 is connected as client of %2") + .arg(kAppName, Settings::value(Settings::Client::RemoteHost).toString())); + } + break; + } + + case Disconnected: + m_lblStatus->setText(tr("%1 is disconnected").arg(kAppName)); + break; + } + } + } +} +// clang-format on +void StatusBar::setServerClients(const QStringList &clients) +{ + if (clients.isEmpty()) { + m_lblStatus->setText(tr("%1 is waiting for clients").arg(kAppName)); + m_lblStatus->setToolTip(""); + return; + } + const auto clientCount = static_cast(clients.size()); + static const auto comma = QStringLiteral(", "); + static const auto newLine = QStringLiteral("\n"); + //: Shown when in server mode and at least 1 client is connected + //: %1 is replaced by the app name + //: %2 will be a list of at least one client + //: %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + const auto text = tr("%1 is connected, with %n client(s): %2", "", clientCount).arg(kAppName, clients.join(comma)); + m_lblStatus->setText(text); + + const auto toolTipString = clientCount == 1 ? "" : tr("Clients:\n %1").arg(clients.join(newLine)); + m_lblStatus->setToolTip(toolTipString); +} + +void StatusBar::setSecurityIconVisible(bool visible) +{ + m_lblSecurityIcon->setVisible(visible); +} + +bool StatusBar::securityIconVisible() const +{ + return m_lblSecurityIcon->isVisible(); +} + +void StatusBar::setBtnFingerprintVisible(bool visible) +{ + m_btnFingerprint->setVisible(visible); +} + +void StatusBar::updateFound(const QString &version) +{ + m_btnUpdate->setVisible(true); + m_btnUpdate->setToolTip(tr("A new version v%1 is available").arg(version)); +} + +void StatusBar::changeEvent(QEvent *e) +{ + QStatusBar::changeEvent(e); + if (e->type() == QEvent::LanguageChange) + updateText(); +} + +void StatusBar::updateText() +{ + m_btnFingerprint->setToolTip(tr("View local fingerprint")); + m_btnUpdate->setText(tr("Update available")); + setSecurityLevel(m_securityLevel); +} + +void StatusBar::setSecurityIcon(bool encrypted) +{ + const auto icon = QIcon::fromTheme(encrypted ? QIcon::ThemeIcon::SecurityHigh : QIcon::ThemeIcon::SecurityLow); + m_lblSecurityIcon->setPixmap(icon.pixmap(QSize(32, 32))); + m_encrypted = encrypted; + setSecurityLevel(m_securityLevel); +} + +void StatusBar::setSecurityLevel(const QString &securityLevel) +{ + m_securityLevel = securityLevel; + const auto txt = m_encrypted ? tr("%1 Encryption Enabled").arg(m_securityLevel) : tr("Encryption Disabled"); + m_lblSecurityIcon->setToolTip(txt); +} diff --git a/src/lib/gui/widgets/StatusBar.h b/src/lib/gui/widgets/StatusBar.h new file mode 100644 index 000000000..5d1e72784 --- /dev/null +++ b/src/lib/gui/widgets/StatusBar.h @@ -0,0 +1,49 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 - 2026 Deskflow Developers + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#pragma once + +#include + +#include "common/Enums.h" + +class QPushButton; +class QLabel; + +using ProcessState = deskflow::core::ProcessState; +using ConnectionState = deskflow::core::ConnectionState; + +class StatusBar : public QStatusBar +{ + Q_OBJECT +public: + explicit StatusBar(QWidget *parent = nullptr); + void setStatus(ConnectionState connectionState, ProcessState processState, bool isServer); + void setServerClients(const QStringList &clients); + void setSecurityIconVisible(bool visible); + bool securityIconVisible() const; + void updateSecurityInfo(bool encrypted); + void setSecurityIcon(bool encrypted); + void setSecurityLevel(const QString &securityLevel); + void setBtnFingerprintVisible(bool visible); + void updateFound(const QString &version); + +Q_SIGNALS: + void requestShowMyFingerprints(); + void requestUpdateVersion(); + +protected: + void changeEvent(QEvent *e) override; + +private: + void updateText(); + QPushButton *m_btnFingerprint = nullptr; + QLabel *m_lblSecurityIcon = nullptr; + QLabel *m_lblStatus = nullptr; + QPushButton *m_btnUpdate = nullptr; + bool m_encrypted = false; + QString m_securityLevel; +}; diff --git a/translations/deskflow_en.ts b/translations/deskflow_en.ts index e5c6db238..6eed0ed0b 100644 --- a/translations/deskflow_en.ts +++ b/translations/deskflow_en.ts @@ -2,7 +2,7 @@ - MainWindow + StatusBar %1 is connected, with %n client(s): %2 Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation diff --git a/translations/deskflow_es.ts b/translations/deskflow_es.ts index f6c48e421..da004d674 100644 --- a/translations/deskflow_es.ts +++ b/translations/deskflow_es.ts @@ -390,18 +390,6 @@ Do you want to connect to the server? Your current TLS key is smaller than the minimum allowed size, A new key 2048-bit key will be generated. Su clave TLS actual es más pequeña que el tamaño mínimo permitido. Se generará una nueva clave de 2048 bits. - - View local fingerprint - Ver huella digital local - - - Update available - Actualización disponible - - - A new version v%1 is available - Ya está disponible una nueva versión v%1 - Address missing Dirección faltante @@ -442,14 +430,6 @@ Do you want to connect to the server? Disconnect Desconectar - - %1 Encryption Enabled - %1 Cifrado habilitado - - - Encryption Disabled - Cifrado deshabilitado - No IP Detected No se detectó ninguna IP @@ -500,42 +480,10 @@ La dirección IP asignada ahora no es válida; es posible que deba reiniciar el &Help &Ayuda - - %1 is starting... - %1 está iniciando... - invalid certificate, generating a new one certificado no válido, generando uno nuevo - - %1 will retry in a moment... - %1 lo intentará nuevamente en un momento... - - - %1 is stopping... - %1 se está deteniendo... - - - %1 is not running - %1 no se está ejecutando - - - %1 is waiting for clients - %1 está esperando clientes - - - %1 is connecting... - %1 se está conectando... - - - %1 is connected as client of %2 - %1 está conectado como cliente de %2 - - - %1 is disconnected - %1 está desconectado - Ctrl+Q Quit shortcut @@ -562,20 +510,6 @@ Nombres válidos: • Use letras y números • También puede usar _ o - • Tengan entre 1 y 255 caracteres - - - %1 is connected, with %n client(s): %2 - Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - - %1 está conectado, con un cliente: %2 - %1 está conectado, con %n clientes: %2 - - - - Clients: - %1 - Clientes: - %1 This computer's name: @@ -1360,6 +1294,75 @@ Al habilitar esta opción, se deshabilitará la interfaz gráfica de usuario (GU R&ed + + StatusBar + + %1 is not running + %1 no se está ejecutando + + + %1 is starting... + %1 está iniciando... + + + %1 will retry in a moment... + %1 lo intentará nuevamente en un momento... + + + %1 is stopping... + %1 se está deteniendo... + + + %1 is waiting for clients + %1 está esperando clientes + + + %1 is connecting... + %1 se está conectando... + + + %1 is connected as client of %2 + %1 está conectado como cliente de %2 + + + %1 is disconnected + %1 está desconectado + + + %1 is connected, with %n client(s): %2 + Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + + %1 está conectado, con un cliente: %2 + %1 está conectado, con %n clientes: %2 + + + + Clients: + %1 + Clientes: + %1 + + + A new version v%1 is available + Ya está disponible una nueva versión v%1 + + + View local fingerprint + Ver huella digital local + + + Update available + Actualización disponible + + + %1 Encryption Enabled + %1 Cifrado habilitado + + + Encryption Disabled + Cifrado deshabilitado + + i18n diff --git a/translations/deskflow_it.ts b/translations/deskflow_it.ts index ba160a22b..0a857a40d 100644 --- a/translations/deskflow_it.ts +++ b/translations/deskflow_it.ts @@ -378,18 +378,6 @@ Vuoi connetterti al server? Your current TLS key is smaller than the minimum allowed size, A new key 2048-bit key will be generated. La tua chiave TLS attuale è più piccola della dimensione minima consentita. Verrà generata una nuova chiave a 2048 bit. - - View local fingerprint - Visualizza impronta digitale locale - - - Update available - Aggiornamento disponibile - - - A new version v%1 is available - È disponibile una nuova versione v%1 - Address missing Indirizzo mancante @@ -430,14 +418,6 @@ Vuoi connetterti al server? Disconnect Disconnetti - - %1 Encryption Enabled - %1 Crittografia abilitata - - - Encryption Disabled - Crittografia disabilitata - No IP Detected Nessun IP rilevato @@ -502,48 +482,10 @@ Nomi validi: • Può anche usare _ o - • Deve essere compreso tra 1 e 255 caratteri - - Clients: - %1 - Client: - %1 - - - %1 is starting... - %1 si sta avviando... - invalid certificate, generating a new one certificato non valido, ne viene generato uno nuovo - - %1 will retry in a moment... - %1 riproverà tra un momento... - - - %1 is stopping... - %1 si sta arrestando... - - - %1 is not running - %1 non è in esecuzione - - - %1 is waiting for clients - %1 è in attesa di client - - - %1 is connecting... - %1 è in connessione... - - - %1 is connected as client of %2 - %1 è connesso come client di %2 - - - %1 is disconnected - %1 è disconnesso - Ctrl+Q Quit shortcut @@ -557,14 +499,6 @@ Nomi validi: Screen name already exists Il nome dello schermo esiste già - - %1 is connected, with %n client(s): %2 - Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - - %1 è connesso con un client %2 - %1 è connesso con %n client: %2 - - This computer's name: Nome di questo computer: @@ -1360,6 +1294,75 @@ L'abilitazione di questa impostazione disabiliterà l'interfaccia graf &Rete + + StatusBar + + %1 is not running + %1 non è in esecuzione + + + %1 is starting... + %1 si sta avviando... + + + %1 will retry in a moment... + %1 riproverà tra un momento... + + + %1 is stopping... + %1 si sta arrestando... + + + %1 is waiting for clients + %1 è in attesa di client + + + %1 is connecting... + %1 è in connessione... + + + %1 is connected as client of %2 + %1 è connesso come client di %2 + + + %1 is disconnected + %1 è disconnesso + + + %1 is connected, with %n client(s): %2 + Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + + %1 è connesso con un client %2 + %1 è connesso con %n client: %2 + + + + Clients: + %1 + Client: + %1 + + + A new version v%1 is available + È disponibile una nuova versione v%1 + + + View local fingerprint + Visualizza impronta digitale locale + + + Update available + Aggiornamento disponibile + + + %1 Encryption Enabled + %1 Crittografia abilitata + + + Encryption Disabled + Crittografia disabilitata + + i18n diff --git a/translations/deskflow_ja.ts b/translations/deskflow_ja.ts index 664d258aa..9a8f7e068 100644 --- a/translations/deskflow_ja.ts +++ b/translations/deskflow_ja.ts @@ -350,10 +350,6 @@ Do you want to connect to the server? invalid certificate, generating a new one 無効な証明書、新しい証明書を生成しています - - A new version v%1 is available - 新しいバージョン(v%1)が利用できます - Address missing アドレスが指定されていません @@ -394,14 +390,6 @@ Do you want to connect to the server? Disconnect 切断 - - %1 Encryption Enabled - %1 暗号化有効 - - - Encryption Disabled - 暗号化無効 - No IP Detected IPアドレスが見つかりません @@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server. 割り当て済みのIPアドレスが無効になりました。サーバーを再起動する必要があるかもしれません。 - - %1 is starting... - %1 は起動処理中です… - - - %1 will retry in a moment... - %1 はまもなく再試行します… - - - %1 is stopping... - %1 は停止処理中です… - - - %1 is not running - %1 は起動していません - - - %1 is waiting for clients - %1 はクライアント接続を待機中 - - - %1 is connecting... - %1 は接続処理中… - - - %1 is connected as client of %2 - %1 は %2 にクライアントとして接続中 - - - %1 is disconnected - %1 は切断しました - &File ファイル(&F) @@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server. Quit shortcut Ctrl+Q - - View local fingerprint - 自分の指紋を表示 - - - Update available - ソフトウェア更新あり - Invalid Screen Name 不正なコンピューター名 @@ -562,19 +510,6 @@ Valid names: ・英数字 ・_ と - ・1から255文字まで - - - %1 is connected, with %n client(s): %2 - Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - - %1 は%n台のクライアントと接続中: %2 - - - - Clients: - %1 - クライアント: - %1 Suggested IP: @@ -1361,6 +1296,74 @@ Enabling this setting will disable the server config GUI. ネットワーク(&N) + + StatusBar + + %1 is not running + %1 は起動していません + + + %1 is starting... + %1 は起動処理中です… + + + %1 will retry in a moment... + %1 はまもなく再試行します… + + + %1 is stopping... + %1 は停止処理中です… + + + %1 is waiting for clients + %1 はクライアント接続を待機中 + + + %1 is connecting... + %1 は接続処理中… + + + %1 is connected as client of %2 + %1 は %2 にクライアントとして接続中 + + + %1 is disconnected + %1 は切断しました + + + %1 is connected, with %n client(s): %2 + Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + + %1 は%n台のクライアントと接続中: %2 + + + + Clients: + %1 + クライアント: + %1 + + + A new version v%1 is available + 新しいバージョン(v%1)が利用できます + + + View local fingerprint + 自分の指紋を表示 + + + Update available + ソフトウェア更新あり + + + %1 Encryption Enabled + %1 暗号化有効 + + + Encryption Disabled + 暗号化無効 + + i18n diff --git a/translations/deskflow_ko.ts b/translations/deskflow_ko.ts index 6812a8d21..75d3f10b7 100644 --- a/translations/deskflow_ko.ts +++ b/translations/deskflow_ko.ts @@ -350,10 +350,6 @@ Do you want to connect to the server? invalid certificate, generating a new one 유효하지 않은 인증서입니다. 새 인증서를 생성하는 중입니다 - - A new version v%1 is available - 새 버전(v%1)을 사용할 수 있습니다 - Address missing 주소가 없습니다 @@ -394,14 +390,6 @@ Do you want to connect to the server? Disconnect 연결 해제 - - %1 Encryption Enabled - %1 암호화 사용 - - - Encryption Disabled - 암호화 사용 안 함 - No IP Detected IP를 감지하지 못했습니다 @@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server. 연결된 IP가 이제 유효하지 않습니다. 서버를 재시작해야 합니다. - - %1 is starting... - %1 시작 중... - - - %1 will retry in a moment... - %1 잠시 후 재시도합니다... - - - %1 is stopping... - %1 중지 중... - - - %1 is not running - %1 실행 중이 아닙니다 - - - %1 is waiting for clients - %1 클라이언트를 기다리는 중 - - - %1 is connecting... - %1 연결 중... - - - %1 is connected as client of %2 - %1이(가) %2의 클라이언트로 연결되었습니다 - - - %1 is disconnected - %1 연결이 해제되었습니다 - &File 파일(&F) @@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server. Quit shortcut Ctrl+Q - - View local fingerprint - 로컬 핑거프린팅 보기 - - - Update available - 업데이트 사용 가능 - Invalid Screen Name 잘못된 컴퓨터 이름 @@ -562,19 +510,6 @@ Valid names: • 영문자와 숫자 사용 • _ 또는 - 사용 가능 • 1~255자 - - - %1 is connected, with %n client(s): %2 - Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - - %1이(가) %n대의 클라이언트와 연결됨: %2 - - - - Clients: - %1 - 클라이언트: - %1 Suggested IP: @@ -1359,6 +1294,74 @@ Enabling this setting will disable the server config GUI. 네트워크(&N) + + StatusBar + + %1 is not running + %1 실행 중이 아닙니다 + + + %1 is starting... + %1 시작 중... + + + %1 will retry in a moment... + %1 잠시 후 재시도합니다... + + + %1 is stopping... + %1 중지 중... + + + %1 is waiting for clients + %1 클라이언트를 기다리는 중 + + + %1 is connecting... + %1 연결 중... + + + %1 is connected as client of %2 + %1이(가) %2의 클라이언트로 연결되었습니다 + + + %1 is disconnected + %1 연결이 해제되었습니다 + + + %1 is connected, with %n client(s): %2 + Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + + %1이(가) %n대의 클라이언트와 연결됨: %2 + + + + Clients: + %1 + 클라이언트: + %1 + + + A new version v%1 is available + 새 버전(v%1)을 사용할 수 있습니다 + + + View local fingerprint + 로컬 핑거프린팅 보기 + + + Update available + 업데이트 사용 가능 + + + %1 Encryption Enabled + %1 암호화 사용 + + + Encryption Disabled + 암호화 사용 안 함 + + i18n diff --git a/translations/deskflow_ru.ts b/translations/deskflow_ru.ts index 4ae35d458..03896f62d 100644 --- a/translations/deskflow_ru.ts +++ b/translations/deskflow_ru.ts @@ -350,10 +350,6 @@ Do you want to connect to the server? invalid certificate, generating a new one недействительный сертификат, создание нового - - A new version v%1 is available - Доступна новая версия v%1 - Address missing Адрес не указан @@ -394,14 +390,6 @@ Do you want to connect to the server? Disconnect Отключиться - - %1 Encryption Enabled - Шифрование %1 включено - - - Encryption Disabled - Шифрование отключено - No IP Detected IP-адрес не обнаружен @@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server. Привязанный IP-адрес стал недействительным. Возможно требуется перезапуск сервера. - - %1 is starting... - %1 запускается... - - - %1 will retry in a moment... - %1 скоро повторит попытку... - - - %1 is stopping... - %1 останавливается... - - - %1 is not running - %1 не запущен - - - %1 is waiting for clients - %1 ожидает подключения клиентов - - - %1 is connecting... - %1 подключается... - - - %1 is connected as client of %2 - %1 подключен как клиент к %2 - - - %1 is disconnected - %1 отключен - &File &Файл @@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server. Quit shortcut Ctrl+Q - - View local fingerprint - Показать локальный отпечаток - - - Update available - Доступно обновление - Invalid Screen Name Недопустимое имя экрана @@ -562,21 +510,6 @@ Valid names: • Используйте буквы и цифры • Можно использовать _ или - • Длина от 1 до 255 символов - - - %1 is connected, with %n client(s): %2 - Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - - %1 подключен к %n клиенту: %2 - %1 подключен к %n клиентам: %2 - %1 подключен к %n клиентам: %2 - - - - Clients: - %1 - Клиенты: - %1 Suggested IP: @@ -1359,6 +1292,76 @@ Enabling this setting will disable the server config GUI. &Сеть + + StatusBar + + %1 is not running + %1 не запущен + + + %1 is starting... + %1 запускается... + + + %1 will retry in a moment... + %1 скоро повторит попытку... + + + %1 is stopping... + %1 останавливается... + + + %1 is waiting for clients + %1 ожидает подключения клиентов + + + %1 is connecting... + %1 подключается... + + + %1 is connected as client of %2 + %1 подключен как клиент к %2 + + + %1 is disconnected + %1 отключен + + + %1 is connected, with %n client(s): %2 + Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + + %1 подключен к %n клиенту: %2 + %1 подключен к %n клиентам: %2 + %1 подключен к %n клиентам: %2 + + + + Clients: + %1 + Клиенты: + %1 + + + A new version v%1 is available + Доступна новая версия v%1 + + + View local fingerprint + Показать локальный отпечаток + + + Update available + Доступно обновление + + + %1 Encryption Enabled + Шифрование %1 включено + + + Encryption Disabled + Шифрование отключено + + i18n diff --git a/translations/deskflow_zh_CN.ts b/translations/deskflow_zh_CN.ts index bd8e8113c..2906263bb 100644 --- a/translations/deskflow_zh_CN.ts +++ b/translations/deskflow_zh_CN.ts @@ -350,10 +350,6 @@ Do you want to connect to the server? invalid certificate, generating a new one 证书无效,正在生成新证书 - - A new version v%1 is available - 新版本 v%1 可用 - Address missing 缺少地址 @@ -394,14 +390,6 @@ Do you want to connect to the server? Disconnect 断开 - - %1 Encryption Enabled - %1 加密已启用 - - - Encryption Disabled - 加密已禁用 - No IP Detected 未检测到 IP @@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server. 绑定的IP地址现在无效,您可能需要重启服务器。 - - %1 is starting... - %1 正在启动... - - - %1 will retry in a moment... - %1 将稍后重试... - - - %1 is stopping... - %1 正在停止... - - - %1 is not running - %1 未在运行 - - - %1 is waiting for clients - %1 正在等待客户端连接 - - - %1 is connecting... - %1 正在连接... - - - %1 is connected as client of %2 - %1 已作为 %2 的客户端连接 - - - %1 is disconnected - %1 已断开连接 - &File 文件(&F) @@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server. Quit shortcut Ctrl+Q - - View local fingerprint - 查看本地指纹 - - - Update available - 有可用更新 - Invalid Screen Name 无效的屏幕名称 @@ -562,19 +510,6 @@ Valid names: • 使用字母和数字 • 可以使用 _ 或 - • 长度在 1 到 255 个字符之间 - - - %1 is connected, with %n client(s): %2 - Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation - - %1 已连接,共有 %n 个客户端:%2 - - - - Clients: - %1 - 客户端: - %1 Suggested IP: @@ -1361,6 +1296,74 @@ Enabling this setting will disable the server config GUI. 网络(&N) + + StatusBar + + %1 is not running + %1 未在运行 + + + %1 is starting... + %1 正在启动... + + + %1 will retry in a moment... + %1 将稍后重试... + + + %1 is stopping... + %1 正在停止... + + + %1 is waiting for clients + %1 正在等待客户端连接 + + + %1 is connecting... + %1 正在连接... + + + %1 is connected as client of %2 + %1 已作为 %2 的客户端连接 + + + %1 is disconnected + %1 已断开连接 + + + %1 is connected, with %n client(s): %2 + Shown when in server mode and at least 1 client is connected %1 is replaced by the app name %2 will be a list of at least one client %n will be replaced by the number of clients (n is >=1), it is not requried to be in the translation + + %1 已连接,共有 %n 个客户端:%2 + + + + Clients: + %1 + 客户端: + %1 + + + A new version v%1 is available + 新版本 v%1 可用 + + + View local fingerprint + 查看本地指纹 + + + Update available + 有可用更新 + + + %1 Encryption Enabled + %1 加密已启用 + + + Encryption Disabled + 加密已禁用 + + i18n