refactor: move all status bar items to new status bar widget
This commit is contained in:
@ -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
|
||||
)
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include "gui/ipc/DaemonIpcClient.h"
|
||||
#include "gui/widgets/LogDock.h"
|
||||
#include "net/FingerprintDatabase.h"
|
||||
#include "widgets/StatusBar.h"
|
||||
|
||||
#include <QCloseEvent>
|
||||
#include <QDesktopServices>
|
||||
@ -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()
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -497,7 +497,6 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
||||
178
src/lib/gui/widgets/StatusBar.cpp
Normal file
178
src/lib/gui/widgets/StatusBar.cpp
Normal file
@ -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 <QEvent>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
|
||||
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<int>(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);
|
||||
}
|
||||
49
src/lib/gui/widgets/StatusBar.h
Normal file
49
src/lib/gui/widgets/StatusBar.h
Normal file
@ -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 <QStatusBar>
|
||||
|
||||
#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;
|
||||
};
|
||||
@ -2,7 +2,7 @@
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="en_US">
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<name>StatusBar</name>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
|
||||
@ -390,18 +390,6 @@ Do you want to connect to the server?
|
||||
<source>Your current TLS key is smaller than the minimum allowed size, A new key 2048-bit key will be generated.</source>
|
||||
<translation type="unfinished">Su clave TLS actual es más pequeña que el tamaño mínimo permitido. Se generará una nueva clave de 2048 bits.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation type="unfinished">Ver huella digital local</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation type="unfinished">Actualización disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation type="unfinished">Ya está disponible una nueva versión v%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address missing</source>
|
||||
<translation type="unfinished">Dirección faltante</translation>
|
||||
@ -442,14 +430,6 @@ Do you want to connect to the server?
|
||||
<source>Disconnect</source>
|
||||
<translation type="unfinished">Desconectar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation type="unfinished">%1 Cifrado habilitado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation type="unfinished">Cifrado deshabilitado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No IP Detected</source>
|
||||
<translation type="unfinished">No se detectó ninguna IP</translation>
|
||||
@ -500,42 +480,10 @@ La dirección IP asignada ahora no es válida; es posible que deba reiniciar el
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished">&Ayuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation type="unfinished">%1 está iniciando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>invalid certificate, generating a new one</source>
|
||||
<translation type="unfinished">certificado no válido, generando uno nuevo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation type="unfinished">%1 lo intentará nuevamente en un momento...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation type="unfinished">%1 se está deteniendo...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation type="unfinished">%1 no se está ejecutando</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation type="unfinished">%1 está esperando clientes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation type="unfinished">%1 se está conectando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation type="unfinished">%1 está conectado como cliente de %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation type="unfinished">%1 está desconectado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ctrl+Q</source>
|
||||
<extracomment>Quit shortcut</extracomment>
|
||||
@ -562,20 +510,6 @@ Nombres válidos:
|
||||
• Use letras y números
|
||||
• También puede usar _ o -
|
||||
• Tengan entre 1 y 255 caracteres</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation type="unfinished">
|
||||
<numerusform>%1 está conectado, con un cliente: %2</numerusform>
|
||||
<numerusform>%1 está conectado, con %n clientes: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation type="unfinished">Clientes:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This computer's name:</source>
|
||||
@ -1360,6 +1294,75 @@ Al habilitar esta opción, se deshabilitará la interfaz gráfica de usuario (GU
|
||||
<translation>R&ed</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StatusBar</name>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation type="unfinished">%1 no se está ejecutando</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation type="unfinished">%1 está iniciando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation type="unfinished">%1 lo intentará nuevamente en un momento...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation type="unfinished">%1 se está deteniendo...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation type="unfinished">%1 está esperando clientes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation type="unfinished">%1 se está conectando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation type="unfinished">%1 está conectado como cliente de %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation type="unfinished">%1 está desconectado</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 está conectado, con un cliente: %2</numerusform>
|
||||
<numerusform>%1 está conectado, con %n clientes: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation type="unfinished">Clientes:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation type="unfinished">Ya está disponible una nueva versión v%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation type="unfinished">Ver huella digital local</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation type="unfinished">Actualización disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation type="unfinished">%1 Cifrado habilitado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation type="unfinished">Cifrado deshabilitado</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
|
||||
@ -378,18 +378,6 @@ Vuoi connetterti al server?
|
||||
<source>Your current TLS key is smaller than the minimum allowed size, A new key 2048-bit key will be generated.</source>
|
||||
<translation>La tua chiave TLS attuale è più piccola della dimensione minima consentita. Verrà generata una nuova chiave a 2048 bit.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>Visualizza impronta digitale locale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>Aggiornamento disponibile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>È disponibile una nuova versione v%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address missing</source>
|
||||
<translation>Indirizzo mancante</translation>
|
||||
@ -430,14 +418,6 @@ Vuoi connetterti al server?
|
||||
<source>Disconnect</source>
|
||||
<translation>Disconnetti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 Crittografia abilitata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>Crittografia disabilitata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No IP Detected</source>
|
||||
<translation>Nessun IP rilevato</translation>
|
||||
@ -502,48 +482,10 @@ Nomi validi:
|
||||
• Può anche usare _ o -
|
||||
• Deve essere compreso tra 1 e 255 caratteri</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>Client:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 si sta avviando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>invalid certificate, generating a new one</source>
|
||||
<translation type="unfinished">certificato non valido, ne viene generato uno nuovo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 riproverà tra un momento...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 si sta arrestando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 non è in esecuzione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 è in attesa di client</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 è in connessione...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 è connesso come client di %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 è disconnesso</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ctrl+Q</source>
|
||||
<extracomment>Quit shortcut</extracomment>
|
||||
@ -557,14 +499,6 @@ Nomi validi:
|
||||
<source>Screen name already exists</source>
|
||||
<translation>Il nome dello schermo esiste già</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 è connesso con un client %2</numerusform>
|
||||
<numerusform>%1 è connesso con %n client: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This computer's name:</source>
|
||||
<translation>Nome di questo computer:</translation>
|
||||
@ -1360,6 +1294,75 @@ L'abilitazione di questa impostazione disabiliterà l'interfaccia graf
|
||||
<translation>&Rete</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StatusBar</name>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 non è in esecuzione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 si sta avviando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 riproverà tra un momento...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 si sta arrestando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 è in attesa di client</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 è in connessione...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 è connesso come client di %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 è disconnesso</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 è connesso con un client %2</numerusform>
|
||||
<numerusform>%1 è connesso con %n client: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>Client:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>È disponibile una nuova versione v%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>Visualizza impronta digitale locale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>Aggiornamento disponibile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 Crittografia abilitata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>Crittografia disabilitata</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
|
||||
@ -350,10 +350,6 @@ Do you want to connect to the server?
|
||||
<source>invalid certificate, generating a new one</source>
|
||||
<translation>無効な証明書、新しい証明書を生成しています</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>新しいバージョン(v%1)が利用できます</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address missing</source>
|
||||
<translation>アドレスが指定されていません</translation>
|
||||
@ -394,14 +390,6 @@ Do you want to connect to the server?
|
||||
<source>Disconnect</source>
|
||||
<translation>切断</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 暗号化有効</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>暗号化無効</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No IP Detected</source>
|
||||
<translation>IPアドレスが見つかりません</translation>
|
||||
@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<translation>
|
||||
割り当て済みのIPアドレスが無効になりました。サーバーを再起動する必要があるかもしれません。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 は起動処理中です…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 はまもなく再試行します…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 は停止処理中です…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 は起動していません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 はクライアント接続を待機中</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 は接続処理中…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 は %2 にクライアントとして接続中</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 は切断しました</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&File</source>
|
||||
<translation>ファイル(&F)</translation>
|
||||
@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<extracomment>Quit shortcut</extracomment>
|
||||
<translation>Ctrl+Q</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>自分の指紋を表示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>ソフトウェア更新あり</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid Screen Name</source>
|
||||
<translation>不正なコンピューター名</translation>
|
||||
@ -562,19 +510,6 @@ Valid names:
|
||||
・英数字
|
||||
・_ と -
|
||||
・1から255文字まで</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 は%n台のクライアントと接続中: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>クライアント:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Suggested IP: </source>
|
||||
@ -1361,6 +1296,74 @@ Enabling this setting will disable the server config GUI.</source>
|
||||
<translation>ネットワーク(&N)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StatusBar</name>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 は起動していません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 は起動処理中です…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 はまもなく再試行します…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 は停止処理中です…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 はクライアント接続を待機中</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 は接続処理中…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 は %2 にクライアントとして接続中</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 は切断しました</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 は%n台のクライアントと接続中: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>クライアント:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>新しいバージョン(v%1)が利用できます</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>自分の指紋を表示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>ソフトウェア更新あり</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 暗号化有効</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>暗号化無効</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
|
||||
@ -350,10 +350,6 @@ Do you want to connect to the server?
|
||||
<source>invalid certificate, generating a new one</source>
|
||||
<translation type="unfinished">유효하지 않은 인증서입니다. 새 인증서를 생성하는 중입니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>새 버전(v%1)을 사용할 수 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address missing</source>
|
||||
<translation>주소가 없습니다</translation>
|
||||
@ -394,14 +390,6 @@ Do you want to connect to the server?
|
||||
<source>Disconnect</source>
|
||||
<translation>연결 해제</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 암호화 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>암호화 사용 안 함</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No IP Detected</source>
|
||||
<translation>IP를 감지하지 못했습니다</translation>
|
||||
@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<translation>
|
||||
연결된 IP가 이제 유효하지 않습니다. 서버를 재시작해야 합니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 시작 중...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 잠시 후 재시도합니다...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 중지 중...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 실행 중이 아닙니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 클라이언트를 기다리는 중</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 연결 중...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1이(가) %2의 클라이언트로 연결되었습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 연결이 해제되었습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&File</source>
|
||||
<translation>파일(&F)</translation>
|
||||
@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<extracomment>Quit shortcut</extracomment>
|
||||
<translation>Ctrl+Q</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>로컬 핑거프린팅 보기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>업데이트 사용 가능</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid Screen Name</source>
|
||||
<translation>잘못된 컴퓨터 이름</translation>
|
||||
@ -562,19 +510,6 @@ Valid names:
|
||||
• 영문자와 숫자 사용
|
||||
• _ 또는 - 사용 가능
|
||||
• 1~255자</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1이(가) %n대의 클라이언트와 연결됨: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>클라이언트:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Suggested IP: </source>
|
||||
@ -1359,6 +1294,74 @@ Enabling this setting will disable the server config GUI.</source>
|
||||
<translation>네트워크(&N)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StatusBar</name>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 실행 중이 아닙니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 시작 중...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 잠시 후 재시도합니다...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 중지 중...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 클라이언트를 기다리는 중</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 연결 중...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1이(가) %2의 클라이언트로 연결되었습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 연결이 해제되었습니다</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1이(가) %n대의 클라이언트와 연결됨: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>클라이언트:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>새 버전(v%1)을 사용할 수 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>로컬 핑거프린팅 보기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>업데이트 사용 가능</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 암호화 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>암호화 사용 안 함</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
|
||||
@ -350,10 +350,6 @@ Do you want to connect to the server?
|
||||
<source>invalid certificate, generating a new one</source>
|
||||
<translation>недействительный сертификат, создание нового</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>Доступна новая версия v%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address missing</source>
|
||||
<translation>Адрес не указан</translation>
|
||||
@ -394,14 +390,6 @@ Do you want to connect to the server?
|
||||
<source>Disconnect</source>
|
||||
<translation>Отключиться</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>Шифрование %1 включено</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>Шифрование отключено</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No IP Detected</source>
|
||||
<translation>IP-адрес не обнаружен</translation>
|
||||
@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<translation>
|
||||
Привязанный IP-адрес стал недействительным. Возможно требуется перезапуск сервера.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 запускается...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 скоро повторит попытку...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 останавливается...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 не запущен</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 ожидает подключения клиентов</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 подключается...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 подключен как клиент к %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 отключен</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&File</source>
|
||||
<translation>&Файл</translation>
|
||||
@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<extracomment>Quit shortcut</extracomment>
|
||||
<translation>Ctrl+Q</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>Показать локальный отпечаток</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>Доступно обновление</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid Screen Name</source>
|
||||
<translation>Недопустимое имя экрана</translation>
|
||||
@ -562,21 +510,6 @@ Valid names:
|
||||
• Используйте буквы и цифры
|
||||
• Можно использовать _ или -
|
||||
• Длина от 1 до 255 символов</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 подключен к %n клиенту: %2</numerusform>
|
||||
<numerusform>%1 подключен к %n клиентам: %2</numerusform>
|
||||
<numerusform>%1 подключен к %n клиентам: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>Клиенты:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Suggested IP: </source>
|
||||
@ -1359,6 +1292,76 @@ Enabling this setting will disable the server config GUI.</source>
|
||||
<translation>&Сеть</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StatusBar</name>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 не запущен</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 запускается...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 скоро повторит попытку...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 останавливается...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 ожидает подключения клиентов</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 подключается...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 подключен как клиент к %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 отключен</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 подключен к %n клиенту: %2</numerusform>
|
||||
<numerusform>%1 подключен к %n клиентам: %2</numerusform>
|
||||
<numerusform>%1 подключен к %n клиентам: %2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>Клиенты:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>Доступна новая версия v%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>Показать локальный отпечаток</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>Доступно обновление</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>Шифрование %1 включено</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>Шифрование отключено</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
|
||||
@ -350,10 +350,6 @@ Do you want to connect to the server?
|
||||
<source>invalid certificate, generating a new one</source>
|
||||
<translation type="unfinished">证书无效,正在生成新证书</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>新版本 v%1 可用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address missing</source>
|
||||
<translation>缺少地址</translation>
|
||||
@ -394,14 +390,6 @@ Do you want to connect to the server?
|
||||
<source>Disconnect</source>
|
||||
<translation>断开</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 加密已启用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>加密已禁用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No IP Detected</source>
|
||||
<translation>未检测到 IP</translation>
|
||||
@ -432,38 +420,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<translation type="unfinished">
|
||||
绑定的IP地址现在无效,您可能需要重启服务器。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 正在启动...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 将稍后重试...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 正在停止...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 未在运行</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 正在等待客户端连接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 正在连接...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 已作为 %2 的客户端连接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 已断开连接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&File</source>
|
||||
<translation>文件(&F)</translation>
|
||||
@ -533,14 +489,6 @@ A bound IP is now invalid, you may need to restart the server.</source>
|
||||
<extracomment>Quit shortcut</extracomment>
|
||||
<translation>Ctrl+Q</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>查看本地指纹</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>有可用更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid Screen Name</source>
|
||||
<translation>无效的屏幕名称</translation>
|
||||
@ -562,19 +510,6 @@ Valid names:
|
||||
• 使用字母和数字
|
||||
• 可以使用 _ 或 -
|
||||
• 长度在 1 到 255 个字符之间</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 已连接,共有 %n 个客户端:%2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>客户端:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Suggested IP: </source>
|
||||
@ -1361,6 +1296,74 @@ Enabling this setting will disable the server config GUI.</source>
|
||||
<translation>网络(&N)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>StatusBar</name>
|
||||
<message>
|
||||
<source>%1 is not running</source>
|
||||
<translation>%1 未在运行</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is starting...</source>
|
||||
<translation>%1 正在启动...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 will retry in a moment...</source>
|
||||
<translation>%1 将稍后重试...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is stopping...</source>
|
||||
<translation>%1 正在停止...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is waiting for clients</source>
|
||||
<translation>%1 正在等待客户端连接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connecting...</source>
|
||||
<translation>%1 正在连接...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is connected as client of %2</source>
|
||||
<translation>%1 已作为 %2 的客户端连接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is disconnected</source>
|
||||
<translation>%1 已断开连接</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 is connected, with %n client(s): %2</source>
|
||||
<extracomment>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</extracomment>
|
||||
<translation>
|
||||
<numerusform>%1 已连接,共有 %n 个客户端:%2</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clients:
|
||||
%1</source>
|
||||
<translation>客户端:
|
||||
%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A new version v%1 is available</source>
|
||||
<translation>新版本 v%1 可用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View local fingerprint</source>
|
||||
<translation>查看本地指纹</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update available</source>
|
||||
<translation>有可用更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Encryption Enabled</source>
|
||||
<translation>%1 加密已启用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Disabled</source>
|
||||
<translation>加密已禁用</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
|
||||
Reference in New Issue
Block a user