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
application/settings.h
application/singleinstance.h
gui/trayicon.h
gui/traywidget.h
gui/traymenu.h
@ -54,6 +55,7 @@ set(WIDGETS_HEADER_FILES
set(WIDGETS_SRC_FILES
application/main.cpp
application/settings.cpp
application/singleinstance.cpp
gui/trayicon.cpp
gui/traywidget.cpp
gui/traymenu.cpp

View File

@ -10,7 +10,7 @@ support
* Openbox/qt5ct/Tint2
* Cinnamon
* 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
* 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](/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
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

View File

@ -1,6 +1,9 @@
#include "./settings.h"
#include "./singleinstance.h"
#include "../gui/trayicon.h"
#include "../gui/traywidget.h"
#include "../data/syncthingprocess.h"
#include "resources/config.h"
@ -24,69 +27,101 @@ using namespace ApplicationUtilities;
using namespace QtGui;
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
SET_APPLICATION_INFO;
ArgumentParser parser;
HelpArgument helpArg(parser);
// Qt configuration arguments
QT_CONFIG_ARGUMENTS qtConfigArgs;
Argument windowedArg("windowed", 'w', "opens the tray menu as a regular window");
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");
waitForTrayArg.setCombinable(true);
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&windowedArg);
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&showWebUi);
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&waitForTrayArg);
parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &helpArg});
try {
parser.parseArgs(argc, argv);
if(qtConfigArgs.qtWidgetsGuiArg().isPresent()) {
SET_QT_APPLICATION_INFO;
QApplication application(argc, argv);
Settings::restore();
Settings::qtSettings().apply();
qtConfigArgs.applySettings(true);
LOAD_QT_TRANSLATIONS;
QtUtilitiesResources::init();
int res;
if(windowedArg.isPresent()) {
if(Settings::launchSynchting()) {
syncthingProcess().startSyncthing();
}
TrayWidget trayWidget;
trayWidget.show();
res = application.exec();
} else {
#ifndef QT_NO_SYSTEMTRAYICON
if(QSystemTrayIcon::isSystemTrayAvailable() || waitForTrayArg.isPresent()) {
if(Settings::launchSynchting()) {
syncthingProcess().startSyncthing();
}
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();
if(firstRun) {
firstRun = false;
SET_QT_APPLICATION_INFO;
QApplication application(argc, const_cast<char **>(argv));
QGuiApplication::setQuitOnLastWindowClosed(false);
SingleInstance singleInstance(argc, argv);
QObject::connect(&singleInstance, &SingleInstance::newInstance, &runApplication);
Settings::restore();
Settings::qtSettings().apply();
qtConfigArgs.applySettings(true);
LOAD_QT_TRANSLATIONS;
QtUtilitiesResources::init();
int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
if(!res) {
if(!TrayWidget::instances().empty() && showWebUi.isPresent()) {
TrayWidget::instances().front()->showWebUi();
}
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."));
res = -2;
#endif
Settings::save();
QtUtilitiesResources::cleanup();
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) {
CMD_UTILS_START_CONSOLE;
@ -96,3 +131,8 @@ int main(int argc, char *argv[])
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()
{
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)

View File

@ -6,7 +6,7 @@
#include <qtutilities/misc/dialogutils.h>
#include <QCoreApplication>
#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
#include <QPixmap>
@ -28,6 +28,7 @@ TrayIcon::TrayIcon(QObject *parent) :
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_statusIconSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg")))),
m_trayMenu(this),
m_status(SyncthingStatus::Disconnected)
{
// set context menu
@ -37,7 +38,7 @@ TrayIcon::TrayIcon(QObject *parent) :
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);
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);
// set initial status

View File

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

View File

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

View File

@ -1,5 +1,6 @@
#include "./traywidget.h"
#include "./traymenu.h"
#include "./trayicon.h"
#include "./settingsdialog.h"
#include "./webviewdialog.h"
#include "./textviewdialog.h"
@ -28,6 +29,7 @@
#include <QFontDatabase>
#include <functional>
#include <algorithm>
using namespace ApplicationUtilities;
using namespace ConversionUtilities;
@ -38,6 +40,8 @@ using namespace std;
namespace QtGui {
vector<TrayWidget *> TrayWidget::m_instances;
/*!
* \brief Instantiates a new tray widget.
*/
@ -55,6 +59,8 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
m_dlModel(m_connection),
m_selectedConnection(nullptr)
{
m_instances.push_back(this);
m_ui->setupUi(this);
// setup model and view
@ -105,7 +111,7 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
// connect signals and slots
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->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUi);
connect(m_ui->settingsPushButton, &QPushButton::clicked, this, &TrayWidget::showSettingsDialog);
@ -126,7 +132,15 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
}
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()
{
@ -228,6 +242,21 @@ void TrayWidget::showNotifications()
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)
{
switch(status) {

View File

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

View File

@ -4,145 +4,145 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../data/syncthingconnection.cpp" line="172"/>
<location filename="../data/syncthingconnection.cpp" line="170"/>
<source>disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="174"/>
<location filename="../data/syncthingconnection.cpp" line="172"/>
<source>reconnecting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="176"/>
<location filename="../data/syncthingconnection.cpp" line="174"/>
<source>connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="178"/>
<location filename="../data/syncthingconnection.cpp" line="176"/>
<source>connected, notifications available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="180"/>
<location filename="../data/syncthingconnection.cpp" line="178"/>
<source>connected, paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="182"/>
<location filename="../data/syncthingconnection.cpp" line="180"/>
<source>connected, synchronizing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="184"/>
<location filename="../data/syncthingconnection.cpp" line="182"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="196"/>
<location filename="../data/syncthingconnection.cpp" line="276"/>
<location filename="../data/syncthingconnection.cpp" line="194"/>
<location filename="../data/syncthingconnection.cpp" line="274"/>
<source>Connection configuration is insufficient.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="556"/>
<location filename="../data/syncthingconnection.cpp" line="554"/>
<source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="560"/>
<location filename="../data/syncthingconnection.cpp" line="558"/>
<source>Unable to request system log: </source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="621"/>
<location filename="../data/syncthingconnection.cpp" line="723"/>
<location filename="../data/syncthingconnection.cpp" line="619"/>
<location filename="../data/syncthingconnection.cpp" line="721"/>
<source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="627"/>
<location filename="../data/syncthingconnection.cpp" line="729"/>
<location filename="../data/syncthingconnection.cpp" line="625"/>
<location filename="../data/syncthingconnection.cpp" line="727"/>
<source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="804"/>
<location filename="../data/syncthingconnection.cpp" line="802"/>
<source>Unable to parse connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="810"/>
<location filename="../data/syncthingconnection.cpp" line="808"/>
<source>Unable to request connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="865"/>
<location filename="../data/syncthingconnection.cpp" line="863"/>
<source>Unable to parse directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="871"/>
<location filename="../data/syncthingconnection.cpp" line="869"/>
<source>Unable to request directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="908"/>
<location filename="../data/syncthingconnection.cpp" line="906"/>
<source>Unable to parse device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="914"/>
<location filename="../data/syncthingconnection.cpp" line="912"/>
<source>Unable to request device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="949"/>
<location filename="../data/syncthingconnection.cpp" line="947"/>
<source>Unable to parse errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="960"/>
<location filename="../data/syncthingconnection.cpp" line="958"/>
<source>Unable to request errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1011"/>
<location filename="../data/syncthingconnection.cpp" line="1009"/>
<source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1030"/>
<location filename="../data/syncthingconnection.cpp" line="1028"/>
<source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1272"/>
<location filename="../data/syncthingconnection.cpp" line="1265"/>
<source>Unable to request rescan: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1287"/>
<location filename="../data/syncthingconnection.cpp" line="1280"/>
<source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1302"/>
<location filename="../data/syncthingconnection.cpp" line="1295"/>
<source>Unable to request restart: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="527"/>
<location filename="../data/syncthingconnection.cpp" line="525"/>
<source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation>
</message>
@ -769,82 +769,82 @@
<context>
<name>QtGui::TrayIcon</name>
<message>
<location filename="../gui/trayicon.cpp" line="34"/>
<location filename="../gui/trayicon.cpp" line="35"/>
<source>Web UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="35"/>
<location filename="../gui/trayicon.cpp" line="36"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="36"/>
<location filename="../gui/trayicon.cpp" line="37"/>
<source>Rescan all</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="38"/>
<location filename="../gui/trayicon.cpp" line="39"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="40"/>
<location filename="../gui/trayicon.cpp" line="41"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="85"/>
<location filename="../gui/trayicon.cpp" line="86"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="92"/>
<location filename="../gui/trayicon.cpp" line="93"/>
<source>Syncthing notification - click to dismiss</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="101"/>
<location filename="../gui/trayicon.cpp" line="102"/>
<source>Not connected to Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="103"/>
<location filename="../gui/trayicon.cpp" line="104"/>
<source>Disconnected from Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="108"/>
<location filename="../gui/trayicon.cpp" line="109"/>
<source>Reconnecting ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="112"/>
<location filename="../gui/trayicon.cpp" line="113"/>
<source>Syncthing is idling</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="116"/>
<location filename="../gui/trayicon.cpp" line="117"/>
<source>Syncthing is scanning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="120"/>
<location filename="../gui/trayicon.cpp" line="121"/>
<source>Notifications available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="124"/>
<location filename="../gui/trayicon.cpp" line="125"/>
<source>At least one device is paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="128"/>
<location filename="../gui/trayicon.cpp" line="129"/>
<source>Synchronization is ongoing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="138"/>
<location filename="../gui/trayicon.cpp" line="139"/>
<source>Synchronization complete</source>
<translation type="unfinished"></translation>
</message>
@ -858,7 +858,7 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="107"/>
<location filename="../gui/traywidget.cpp" line="235"/>
<location filename="../gui/traywidget.cpp" line="264"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
@ -896,7 +896,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<message>
<location filename="../gui/traywidget.ui" line="230"/>
<location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.cpp" line="371"/>
<location filename="../gui/traywidget.cpp" line="400"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@ -922,7 +922,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="80"/>
<location filename="../gui/traywidget.cpp" line="145"/>
<location filename="../gui/traywidget.cpp" line="159"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
@ -937,88 +937,88 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="72"/>
<location filename="../gui/traywidget.cpp" line="78"/>
<source>View own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="87"/>
<location filename="../gui/traywidget.cpp" line="93"/>
<source>Rescan all directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="82"/>
<location filename="../gui/traywidget.cpp" line="88"/>
<source>Show Syncthing log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="77"/>
<location filename="../gui/traywidget.cpp" line="83"/>
<source>Restart Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="94"/>
<location filename="../gui/traywidget.cpp" line="100"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="185"/>
<location filename="../gui/traywidget.cpp" line="199"/>
<source>device ID is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="193"/>
<location filename="../gui/traywidget.cpp" line="207"/>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="248"/>
<location filename="../gui/traywidget.cpp" line="277"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="254"/>
<location filename="../gui/traywidget.cpp" line="283"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="175"/>
<location filename="../gui/traywidget.cpp" line="189"/>
<source>Own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="207"/>
<location filename="../gui/traywidget.cpp" line="221"/>
<source>Log</source>
<translation type="unfinished"></translation>
</message>
@ -1082,22 +1082,22 @@ The Web UI will be opened in the default web browser instead.</source>
<context>
<name>main</name>
<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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>

View File

@ -4,145 +4,145 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../data/syncthingconnection.cpp" line="172"/>
<location filename="../data/syncthingconnection.cpp" line="170"/>
<source>disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="174"/>
<location filename="../data/syncthingconnection.cpp" line="172"/>
<source>reconnecting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="176"/>
<location filename="../data/syncthingconnection.cpp" line="174"/>
<source>connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="178"/>
<location filename="../data/syncthingconnection.cpp" line="176"/>
<source>connected, notifications available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="180"/>
<location filename="../data/syncthingconnection.cpp" line="178"/>
<source>connected, paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="182"/>
<location filename="../data/syncthingconnection.cpp" line="180"/>
<source>connected, synchronizing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="184"/>
<location filename="../data/syncthingconnection.cpp" line="182"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="196"/>
<location filename="../data/syncthingconnection.cpp" line="276"/>
<location filename="../data/syncthingconnection.cpp" line="194"/>
<location filename="../data/syncthingconnection.cpp" line="274"/>
<source>Connection configuration is insufficient.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="556"/>
<location filename="../data/syncthingconnection.cpp" line="554"/>
<source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="560"/>
<location filename="../data/syncthingconnection.cpp" line="558"/>
<source>Unable to request system log: </source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="621"/>
<location filename="../data/syncthingconnection.cpp" line="723"/>
<location filename="../data/syncthingconnection.cpp" line="619"/>
<location filename="../data/syncthingconnection.cpp" line="721"/>
<source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="627"/>
<location filename="../data/syncthingconnection.cpp" line="729"/>
<location filename="../data/syncthingconnection.cpp" line="625"/>
<location filename="../data/syncthingconnection.cpp" line="727"/>
<source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="804"/>
<location filename="../data/syncthingconnection.cpp" line="802"/>
<source>Unable to parse connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="810"/>
<location filename="../data/syncthingconnection.cpp" line="808"/>
<source>Unable to request connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="865"/>
<location filename="../data/syncthingconnection.cpp" line="863"/>
<source>Unable to parse directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="871"/>
<location filename="../data/syncthingconnection.cpp" line="869"/>
<source>Unable to request directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="908"/>
<location filename="../data/syncthingconnection.cpp" line="906"/>
<source>Unable to parse device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="914"/>
<location filename="../data/syncthingconnection.cpp" line="912"/>
<source>Unable to request device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="949"/>
<location filename="../data/syncthingconnection.cpp" line="947"/>
<source>Unable to parse errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="960"/>
<location filename="../data/syncthingconnection.cpp" line="958"/>
<source>Unable to request errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1011"/>
<location filename="../data/syncthingconnection.cpp" line="1009"/>
<source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1030"/>
<location filename="../data/syncthingconnection.cpp" line="1028"/>
<source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1272"/>
<location filename="../data/syncthingconnection.cpp" line="1265"/>
<source>Unable to request rescan: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1287"/>
<location filename="../data/syncthingconnection.cpp" line="1280"/>
<source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="1302"/>
<location filename="../data/syncthingconnection.cpp" line="1295"/>
<source>Unable to request restart: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="527"/>
<location filename="../data/syncthingconnection.cpp" line="525"/>
<source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation>
</message>
@ -769,82 +769,82 @@
<context>
<name>QtGui::TrayIcon</name>
<message>
<location filename="../gui/trayicon.cpp" line="34"/>
<location filename="../gui/trayicon.cpp" line="35"/>
<source>Web UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="35"/>
<location filename="../gui/trayicon.cpp" line="36"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="36"/>
<location filename="../gui/trayicon.cpp" line="37"/>
<source>Rescan all</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="38"/>
<location filename="../gui/trayicon.cpp" line="39"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="40"/>
<location filename="../gui/trayicon.cpp" line="41"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="85"/>
<location filename="../gui/trayicon.cpp" line="86"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="92"/>
<location filename="../gui/trayicon.cpp" line="93"/>
<source>Syncthing notification - click to dismiss</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="101"/>
<location filename="../gui/trayicon.cpp" line="102"/>
<source>Not connected to Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="103"/>
<location filename="../gui/trayicon.cpp" line="104"/>
<source>Disconnected from Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="108"/>
<location filename="../gui/trayicon.cpp" line="109"/>
<source>Reconnecting ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="112"/>
<location filename="../gui/trayicon.cpp" line="113"/>
<source>Syncthing is idling</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="116"/>
<location filename="../gui/trayicon.cpp" line="117"/>
<source>Syncthing is scanning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="120"/>
<location filename="../gui/trayicon.cpp" line="121"/>
<source>Notifications available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="124"/>
<location filename="../gui/trayicon.cpp" line="125"/>
<source>At least one device is paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="128"/>
<location filename="../gui/trayicon.cpp" line="129"/>
<source>Synchronization is ongoing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/trayicon.cpp" line="138"/>
<location filename="../gui/trayicon.cpp" line="139"/>
<source>Synchronization complete</source>
<translation type="unfinished"></translation>
</message>
@ -858,7 +858,7 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="107"/>
<location filename="../gui/traywidget.cpp" line="235"/>
<location filename="../gui/traywidget.cpp" line="264"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
@ -896,7 +896,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<message>
<location filename="../gui/traywidget.ui" line="230"/>
<location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.cpp" line="371"/>
<location filename="../gui/traywidget.cpp" line="400"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@ -922,7 +922,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="80"/>
<location filename="../gui/traywidget.cpp" line="145"/>
<location filename="../gui/traywidget.cpp" line="159"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
@ -937,88 +937,88 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="72"/>
<location filename="../gui/traywidget.cpp" line="78"/>
<source>View own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="87"/>
<location filename="../gui/traywidget.cpp" line="93"/>
<source>Rescan all directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="82"/>
<location filename="../gui/traywidget.cpp" line="88"/>
<source>Show Syncthing log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="77"/>
<location filename="../gui/traywidget.cpp" line="83"/>
<source>Restart Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="94"/>
<location filename="../gui/traywidget.cpp" line="100"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="185"/>
<location filename="../gui/traywidget.cpp" line="199"/>
<source>device ID is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="193"/>
<location filename="../gui/traywidget.cpp" line="207"/>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="248"/>
<location filename="../gui/traywidget.cpp" line="277"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="254"/>
<location filename="../gui/traywidget.cpp" line="283"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="175"/>
<location filename="../gui/traywidget.cpp" line="189"/>
<source>Own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="207"/>
<location filename="../gui/traywidget.cpp" line="221"/>
<source>Log</source>
<translation type="unfinished"></translation>
</message>
@ -1082,22 +1082,22 @@ The Web UI will be opened in the default web browser instead.</source>
<context>
<name>main</name>
<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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</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>
<translation type="unfinished"></translation>
</message>