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:
_ -
1255</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>