Make the tray a single instance application

This commit is contained in:
Martchus 2016-09-24 16:19:23 +02:00
parent 23a4833b6e
commit e50c006dd7
13 changed files with 434 additions and 192 deletions

View File

@ -36,6 +36,7 @@ set(SRC_FILES
set(WIDGETS_HEADER_FILES set(WIDGETS_HEADER_FILES
application/settings.h application/settings.h
application/singleinstance.h
gui/trayicon.h gui/trayicon.h
gui/traywidget.h gui/traywidget.h
gui/traymenu.h gui/traymenu.h
@ -54,6 +55,7 @@ set(WIDGETS_HEADER_FILES
set(WIDGETS_SRC_FILES set(WIDGETS_SRC_FILES
application/main.cpp application/main.cpp
application/settings.cpp application/settings.cpp
application/singleinstance.cpp
gui/trayicon.cpp gui/trayicon.cpp
gui/traywidget.cpp gui/traywidget.cpp
gui/traymenu.cpp gui/traymenu.cpp

View File

@ -10,7 +10,7 @@ support
* Openbox/qt5ct/Tint2 * Openbox/qt5ct/Tint2
* Cinnamon * Cinnamon
* Windows 10 * Windows 10
* Can be shown as regular window if tray icon support is not available * Can be shown as regular window if tray icon support is not available
## Features ## Features
* Provides quick access to most frequently used features but does not intend to replace the official web UI * Provides quick access to most frequently used features but does not intend to replace the official web UI
@ -54,6 +54,12 @@ The tray is still under development; the following features are planned:
### Web view (dark color theme) ### Web view (dark color theme)
![Web view](/resources/screenshots/webview.png?raw=true) ![Web view](/resources/screenshots/webview.png?raw=true)
## Hotkey for Web UI
To create a hotkey for the web UI, you can use the same approach as for any other
application. Just add `--webui` to the arguments to trigger the web UI.
Syncthing Tray ensures that no second instance will be spawned if it is already
running.
## Download / binary repository ## Download / binary repository
I currently provide packages for Arch Linux and Windows. Sources for those packages can be found in a I currently provide packages for Arch Linux and Windows. Sources for those packages can be found in a
separate [repository](https://github.com/Martchus/PKGBUILDs). For binaries checkout my separate [repository](https://github.com/Martchus/PKGBUILDs). For binaries checkout my

View File

@ -1,6 +1,9 @@
#include "./settings.h" #include "./settings.h"
#include "./singleinstance.h"
#include "../gui/trayicon.h" #include "../gui/trayicon.h"
#include "../gui/traywidget.h" #include "../gui/traywidget.h"
#include "../data/syncthingprocess.h" #include "../data/syncthingprocess.h"
#include "resources/config.h" #include "resources/config.h"
@ -24,69 +27,101 @@ using namespace ApplicationUtilities;
using namespace QtGui; using namespace QtGui;
using namespace Data; using namespace Data;
int main(int argc, char *argv[]) int initSyncthingTray(bool windowed, bool waitForTray)
{ {
SET_APPLICATION_INFO; if(windowed) {
if(Settings::launchSynchting()) {
syncthingProcess().startSyncthing();
}
auto *trayWidget = new TrayWidget;
trayWidget->setAttribute(Qt::WA_DeleteOnClose);
trayWidget->show();
} else {
#ifndef QT_NO_SYSTEMTRAYICON
if(QSystemTrayIcon::isSystemTrayAvailable() || waitForTray) {
if(Settings::launchSynchting()) {
syncthingProcess().startSyncthing();
}
auto *trayIcon = new TrayIcon;
trayIcon->show();
if(Settings::firstLaunch()) {
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Information);
msgBox.setText(QCoreApplication::translate("main", "You must configure how to connect to Syncthing when using Syncthing Tray the first time."));
msgBox.setInformativeText(QCoreApplication::translate("main", "Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration."));
msgBox.exec();
trayIcon->trayMenu().widget()->showSettingsDialog();
}
} else {
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though."));
return -1;
}
#else
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though."));
return -2;
#endif
}
return 0;
}
int runApplication(int argc, const char *const *argv)
{
static bool firstRun = true;
// setup argument parser // setup argument parser
SET_APPLICATION_INFO;
ArgumentParser parser; ArgumentParser parser;
HelpArgument helpArg(parser); HelpArgument helpArg(parser);
// Qt configuration arguments // Qt configuration arguments
QT_CONFIG_ARGUMENTS qtConfigArgs; QT_CONFIG_ARGUMENTS qtConfigArgs;
Argument windowedArg("windowed", 'w', "opens the tray menu as a regular window"); Argument windowedArg("windowed", 'w', "opens the tray menu as a regular window");
windowedArg.setCombinable(true); windowedArg.setCombinable(true);
Argument showWebUi("webui", '\0', "instantly shows the web UI - meant for creating shortcut to web UI");
showWebUi.setCombinable(true);
Argument waitForTrayArg("wait", '\0', "wait until the system tray becomes available instead of showing an error message if the system tray is not available on start-up"); Argument waitForTrayArg("wait", '\0', "wait until the system tray becomes available instead of showing an error message if the system tray is not available on start-up");
waitForTrayArg.setCombinable(true); waitForTrayArg.setCombinable(true);
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&windowedArg); qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&windowedArg);
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&showWebUi);
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&waitForTrayArg); qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&waitForTrayArg);
parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &helpArg}); parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &helpArg});
try { try {
parser.parseArgs(argc, argv); parser.parseArgs(argc, argv);
if(qtConfigArgs.qtWidgetsGuiArg().isPresent()) { if(qtConfigArgs.qtWidgetsGuiArg().isPresent()) {
SET_QT_APPLICATION_INFO; if(firstRun) {
QApplication application(argc, argv); firstRun = false;
Settings::restore();
Settings::qtSettings().apply(); SET_QT_APPLICATION_INFO;
qtConfigArgs.applySettings(true); QApplication application(argc, const_cast<char **>(argv));
LOAD_QT_TRANSLATIONS; QGuiApplication::setQuitOnLastWindowClosed(false);
QtUtilitiesResources::init(); SingleInstance singleInstance(argc, argv);
int res; QObject::connect(&singleInstance, &SingleInstance::newInstance, &runApplication);
if(windowedArg.isPresent()) {
if(Settings::launchSynchting()) { Settings::restore();
syncthingProcess().startSyncthing(); Settings::qtSettings().apply();
} qtConfigArgs.applySettings(true);
TrayWidget trayWidget;
trayWidget.show(); LOAD_QT_TRANSLATIONS;
res = application.exec(); QtUtilitiesResources::init();
} else {
#ifndef QT_NO_SYSTEMTRAYICON int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
if(QSystemTrayIcon::isSystemTrayAvailable() || waitForTrayArg.isPresent()) { if(!res) {
if(Settings::launchSynchting()) { if(!TrayWidget::instances().empty() && showWebUi.isPresent()) {
syncthingProcess().startSyncthing(); TrayWidget::instances().front()->showWebUi();
}
application.setQuitOnLastWindowClosed(false);
TrayIcon trayIcon;
trayIcon.show();
if(Settings::firstLaunch()) {
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Information);
msgBox.setText(QCoreApplication::translate("main", "You must configure how to connect to Syncthing when using Syncthing Tray the first time."));
msgBox.setInformativeText(QCoreApplication::translate("main", "Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration."));
msgBox.exec();
trayIcon.trayMenu().widget()->showSettingsDialog();
} }
res = application.exec(); res = application.exec();
} else {
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though."));
res = -1;
} }
#else
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.")); Settings::save();
res = -2; QtUtilitiesResources::cleanup();
#endif return res;
} else {
if(!TrayWidget::instances().empty() && showWebUi.isPresent()) {
// if --webui is present don't create a new tray icon, just show the web UI one of the present ones
TrayWidget::instances().front()->showWebUi();
} else {
return initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
}
} }
Settings::save();
QtUtilitiesResources::cleanup();
return res;
} }
} catch(const Failure &ex) { } catch(const Failure &ex) {
CMD_UTILS_START_CONSOLE; CMD_UTILS_START_CONSOLE;
@ -96,3 +131,8 @@ int main(int argc, char *argv[])
return 0; return 0;
} }
int main(int argc, char *argv[])
{
return runApplication(argc, argv);
}

View File

@ -0,0 +1,97 @@
#include "./singleinstance.h"
#include <c++utilities/misc/memory.h>
#include <c++utilities/conversion/binaryconversion.h>
#include <QLocalServer>
#include <QLocalSocket>
#include <QStringBuilder>
#include <QCoreApplication>
#include <iostream>
using namespace std;
using namespace ConversionUtilities;
namespace QtGui {
SingleInstance::SingleInstance(int argc, const char *const *argv, QObject *parent) :
QObject(parent),
m_server(nullptr)
{
const QString appId(QCoreApplication::applicationName() % QStringLiteral(" by ") % QCoreApplication::organizationName());
// check for previous instance
QLocalSocket socket;
socket.connectToServer(appId, QLocalSocket::ReadWrite);
if(socket.waitForConnected(1000)) {
cerr << "Info: Application already running, sending args to previous instance" << endl;
if(argc >= 0 && argc <= 0xFFFF) {
char buffer[2];
BE::getBytes(static_cast<uint16>(argc), buffer);
socket.write(buffer, 2);
*buffer = '\0';
for(const char *const *end = argv + argc; argv != end; ++argv) {
socket.write(*argv);
socket.write(buffer, 1);
}
} else {
cerr << "Error: Unable to pass the specified number of arguments" << endl;
}
socket.flush();
socket.close();
exit(0);
}
// no previous instance running
// -> however, previous server instance might not have been cleaned up dute to crash
QLocalServer::removeServer(appId);
// -> start server
m_server = new QLocalServer(this);
connect(m_server, &QLocalServer::newConnection, this, &SingleInstance::handleNewConnection);
if(!m_server->listen(appId)) {
cerr << "Error: Unable to launch as single instance application" << endl;
}
}
void SingleInstance::handleNewConnection()
{
QLocalSocket *socket = m_server->nextPendingConnection();
connect(socket, &QLocalSocket::readChannelFinished, this, &SingleInstance::readArgs);
}
void SingleInstance::readArgs()
{
auto *socket = static_cast<QLocalSocket *>(sender());
// check arg data size
const auto argDataSize = socket->bytesAvailable();
if(argDataSize < 2 && argDataSize > (1024 * 1024)) {
cerr << "Error: Another application instance sent invalid argument data." << endl;
return;
}
// read arg data
auto argData = make_unique<char[]>(static_cast<size_t>(argDataSize));
socket->read(argData.get(), argDataSize);
socket->close();
socket->deleteLater();
// reconstruct argc argv array
uint16 argc = BE::toUInt16(argData.get());
vector<const char *> args;
args.reserve(argc + 1);
for(const char *argv = argData.get() + 2, *end = argData.get() + argDataSize, *i = argv; i != end && *argv;) {
if(!*i) {
args.push_back(argv);
argv = ++i;
} else {
++i;
}
}
args.push_back(nullptr);
emit newInstance(static_cast<int>(argc), args.data());
}
}

View File

@ -0,0 +1,34 @@
#ifndef SINGLEINSTANCE_H
#define SINGLEINSTANCE_H
#include <QObject>
QT_FORWARD_DECLARE_CLASS(QLocalServer)
namespace Data {
struct SyncthingDir;
}
namespace QtGui {
class SingleInstance : public QObject
{
Q_OBJECT
public:
SingleInstance(int argc, const char *const *argv, QObject *parent = nullptr);
Q_SIGNALS:
void newInstance(int argc, const char *const *argv);
private Q_SLOTS:
void handleNewConnection();
void readArgs();
private:
QLocalServer *m_server;
};
}
#endif // SINGLEINSTANCE_H

View File

@ -29,7 +29,9 @@ void SyncthingProcess::restartSyncthing()
void SyncthingProcess::startSyncthing() void SyncthingProcess::startSyncthing()
{ {
start(Settings::syncthingPath() % QChar(' ') % Settings::syncthingArgs(), QProcess::ReadOnly); if(state() == QProcess::NotRunning) {
start(Settings::syncthingPath() % QChar(' ') % Settings::syncthingArgs(), QProcess::ReadOnly);
}
} }
void SyncthingProcess::handleFinished(int exitCode, QProcess::ExitStatus exitStatus) void SyncthingProcess::handleFinished(int exitCode, QProcess::ExitStatus exitStatus)

View File

@ -6,7 +6,7 @@
#include <qtutilities/misc/dialogutils.h> #include <qtutilities/misc/dialogutils.h>
#include <QCoreApplication> #include <QApplication>
#include <QSvgRenderer> #include <QSvgRenderer>
#include <QPainter> #include <QPainter>
#include <QPixmap> #include <QPixmap>
@ -28,6 +28,7 @@ TrayIcon::TrayIcon(QObject *parent) :
m_statusIconNotify(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-notify.svg")))), m_statusIconNotify(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-notify.svg")))),
m_statusIconPause(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg")))), m_statusIconPause(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg")))),
m_statusIconSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg")))), m_statusIconSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg")))),
m_trayMenu(this),
m_status(SyncthingStatus::Disconnected) m_status(SyncthingStatus::Disconnected)
{ {
// set context menu // set context menu
@ -37,7 +38,7 @@ TrayIcon::TrayIcon(QObject *parent) :
m_contextMenu.addMenu(m_trayMenu.widget()->connectionsMenu()); m_contextMenu.addMenu(m_trayMenu.widget()->connectionsMenu());
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("help-about"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/help-about.svg"))), tr("About")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showAboutDialog); connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("help-about"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/help-about.svg"))), tr("About")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showAboutDialog);
m_contextMenu.addSeparator(); m_contextMenu.addSeparator();
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("window-close"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/window-close.svg"))), tr("Close")), &QAction::triggered, &QCoreApplication::quit); connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("window-close"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/window-close.svg"))), tr("Close")), &QAction::triggered, this, &TrayIcon::deleteLater);
setContextMenu(&m_contextMenu); setContextMenu(&m_contextMenu);
// set initial status // set initial status

View File

@ -1,5 +1,6 @@
#include "./traymenu.h" #include "./traymenu.h"
#include "./traywidget.h" #include "./traywidget.h"
#include "./trayicon.h"
#include "../application/settings.h" #include "../application/settings.h"
@ -7,8 +8,15 @@
namespace QtGui { namespace QtGui {
TrayMenu::TrayMenu(TrayIcon *trayIcon, QWidget *parent) :
TrayMenu(parent)
{
m_trayIcon = trayIcon;
}
TrayMenu::TrayMenu(QWidget *parent) : TrayMenu::TrayMenu(QWidget *parent) :
QMenu(parent) QMenu(parent),
m_trayIcon(nullptr)
{ {
auto *menuLayout = new QHBoxLayout; auto *menuLayout = new QHBoxLayout;
menuLayout->setMargin(0), menuLayout->setSpacing(0); menuLayout->setMargin(0), menuLayout->setSpacing(0);
@ -17,6 +25,11 @@ TrayMenu::TrayMenu(QWidget *parent) :
setPlatformMenu(nullptr); setPlatformMenu(nullptr);
} }
TrayMenu::~TrayMenu()
{
}
QSize TrayMenu::sizeHint() const QSize TrayMenu::sizeHint() const
{ {
return Settings::trayMenuSize(); return Settings::trayMenuSize();

View File

@ -5,6 +5,7 @@
namespace QtGui { namespace QtGui {
class TrayIcon;
class TrayWidget; class TrayWidget;
class TrayMenu : public QMenu class TrayMenu : public QMenu
@ -12,13 +13,17 @@ class TrayMenu : public QMenu
Q_OBJECT Q_OBJECT
public: public:
TrayMenu(TrayIcon *trayIcon, QWidget *parent = nullptr);
TrayMenu(QWidget *parent = nullptr); TrayMenu(QWidget *parent = nullptr);
~TrayMenu();
QSize sizeHint() const; QSize sizeHint() const;
TrayWidget *widget(); TrayWidget *widget();
TrayIcon *icon();
private: private:
TrayWidget *m_trayWidget; TrayWidget *m_trayWidget;
TrayIcon *m_trayIcon;
}; };
inline TrayWidget *TrayMenu::widget() inline TrayWidget *TrayMenu::widget()
@ -26,6 +31,11 @@ inline TrayWidget *TrayMenu::widget()
return m_trayWidget; return m_trayWidget;
} }
inline TrayIcon *TrayMenu::icon()
{
return m_trayIcon;
}
} }
#endif // TRAY_MENU_H #endif // TRAY_MENU_H

View File

@ -1,5 +1,6 @@
#include "./traywidget.h" #include "./traywidget.h"
#include "./traymenu.h" #include "./traymenu.h"
#include "./trayicon.h"
#include "./settingsdialog.h" #include "./settingsdialog.h"
#include "./webviewdialog.h" #include "./webviewdialog.h"
#include "./textviewdialog.h" #include "./textviewdialog.h"
@ -28,6 +29,7 @@
#include <QFontDatabase> #include <QFontDatabase>
#include <functional> #include <functional>
#include <algorithm>
using namespace ApplicationUtilities; using namespace ApplicationUtilities;
using namespace ConversionUtilities; using namespace ConversionUtilities;
@ -38,6 +40,8 @@ using namespace std;
namespace QtGui { namespace QtGui {
vector<TrayWidget *> TrayWidget::m_instances;
/*! /*!
* \brief Instantiates a new tray widget. * \brief Instantiates a new tray widget.
*/ */
@ -55,6 +59,8 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
m_dlModel(m_connection), m_dlModel(m_connection),
m_selectedConnection(nullptr) m_selectedConnection(nullptr)
{ {
m_instances.push_back(this);
m_ui->setupUi(this); m_ui->setupUi(this);
// setup model and view // setup model and view
@ -105,7 +111,7 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
// connect signals and slots // connect signals and slots
connect(m_ui->statusPushButton, &QPushButton::clicked, this, &TrayWidget::changeStatus); connect(m_ui->statusPushButton, &QPushButton::clicked, this, &TrayWidget::changeStatus);
connect(m_ui->closePushButton, &QPushButton::clicked, &QCoreApplication::quit); connect(m_ui->closePushButton, &QPushButton::clicked, this, &TrayWidget::quitTray);
connect(m_ui->aboutPushButton, &QPushButton::clicked, this, &TrayWidget::showAboutDialog); connect(m_ui->aboutPushButton, &QPushButton::clicked, this, &TrayWidget::showAboutDialog);
connect(m_ui->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUi); connect(m_ui->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUi);
connect(m_ui->settingsPushButton, &QPushButton::clicked, this, &TrayWidget::showSettingsDialog); connect(m_ui->settingsPushButton, &QPushButton::clicked, this, &TrayWidget::showSettingsDialog);
@ -126,7 +132,15 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
} }
TrayWidget::~TrayWidget() TrayWidget::~TrayWidget()
{} {
auto i = std::find(m_instances.begin(), m_instances.end(), this);
if(i != m_instances.end()) {
m_instances.erase(i);
}
if(m_instances.empty()) {
QCoreApplication::quit();
}
}
void TrayWidget::showSettingsDialog() void TrayWidget::showSettingsDialog()
{ {
@ -228,6 +242,21 @@ void TrayWidget::showNotifications()
m_ui->notificationsPushButton->setHidden(true); m_ui->notificationsPushButton->setHidden(true);
} }
void TrayWidget::quitTray()
{
QObject *parent;
if(m_menu) {
if(m_menu->icon()) {
parent = m_menu->icon();
} else {
parent = m_menu;
}
} else {
parent = this;
}
parent->deleteLater();
}
void TrayWidget::handleStatusChanged(SyncthingStatus status) void TrayWidget::handleStatusChanged(SyncthingStatus status)
{ {
switch(status) { switch(status) {

View File

@ -46,6 +46,7 @@ public:
Data::SyncthingConnection &connection(); Data::SyncthingConnection &connection();
QMenu *connectionsMenu(); QMenu *connectionsMenu();
static const std::vector<TrayWidget *> &instances();
public slots: public slots:
void showSettingsDialog(); void showSettingsDialog();
@ -54,6 +55,7 @@ public slots:
void showOwnDeviceId(); void showOwnDeviceId();
void showLog(); void showLog();
void showNotifications(); void showNotifications();
void quitTray();
private slots: private slots:
void handleStatusChanged(Data::SyncthingStatus status); void handleStatusChanged(Data::SyncthingStatus status);
@ -88,6 +90,7 @@ private:
QActionGroup *m_connectionsActionGroup; QActionGroup *m_connectionsActionGroup;
Settings::ConnectionSettings *m_selectedConnection; Settings::ConnectionSettings *m_selectedConnection;
std::vector<Data::SyncthingLogEntry> m_notifications; std::vector<Data::SyncthingLogEntry> m_notifications;
static std::vector<TrayWidget *> m_instances;
}; };
inline Data::SyncthingConnection &TrayWidget::connection() inline Data::SyncthingConnection &TrayWidget::connection()
@ -100,6 +103,11 @@ inline QMenu *TrayWidget::connectionsMenu()
return m_connectionsMenu; return m_connectionsMenu;
} }
inline const std::vector<TrayWidget *> &TrayWidget::instances()
{
return m_instances;
}
} }
#endif // TRAY_WIDGET_H #endif // TRAY_WIDGET_H

View File

@ -4,145 +4,145 @@
<context> <context>
<name>Data::SyncthingConnection</name> <name>Data::SyncthingConnection</name>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="172"/> <location filename="../data/syncthingconnection.cpp" line="170"/>
<source>disconnected</source> <source>disconnected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="174"/> <location filename="../data/syncthingconnection.cpp" line="172"/>
<source>reconnecting</source> <source>reconnecting</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="176"/> <location filename="../data/syncthingconnection.cpp" line="174"/>
<source>connected</source> <source>connected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="178"/> <location filename="../data/syncthingconnection.cpp" line="176"/>
<source>connected, notifications available</source> <source>connected, notifications available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="180"/> <location filename="../data/syncthingconnection.cpp" line="178"/>
<source>connected, paused</source> <source>connected, paused</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="182"/> <location filename="../data/syncthingconnection.cpp" line="180"/>
<source>connected, synchronizing</source> <source>connected, synchronizing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="184"/> <location filename="../data/syncthingconnection.cpp" line="182"/>
<source>unknown</source> <source>unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="196"/> <location filename="../data/syncthingconnection.cpp" line="194"/>
<location filename="../data/syncthingconnection.cpp" line="276"/> <location filename="../data/syncthingconnection.cpp" line="274"/>
<source>Connection configuration is insufficient.</source> <source>Connection configuration is insufficient.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="556"/> <location filename="../data/syncthingconnection.cpp" line="554"/>
<source>Unable to parse Syncthing log: </source> <source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="560"/> <location filename="../data/syncthingconnection.cpp" line="558"/>
<source>Unable to request system log: </source> <source>Unable to request system log: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="582"/> <location filename="../data/syncthingconnection.cpp" line="580"/>
<source>Unable to locate certificate used by Syncthing GUI.</source> <source>Unable to locate certificate used by Syncthing GUI.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="588"/> <location filename="../data/syncthingconnection.cpp" line="586"/>
<source>Unable to load certificate used by Syncthing GUI.</source> <source>Unable to load certificate used by Syncthing GUI.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="621"/> <location filename="../data/syncthingconnection.cpp" line="619"/>
<location filename="../data/syncthingconnection.cpp" line="723"/> <location filename="../data/syncthingconnection.cpp" line="721"/>
<source>Unable to parse Syncthing config: </source> <source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="627"/> <location filename="../data/syncthingconnection.cpp" line="625"/>
<location filename="../data/syncthingconnection.cpp" line="729"/> <location filename="../data/syncthingconnection.cpp" line="727"/>
<source>Unable to request Syncthing config: </source> <source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="804"/> <location filename="../data/syncthingconnection.cpp" line="802"/>
<source>Unable to parse connections: </source> <source>Unable to parse connections: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="810"/> <location filename="../data/syncthingconnection.cpp" line="808"/>
<source>Unable to request connections: </source> <source>Unable to request connections: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="865"/> <location filename="../data/syncthingconnection.cpp" line="863"/>
<source>Unable to parse directory statistics: </source> <source>Unable to parse directory statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="871"/> <location filename="../data/syncthingconnection.cpp" line="869"/>
<source>Unable to request directory statistics: </source> <source>Unable to request directory statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="908"/> <location filename="../data/syncthingconnection.cpp" line="906"/>
<source>Unable to parse device statistics: </source> <source>Unable to parse device statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="914"/> <location filename="../data/syncthingconnection.cpp" line="912"/>
<source>Unable to request device statistics: </source> <source>Unable to request device statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="949"/> <location filename="../data/syncthingconnection.cpp" line="947"/>
<source>Unable to parse errors: </source> <source>Unable to parse errors: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="960"/> <location filename="../data/syncthingconnection.cpp" line="958"/>
<source>Unable to request errors: </source> <source>Unable to request errors: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1011"/> <location filename="../data/syncthingconnection.cpp" line="1009"/>
<source>Unable to parse Syncthing events: </source> <source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1030"/> <location filename="../data/syncthingconnection.cpp" line="1028"/>
<source>Unable to request Syncthing events: </source> <source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1272"/> <location filename="../data/syncthingconnection.cpp" line="1265"/>
<source>Unable to request rescan: </source> <source>Unable to request rescan: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1287"/> <location filename="../data/syncthingconnection.cpp" line="1280"/>
<source>Unable to request pause/resume: </source> <source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1302"/> <location filename="../data/syncthingconnection.cpp" line="1295"/>
<source>Unable to request restart: </source> <source>Unable to request restart: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="527"/> <location filename="../data/syncthingconnection.cpp" line="525"/>
<source>Unable to request QR-Code: </source> <source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -769,82 +769,82 @@
<context> <context>
<name>QtGui::TrayIcon</name> <name>QtGui::TrayIcon</name>
<message> <message>
<location filename="../gui/trayicon.cpp" line="34"/> <location filename="../gui/trayicon.cpp" line="35"/>
<source>Web UI</source> <source>Web UI</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="35"/> <location filename="../gui/trayicon.cpp" line="36"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="36"/> <location filename="../gui/trayicon.cpp" line="37"/>
<source>Rescan all</source> <source>Rescan all</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="38"/> <location filename="../gui/trayicon.cpp" line="39"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="40"/> <location filename="../gui/trayicon.cpp" line="41"/>
<source>Close</source> <source>Close</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="85"/> <location filename="../gui/trayicon.cpp" line="86"/>
<source>Error</source> <source>Error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="92"/> <location filename="../gui/trayicon.cpp" line="93"/>
<source>Syncthing notification - click to dismiss</source> <source>Syncthing notification - click to dismiss</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="101"/> <location filename="../gui/trayicon.cpp" line="102"/>
<source>Not connected to Syncthing</source> <source>Not connected to Syncthing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="103"/> <location filename="../gui/trayicon.cpp" line="104"/>
<source>Disconnected from Syncthing</source> <source>Disconnected from Syncthing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="108"/> <location filename="../gui/trayicon.cpp" line="109"/>
<source>Reconnecting ...</source> <source>Reconnecting ...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="112"/> <location filename="../gui/trayicon.cpp" line="113"/>
<source>Syncthing is idling</source> <source>Syncthing is idling</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="116"/> <location filename="../gui/trayicon.cpp" line="117"/>
<source>Syncthing is scanning</source> <source>Syncthing is scanning</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="120"/> <location filename="../gui/trayicon.cpp" line="121"/>
<source>Notifications available</source> <source>Notifications available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="124"/> <location filename="../gui/trayicon.cpp" line="125"/>
<source>At least one device is paused</source> <source>At least one device is paused</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="128"/> <location filename="../gui/trayicon.cpp" line="129"/>
<source>Synchronization is ongoing</source> <source>Synchronization is ongoing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="138"/> <location filename="../gui/trayicon.cpp" line="139"/>
<source>Synchronization complete</source> <source>Synchronization complete</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -858,7 +858,7 @@
</message> </message>
<message> <message>
<location filename="../gui/traywidget.ui" line="107"/> <location filename="../gui/traywidget.ui" line="107"/>
<location filename="../gui/traywidget.cpp" line="235"/> <location filename="../gui/traywidget.cpp" line="264"/>
<source>Connect</source> <source>Connect</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -896,7 +896,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<message> <message>
<location filename="../gui/traywidget.ui" line="230"/> <location filename="../gui/traywidget.ui" line="230"/>
<location filename="../gui/traywidget.ui" line="250"/> <location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.cpp" line="371"/> <location filename="../gui/traywidget.cpp" line="400"/>
<source>unknown</source> <source>unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -922,7 +922,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.ui" line="80"/> <location filename="../gui/traywidget.ui" line="80"/>
<location filename="../gui/traywidget.cpp" line="145"/> <location filename="../gui/traywidget.cpp" line="159"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -937,88 +937,88 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="72"/> <location filename="../gui/traywidget.cpp" line="78"/>
<source>View own device ID</source> <source>View own device ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="87"/> <location filename="../gui/traywidget.cpp" line="93"/>
<source>Rescan all directories</source> <source>Rescan all directories</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="82"/> <location filename="../gui/traywidget.cpp" line="88"/>
<source>Show Syncthing log</source> <source>Show Syncthing log</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="77"/> <location filename="../gui/traywidget.cpp" line="83"/>
<source>Restart Syncthing</source> <source>Restart Syncthing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="94"/> <location filename="../gui/traywidget.cpp" line="100"/>
<source>Connection</source> <source>Connection</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="185"/> <location filename="../gui/traywidget.cpp" line="199"/>
<source>device ID is unknown</source> <source>device ID is unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="193"/> <location filename="../gui/traywidget.cpp" line="207"/>
<source>Copy to clipboard</source> <source>Copy to clipboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.ui" line="276"/> <location filename="../gui/traywidget.ui" line="276"/>
<location filename="../gui/traywidget.cpp" line="221"/> <location filename="../gui/traywidget.cpp" line="235"/>
<source>New notifications</source> <source>New notifications</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="236"/> <location filename="../gui/traywidget.cpp" line="265"/>
<source>Not connected to Syncthing, click to connect</source> <source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="248"/> <location filename="../gui/traywidget.cpp" line="277"/>
<source>Pause</source> <source>Pause</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="249"/> <location filename="../gui/traywidget.cpp" line="278"/>
<source>Syncthing is running, click to pause all devices</source> <source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="255"/> <location filename="../gui/traywidget.cpp" line="284"/>
<source>At least one device is paused, click to resume</source> <source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="319"/> <location filename="../gui/traywidget.cpp" line="348"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source> <source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="328"/> <location filename="../gui/traywidget.cpp" line="357"/>
<source>The file &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source> <source>The file &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="254"/> <location filename="../gui/traywidget.cpp" line="283"/>
<source>Continue</source> <source>Continue</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="175"/> <location filename="../gui/traywidget.cpp" line="189"/>
<source>Own device ID</source> <source>Own device ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="207"/> <location filename="../gui/traywidget.cpp" line="221"/>
<source>Log</source> <source>Log</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1082,22 +1082,22 @@ The Web UI will be opened in the default web browser instead.</source>
<context> <context>
<name>main</name> <name>main</name>
<message> <message>
<location filename="../application/main.cpp" line="72"/> <location filename="../application/main.cpp" line="50"/>
<source>You must configure how to connect to Syncthing when using Syncthing Tray the first time.</source> <source>You must configure how to connect to Syncthing when using Syncthing Tray the first time.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../application/main.cpp" line="73"/> <location filename="../application/main.cpp" line="51"/>
<source>Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.</source> <source>Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../application/main.cpp" line="79"/> <location filename="../application/main.cpp" line="56"/>
<source>The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though.</source> <source>The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../application/main.cpp" line="83"/> <location filename="../application/main.cpp" line="60"/>
<source>The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.</source> <source>The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -4,145 +4,145 @@
<context> <context>
<name>Data::SyncthingConnection</name> <name>Data::SyncthingConnection</name>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="172"/> <location filename="../data/syncthingconnection.cpp" line="170"/>
<source>disconnected</source> <source>disconnected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="174"/> <location filename="../data/syncthingconnection.cpp" line="172"/>
<source>reconnecting</source> <source>reconnecting</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="176"/> <location filename="../data/syncthingconnection.cpp" line="174"/>
<source>connected</source> <source>connected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="178"/> <location filename="../data/syncthingconnection.cpp" line="176"/>
<source>connected, notifications available</source> <source>connected, notifications available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="180"/> <location filename="../data/syncthingconnection.cpp" line="178"/>
<source>connected, paused</source> <source>connected, paused</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="182"/> <location filename="../data/syncthingconnection.cpp" line="180"/>
<source>connected, synchronizing</source> <source>connected, synchronizing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="184"/> <location filename="../data/syncthingconnection.cpp" line="182"/>
<source>unknown</source> <source>unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="196"/> <location filename="../data/syncthingconnection.cpp" line="194"/>
<location filename="../data/syncthingconnection.cpp" line="276"/> <location filename="../data/syncthingconnection.cpp" line="274"/>
<source>Connection configuration is insufficient.</source> <source>Connection configuration is insufficient.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="556"/> <location filename="../data/syncthingconnection.cpp" line="554"/>
<source>Unable to parse Syncthing log: </source> <source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="560"/> <location filename="../data/syncthingconnection.cpp" line="558"/>
<source>Unable to request system log: </source> <source>Unable to request system log: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="582"/> <location filename="../data/syncthingconnection.cpp" line="580"/>
<source>Unable to locate certificate used by Syncthing GUI.</source> <source>Unable to locate certificate used by Syncthing GUI.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="588"/> <location filename="../data/syncthingconnection.cpp" line="586"/>
<source>Unable to load certificate used by Syncthing GUI.</source> <source>Unable to load certificate used by Syncthing GUI.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="621"/> <location filename="../data/syncthingconnection.cpp" line="619"/>
<location filename="../data/syncthingconnection.cpp" line="723"/> <location filename="../data/syncthingconnection.cpp" line="721"/>
<source>Unable to parse Syncthing config: </source> <source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="627"/> <location filename="../data/syncthingconnection.cpp" line="625"/>
<location filename="../data/syncthingconnection.cpp" line="729"/> <location filename="../data/syncthingconnection.cpp" line="727"/>
<source>Unable to request Syncthing config: </source> <source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="804"/> <location filename="../data/syncthingconnection.cpp" line="802"/>
<source>Unable to parse connections: </source> <source>Unable to parse connections: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="810"/> <location filename="../data/syncthingconnection.cpp" line="808"/>
<source>Unable to request connections: </source> <source>Unable to request connections: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="865"/> <location filename="../data/syncthingconnection.cpp" line="863"/>
<source>Unable to parse directory statistics: </source> <source>Unable to parse directory statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="871"/> <location filename="../data/syncthingconnection.cpp" line="869"/>
<source>Unable to request directory statistics: </source> <source>Unable to request directory statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="908"/> <location filename="../data/syncthingconnection.cpp" line="906"/>
<source>Unable to parse device statistics: </source> <source>Unable to parse device statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="914"/> <location filename="../data/syncthingconnection.cpp" line="912"/>
<source>Unable to request device statistics: </source> <source>Unable to request device statistics: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="949"/> <location filename="../data/syncthingconnection.cpp" line="947"/>
<source>Unable to parse errors: </source> <source>Unable to parse errors: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="960"/> <location filename="../data/syncthingconnection.cpp" line="958"/>
<source>Unable to request errors: </source> <source>Unable to request errors: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1011"/> <location filename="../data/syncthingconnection.cpp" line="1009"/>
<source>Unable to parse Syncthing events: </source> <source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1030"/> <location filename="../data/syncthingconnection.cpp" line="1028"/>
<source>Unable to request Syncthing events: </source> <source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1272"/> <location filename="../data/syncthingconnection.cpp" line="1265"/>
<source>Unable to request rescan: </source> <source>Unable to request rescan: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1287"/> <location filename="../data/syncthingconnection.cpp" line="1280"/>
<source>Unable to request pause/resume: </source> <source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="1302"/> <location filename="../data/syncthingconnection.cpp" line="1295"/>
<source>Unable to request restart: </source> <source>Unable to request restart: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../data/syncthingconnection.cpp" line="527"/> <location filename="../data/syncthingconnection.cpp" line="525"/>
<source>Unable to request QR-Code: </source> <source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -769,82 +769,82 @@
<context> <context>
<name>QtGui::TrayIcon</name> <name>QtGui::TrayIcon</name>
<message> <message>
<location filename="../gui/trayicon.cpp" line="34"/> <location filename="../gui/trayicon.cpp" line="35"/>
<source>Web UI</source> <source>Web UI</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="35"/> <location filename="../gui/trayicon.cpp" line="36"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="36"/> <location filename="../gui/trayicon.cpp" line="37"/>
<source>Rescan all</source> <source>Rescan all</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="38"/> <location filename="../gui/trayicon.cpp" line="39"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="40"/> <location filename="../gui/trayicon.cpp" line="41"/>
<source>Close</source> <source>Close</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="85"/> <location filename="../gui/trayicon.cpp" line="86"/>
<source>Error</source> <source>Error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="92"/> <location filename="../gui/trayicon.cpp" line="93"/>
<source>Syncthing notification - click to dismiss</source> <source>Syncthing notification - click to dismiss</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="101"/> <location filename="../gui/trayicon.cpp" line="102"/>
<source>Not connected to Syncthing</source> <source>Not connected to Syncthing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="103"/> <location filename="../gui/trayicon.cpp" line="104"/>
<source>Disconnected from Syncthing</source> <source>Disconnected from Syncthing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="108"/> <location filename="../gui/trayicon.cpp" line="109"/>
<source>Reconnecting ...</source> <source>Reconnecting ...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="112"/> <location filename="../gui/trayicon.cpp" line="113"/>
<source>Syncthing is idling</source> <source>Syncthing is idling</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="116"/> <location filename="../gui/trayicon.cpp" line="117"/>
<source>Syncthing is scanning</source> <source>Syncthing is scanning</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="120"/> <location filename="../gui/trayicon.cpp" line="121"/>
<source>Notifications available</source> <source>Notifications available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="124"/> <location filename="../gui/trayicon.cpp" line="125"/>
<source>At least one device is paused</source> <source>At least one device is paused</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="128"/> <location filename="../gui/trayicon.cpp" line="129"/>
<source>Synchronization is ongoing</source> <source>Synchronization is ongoing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/trayicon.cpp" line="138"/> <location filename="../gui/trayicon.cpp" line="139"/>
<source>Synchronization complete</source> <source>Synchronization complete</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -858,7 +858,7 @@
</message> </message>
<message> <message>
<location filename="../gui/traywidget.ui" line="107"/> <location filename="../gui/traywidget.ui" line="107"/>
<location filename="../gui/traywidget.cpp" line="235"/> <location filename="../gui/traywidget.cpp" line="264"/>
<source>Connect</source> <source>Connect</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -896,7 +896,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<message> <message>
<location filename="../gui/traywidget.ui" line="230"/> <location filename="../gui/traywidget.ui" line="230"/>
<location filename="../gui/traywidget.ui" line="250"/> <location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.cpp" line="371"/> <location filename="../gui/traywidget.cpp" line="400"/>
<source>unknown</source> <source>unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -922,7 +922,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.ui" line="80"/> <location filename="../gui/traywidget.ui" line="80"/>
<location filename="../gui/traywidget.cpp" line="145"/> <location filename="../gui/traywidget.cpp" line="159"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -937,88 +937,88 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="72"/> <location filename="../gui/traywidget.cpp" line="78"/>
<source>View own device ID</source> <source>View own device ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="87"/> <location filename="../gui/traywidget.cpp" line="93"/>
<source>Rescan all directories</source> <source>Rescan all directories</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="82"/> <location filename="../gui/traywidget.cpp" line="88"/>
<source>Show Syncthing log</source> <source>Show Syncthing log</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="77"/> <location filename="../gui/traywidget.cpp" line="83"/>
<source>Restart Syncthing</source> <source>Restart Syncthing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="94"/> <location filename="../gui/traywidget.cpp" line="100"/>
<source>Connection</source> <source>Connection</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="185"/> <location filename="../gui/traywidget.cpp" line="199"/>
<source>device ID is unknown</source> <source>device ID is unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="193"/> <location filename="../gui/traywidget.cpp" line="207"/>
<source>Copy to clipboard</source> <source>Copy to clipboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.ui" line="276"/> <location filename="../gui/traywidget.ui" line="276"/>
<location filename="../gui/traywidget.cpp" line="221"/> <location filename="../gui/traywidget.cpp" line="235"/>
<source>New notifications</source> <source>New notifications</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="236"/> <location filename="../gui/traywidget.cpp" line="265"/>
<source>Not connected to Syncthing, click to connect</source> <source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="248"/> <location filename="../gui/traywidget.cpp" line="277"/>
<source>Pause</source> <source>Pause</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="249"/> <location filename="../gui/traywidget.cpp" line="278"/>
<source>Syncthing is running, click to pause all devices</source> <source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="255"/> <location filename="../gui/traywidget.cpp" line="284"/>
<source>At least one device is paused, click to resume</source> <source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="319"/> <location filename="../gui/traywidget.cpp" line="348"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source> <source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="328"/> <location filename="../gui/traywidget.cpp" line="357"/>
<source>The file &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source> <source>The file &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="254"/> <location filename="../gui/traywidget.cpp" line="283"/>
<source>Continue</source> <source>Continue</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="175"/> <location filename="../gui/traywidget.cpp" line="189"/>
<source>Own device ID</source> <source>Own device ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../gui/traywidget.cpp" line="207"/> <location filename="../gui/traywidget.cpp" line="221"/>
<source>Log</source> <source>Log</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1082,22 +1082,22 @@ The Web UI will be opened in the default web browser instead.</source>
<context> <context>
<name>main</name> <name>main</name>
<message> <message>
<location filename="../application/main.cpp" line="72"/> <location filename="../application/main.cpp" line="50"/>
<source>You must configure how to connect to Syncthing when using Syncthing Tray the first time.</source> <source>You must configure how to connect to Syncthing when using Syncthing Tray the first time.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../application/main.cpp" line="73"/> <location filename="../application/main.cpp" line="51"/>
<source>Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.</source> <source>Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../application/main.cpp" line="79"/> <location filename="../application/main.cpp" line="56"/>
<source>The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though.</source> <source>The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../application/main.cpp" line="83"/> <location filename="../application/main.cpp" line="60"/>
<source>The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.</source> <source>The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>