refactor: move all status bar items to new status bar widget

This commit is contained in:
sithlord48 2026-02-21 23:09:19 -05:00 committed by Nick Bolton
parent 07de9efe7c
commit 5ea8874583
13 changed files with 661 additions and 532 deletions

View file

@ -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
)

View file

@ -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()

View file

@ -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;

View file

@ -497,7 +497,6 @@
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<resources/>
<connections/>

View 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);
}

View 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;
};

View file

@ -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 &gt;=1), it is not requried to be in the translation</extracomment>

View file

@ -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>&amp;Help</source>
<translation type="unfinished">&amp;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 &gt;=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&apos;s name:</source>
@ -1360,6 +1294,75 @@ Al habilitar esta opción, se deshabilitará la interfaz gráfica de usuario (GU
<translation>R&amp;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 &gt;=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>

View file

@ -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 &gt;=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&apos;s name:</source>
<translation>Nome di questo computer:</translation>
@ -1360,6 +1294,75 @@ L&apos;abilitazione di questa impostazione disabiliterà l&apos;interfaccia graf
<translation>&amp;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 &gt;=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>

View file

@ -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>&amp;File</source>
<translation>ファイル(&amp;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 &gt;=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>ネットワーク(&amp;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 &gt;=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>

View file

@ -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>&amp;File</source>
<translation>파일(&amp;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 &gt;=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>네트워크(&amp;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 &gt;=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>

View file

@ -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>&amp;File</source>
<translation>&amp;Файл</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 &gt;=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>&amp;Сеть</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 &gt;=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>

View file

@ -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>&amp;File</source>
<translation>文件(&amp;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 &gt;=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>网络(&amp;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 &gt;=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>