feat: add view help to help menu

This commit is contained in:
sithlord48 2026-07-25 10:22:36 -04:00 committed by Chris Rizzitello
parent 05f42e6483
commit 99eb7dc27f
17 changed files with 310 additions and 1 deletions

View file

@ -30,6 +30,7 @@
<file>icons/deskflow-dark/actions/22/network-connect.svg</file>
<file>icons/deskflow-dark/actions/22/network-disconnect.svg</file>
<file>icons/deskflow-dark/actions/22/process-stop.svg</file>
<file>icons/deskflow-dark/actions/22/question.svg</file>
<file>icons/deskflow-dark/actions/22/system-run.svg</file>
<file>icons/deskflow-dark/actions/22/system-search.svg</file>
<file>icons/deskflow-dark/actions/22/tools-report-bug.svg</file>
@ -50,6 +51,7 @@
<file>icons/deskflow-dark/actions/24/network-connect.svg</file>
<file>icons/deskflow-dark/actions/24/network-disconnect.svg</file>
<file>icons/deskflow-dark/actions/24/process-stop.svg</file>
<file>icons/deskflow-dark/actions/24/question.svg</file>
<file>icons/deskflow-dark/actions/24/system-run.svg</file>
<file>icons/deskflow-dark/actions/24/system-search.svg</file>
<file>icons/deskflow-dark/actions/24/tools-report-bug.svg</file>
@ -115,6 +117,7 @@
<file>icons/deskflow-light/actions/22/network-disconnect.svg</file>
<file>icons/deskflow-light/actions/22/help-about.svg</file>
<file>icons/deskflow-light/actions/22/process-stop.svg</file>
<file>icons/deskflow-light/actions/22/question.svg</file>
<file>icons/deskflow-light/actions/22/system-run.svg</file>
<file>icons/deskflow-light/actions/22/system-search.svg</file>
<file>icons/deskflow-light/actions/22/tools-report-bug.svg</file>
@ -135,6 +138,7 @@
<file>icons/deskflow-light/actions/24/network-connect.svg</file>
<file>icons/deskflow-light/actions/24/network-disconnect.svg</file>
<file>icons/deskflow-light/actions/24/process-stop.svg</file>
<file>icons/deskflow-light/actions/24/question.svg</file>
<file>icons/deskflow-light/actions/24/system-run.svg</file>
<file>icons/deskflow-light/actions/24/system-search.svg</file>
<file>icons/deskflow-light/actions/24/tools-report-bug.svg</file>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">.ColorScheme-Text { color: #fcfcfc; } </style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none" d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z " class="ColorScheme-Text"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">.ColorScheme-Text { color: #fcfcfc; } </style>
</defs>
<g transform="translate(1,1)">
<path style="fill:currentColor;fill-opacity:1;stroke:none" d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z " class="ColorScheme-Text"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#232629;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#232629;
}
</style>
</defs>
<g transform="translate(1,1)">
<path style="fill:currentColor;fill-opacity:1;stroke:none" d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z " class="ColorScheme-Text"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -17,7 +17,7 @@ const auto kUrlSourceQuery = QStringLiteral("source=gui");
const auto kUrlApp = QStringLiteral("https://%1").arg(kOrgDomain);
const auto kUrlHelp = QStringLiteral("%1/help?%2").arg(kUrlApp, kUrlSourceQuery);
const auto kUrlDownload = QStringLiteral("%1/download?%2").arg(kUrlApp, kUrlSourceQuery);
const auto kUrlWiki = QStringLiteral("%1/wiki?%2").arg(kUrlApp, kUrlSourceQuery);
const auto kUrlUpdateCheck = QStringLiteral("https://api.%1/version").arg(kOrgDomain);
#if defined(Q_OS_LINUX)

View file

@ -62,6 +62,8 @@ add_library(${target} STATIC
dialogs/ClientConfigDialog.ui
dialogs/FingerprintDialog.cpp
dialogs/FingerprintDialog.h
dialogs/HelpDialog.cpp
dialogs/HelpDialog.h
dialogs/HotkeyDialog.cpp
dialogs/HotkeyDialog.h
dialogs/HotkeyDialog.ui

View file

@ -16,6 +16,7 @@
#include "dialogs/AboutDialog.h"
#include "dialogs/ClientConfigDialog.h"
#include "dialogs/FingerprintDialog.h"
#include "dialogs/HelpDialog.h"
#include "dialogs/ServerConfigDialog.h"
#include "dialogs/SettingsDialog.h"
@ -79,6 +80,7 @@ MainWindow::MainWindow()
m_actionStartCore{new QAction(this)},
m_actionRestartCore{new QAction(this)},
m_actionStopCore{new QAction(this)},
m_actionShowHelp{new QAction(this)},
m_networkMonitor{new NetworkMonitor(this)}
{
ui->setupUi(this);
@ -124,6 +126,9 @@ MainWindow::MainWindow()
m_actionReportBug->setIcon(QIcon::fromTheme(QStringLiteral("tools-report-bug")));
m_actionReportBug->setMenuRole(QAction::NoRole);
m_actionShowHelp->setIcon(QIcon::fromTheme(QStringLiteral("question")));
m_actionShowHelp->setMenuRole(QAction::NoRole);
// Setup the Instance Checking
// In case of a previous crash remove first
QLocalServer::removeServer(m_guiSocketName);
@ -135,6 +140,7 @@ MainWindow::MainWindow()
connectSlots();
setupTrayIcon();
updateScreenName();
setHelpFilePath();
qDebug().noquote() << "active settings path:" << Settings::settingsPath();
@ -263,6 +269,7 @@ void MainWindow::connectSlots()
connect(m_actionStartCore, &QAction::triggered, this, &MainWindow::startCore);
connect(m_actionRestartCore, &QAction::triggered, this, &MainWindow::resetCore);
connect(m_actionStopCore, &QAction::triggered, this, &MainWindow::stopCore);
connect(m_actionShowHelp, &QAction::triggered, this, &MainWindow::showHelpViewer);
// Mac os tray will only show a menu
if (!deskflow::platform::isMac())
@ -672,6 +679,7 @@ void MainWindow::createMenuBar()
m_menuView->addAction(m_logDock->toggleViewAction());
m_menuHelp->addAction(m_actionAbout);
m_menuHelp->addAction(m_actionShowHelp);
m_menuHelp->addAction(m_actionReportBug);
m_menuHelp->addSeparator();
m_menuHelp->addAction(m_actionClearSettings);
@ -1063,6 +1071,8 @@ void MainWindow::updateText()
//: %1 will be the replaced with the appname
m_actionAbout->setText(tr("About %1...").arg(kAppName));
m_actionShowHelp->setText(tr("View &Help"));
//: start / restart core shortcut
m_actionStartCore->setShortcut(QKeySequence(tr("Ctrl+S")));
m_actionRestartCore->setShortcut(QKeySequence(tr("Ctrl+S")));
@ -1282,6 +1292,36 @@ void MainWindow::updateTimeoutDelay(int newDelay)
m_statusBar->setConnectionInterval(newDelay);
}
void MainWindow::setHelpFilePath()
{
const QString appPath = QCoreApplication::applicationDirPath();
const auto buildPath = QDir::cleanPath(QString("%1/../docs/user/html/index.html").arg(appPath));
auto installPath = QString("%1/../share/doc/deskflow/html/index.html").arg(appPath);
if (deskflow::platform::isMac())
installPath = QString("%1/Contents/Resources/docs/html/index.html").arg(appPath);
else if (deskflow::platform::isWindows())
installPath = QString("%1/docs/html/index.html").arg(appPath);
installPath = QDir::cleanPath(installPath);
if (QFile::exists(installPath))
m_helpPath = QUrl::fromLocalFile(installPath);
else if (QFile::exists(buildPath))
m_helpPath = QUrl::fromLocalFile(buildPath);
else
m_helpPath = kUrlWiki;
}
void MainWindow::showHelpViewer() const
{
if (m_helpPath.isLocalFile()) {
HelpDialog dialogHelp(this->centralWidget(), m_helpPath);
dialogHelp.exec();
} else {
QDesktopServices::openUrl(m_helpPath);
}
}
bool MainWindow::canRunCore() const
{
const auto mode = m_coreProcess.mode();

View file

@ -13,6 +13,7 @@
#include <QProcess>
#include <QRegularExpression>
#include <QSystemTrayIcon>
#include <QUrl>
#include "VersionChecker.h"
#include "config/ServerConfig.h"
@ -141,6 +142,8 @@ private:
void remoteHostChanged(const QString &newRemoteHost);
void updateIpLabel(const QStringList &addresses);
void updateTimeoutDelay(int newDelay);
void setHelpFilePath();
void showHelpViewer() const;
bool canRunCore() const;
@ -200,6 +203,7 @@ private:
QAction *m_actionStartCore = nullptr;
QAction *m_actionRestartCore = nullptr;
QAction *m_actionStopCore = nullptr;
QAction *m_actionShowHelp = nullptr;
// Network monitoring
NetworkMonitor *m_networkMonitor = nullptr;
@ -208,4 +212,5 @@ private:
// Server IP strategy optimization
QStringList m_serverStartIPs;
QString m_serverStartSuggestedIP;
QUrl m_helpPath;
};

View file

@ -0,0 +1,92 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2026 Deskflow Developers
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
#include "HelpDialog.h"
#include <common/Constants.h>
#include <QDesktopServices>
#include <QEvent>
#include <QPushButton>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <qfile.h>
HelpDialog::HelpDialog(QWidget *parent, const QUrl &source)
: QDialog(parent),
m_initialSource{source},
m_btnBack{new QPushButton(this)},
m_btnHome{new QPushButton(this)},
m_browser{new QTextBrowser(this)},
m_btnClose{new QPushButton(this)}
{
setWindowIcon(QIcon::fromTheme(QStringLiteral("question")));
m_btnBack->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::GoPrevious));
m_btnBack->setMaximumWidth(m_btnBack->height());
m_btnBack->setShortcut(QKeySequence::Back);
m_btnBack->setEnabled(false);
m_btnHome->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::GoHome));
m_btnHome->setMaximumWidth(m_btnHome->height());
m_btnHome->setEnabled(false);
m_btnClose->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::WindowClose));
updateText();
m_browser->setMinimumSize(650, 500);
m_browser->setOpenExternalLinks(false);
m_browser->setOpenLinks(false);
if (!source.isLocalFile()) {
QDesktopServices::openUrl(source);
} else {
m_browser->setSource(source);
}
auto topLayout = new QHBoxLayout;
topLayout->addWidget(m_btnBack);
topLayout->addWidget(m_btnHome);
topLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
auto layout = new QVBoxLayout;
layout->addLayout(topLayout);
layout->addWidget(m_browser);
layout->addWidget(m_btnClose);
setLayout(layout);
adjustSize();
connect(m_browser, &QTextBrowser::anchorClicked, this, &HelpDialog::linkClicked);
connect(m_browser, &QTextBrowser::historyChanged, this, &HelpDialog::historyChanged);
connect(m_btnBack, &QPushButton::clicked, m_browser, &QTextBrowser::backward);
connect(m_btnHome, &QPushButton::clicked, m_browser, &QTextBrowser::home);
connect(m_btnClose, &QPushButton::clicked, this, &QDialog::close);
}
void HelpDialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
if (e->type() == QEvent::LanguageChange) {
updateText();
}
}
void HelpDialog::updateText()
{
setWindowTitle(tr("%1 Help").arg(kAppName));
m_btnClose->setText(tr("Close"));
}
void HelpDialog::historyChanged()
{
m_btnBack->setEnabled(m_browser->isBackwardAvailable());
m_btnHome->setEnabled(m_browser->source() != m_initialSource);
}
void HelpDialog::linkClicked(const QUrl &url)
{
if (!url.isLocalFile())
QDesktopServices::openUrl(url);
else
m_browser->setSource(url);
}

View file

@ -0,0 +1,34 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2026 Deskflow Developers
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
#pragma once
#include <QDialog>
#include <QPushButton>
#include <QTextBrowser>
#include <QUrl>
class HelpDialog : public QDialog
{
Q_OBJECT
public:
explicit HelpDialog(QWidget *parent = nullptr, const QUrl &source = {});
~HelpDialog() override = default;
protected:
void changeEvent(QEvent *e) override;
private:
void updateText();
void historyChanged();
void linkClicked(const QUrl &url);
QUrl m_initialSource;
QPushButton *m_btnBack = nullptr;
QPushButton *m_btnHome = nullptr;
QTextBrowser *m_browser = nullptr;
QPushButton *m_btnClose = nullptr;
};

View file

@ -270,6 +270,17 @@ Do you want to connect to the server?
<translation type="unfinished">Formato hash no válido</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>%1 Help</source>
<translation type="unfinished">%1 Ayuda</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">Cerca</translation>
</message>
</context>
<context>
<name>HotkeyDialog</name>
<message>
@ -407,6 +418,10 @@ Do you want to connect to the server?
<extracomment>%1 will be the replaced with the appname</extracomment>
<translation type="unfinished">Acerca de %1...</translation>
</message>
<message>
<source>View &amp;Help</source>
<translation type="unfinished">Ver &amp;ayuda</translation>
</message>
<message>
<source>Ctrl+S</source>
<extracomment>start / restart core shortcut</extracomment>

View file

@ -270,6 +270,17 @@ Vuoi connetterti al server?
<translation>Formato hash non valido</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>%1 Help</source>
<translation type="unfinished">%1 Aiuto</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">Vicino</translation>
</message>
</context>
<context>
<name>HotkeyDialog</name>
<message>
@ -395,6 +406,10 @@ Vuoi connetterti al server?
<extracomment>%1 will be the replaced with the appname</extracomment>
<translation>Informazioni su %1...</translation>
</message>
<message>
<source>View &amp;Help</source>
<translation type="unfinished">Visualizza la &amp;guida</translation>
</message>
<message>
<source>Ctrl+S</source>
<extracomment>start / restart core shortcut</extracomment>

View file

@ -270,6 +270,17 @@ Do you want to connect to the server?
<translation>不正なハッシュ形式</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>%1 Help</source>
<translation type="unfinished">%1 ヘルプ</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">近い</translation>
</message>
</context>
<context>
<name>HotkeyDialog</name>
<message>
@ -421,6 +432,10 @@ Do you want to connect to the server?
<source>&lt;p&gt;Failed to connect to the server &apos;%1&apos;.&lt;/p&gt;&lt;p&gt;A Client with your name is already connected to the server.&lt;/p&gt;Please ensure that you&apos;re using a unique name and that only a single instance of the client process is running.&lt;/p&gt;</source>
<translation>&lt;p&gt;サーバー &apos;%1&apos; への接続に失敗しました。&lt;/p&gt;&lt;p&gt;同じ名前のクライアントがサーバーに接続済です。&lt;/p&gt;&lt;p&gt;名前の重複がないことと、クライアントプロセスが多重起動していない事を確認してください。&lt;/p&gt;</translation>
</message>
<message>
<source>View &amp;Help</source>
<translation type="unfinished">ヘルプを表示 (&amp;H)</translation>
</message>
<message>
<source>No IP Detected</source>
<translation>IPアドレスが見つかりません</translation>

View file

@ -270,6 +270,17 @@ Do you want to connect to the server?
<translation>잘못된 해시 형식</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>%1 Help</source>
<translation type="unfinished">%1 도움말</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">닫다</translation>
</message>
</context>
<context>
<name>HotkeyDialog</name>
<message>
@ -421,6 +432,10 @@ Do you want to connect to the server?
<source>&lt;p&gt;Failed to connect to the server &apos;%1&apos;.&lt;/p&gt;&lt;p&gt;A Client with your name is already connected to the server.&lt;/p&gt;Please ensure that you&apos;re using a unique name and that only a single instance of the client process is running.&lt;/p&gt;</source>
<translation>&lt;p&gt;서버 &apos;%1&apos;에 연결하지 못했습니다.&lt;/p&gt;&lt;p&gt;같은 이름의 클라이언트가 이미 서버에 연결되어 있습니다.&lt;/p&gt;&lt;p&gt;고유한 이름을 사용하고, 클라이언트 프로세스가 하나만 실행 중인지 확인하세요.&lt;/p&gt;</translation>
</message>
<message>
<source>View &amp;Help</source>
<translation type="unfinished">도움말 보기(&amp;H)</translation>
</message>
<message>
<source>No IP Detected</source>
<translation>IP를 감지하지 못했습니다</translation>

View file

@ -270,6 +270,17 @@ Do you want to connect to the server?
<translation>Неверный формат хэша</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>%1 Help</source>
<translation type="unfinished">%1 Справка</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">Закрывать</translation>
</message>
</context>
<context>
<name>HotkeyDialog</name>
<message>
@ -421,6 +432,10 @@ Do you want to connect to the server?
<source>&lt;p&gt;Failed to connect to the server &apos;%1&apos;.&lt;/p&gt;&lt;p&gt;A Client with your name is already connected to the server.&lt;/p&gt;Please ensure that you&apos;re using a unique name and that only a single instance of the client process is running.&lt;/p&gt;</source>
<translation>&lt;p&gt;Не удалось подключиться к серверу &apos;%1&apos;.&lt;/p&gt;&lt;p&gt;Клиент с таким именем уже подключен к серверу.&lt;/p&gt;Убедитесь, что вы используете уникальное имя и запущен только один процесс клиента.&lt;/p&gt;</translation>
</message>
<message>
<source>View &amp;Help</source>
<translation type="unfinished">Просмотр &amp;справки</translation>
</message>
<message>
<source>No IP Detected</source>
<translation>IP-адрес не обнаружен</translation>

View file

@ -270,6 +270,17 @@ Do you want to connect to the server?
<translation>无效的哈希格式</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>%1 Help</source>
<translation type="unfinished">%1 帮助</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">关闭</translation>
</message>
</context>
<context>
<name>HotkeyDialog</name>
<message>
@ -421,6 +432,10 @@ Do you want to connect to the server?
<source>&lt;p&gt;Failed to connect to the server &apos;%1&apos;.&lt;/p&gt;&lt;p&gt;A Client with your name is already connected to the server.&lt;/p&gt;Please ensure that you&apos;re using a unique name and that only a single instance of the client process is running.&lt;/p&gt;</source>
<translation>&lt;p&gt;连接到服务器“%1”失败。&lt;/p&gt;&lt;p&gt;一个同名的客户端已连接到服务器。&lt;/p&gt;请确保您使用的名称唯一,且只有一个客户端进程实例在运行。&lt;/p&gt;</translation>
</message>
<message>
<source>View &amp;Help</source>
<translation type="unfinished">查看帮助(&amp;H)</translation>
</message>
<message>
<source>No IP Detected</source>
<translation>未检测到 IP</translation>