From daefd245f01db61d6a2e8692761ce415dfa44fa7 Mon Sep 17 00:00:00 2001 From: tastytea Date: Mon, 14 Jan 2019 15:45:05 +0100 Subject: [PATCH] Refactored the QT interface. (#12) --- CMakeLists.txt | 8 +- src/qt/dialog_add.cpp | 112 ++++++ src/qt/dialog_add.hpp | 46 +++ src/qt/main.cpp | 39 ++ src/{interface_qt.cpp => qt/mainwindow.cpp} | 302 +++++---------- src/{interface_qt.hpp => qt/mainwindow.hpp} | 34 +- src/{ => qt}/whyblocked.ui | 0 src/{ => qt}/whyblocked_add.ui | 0 translations/whyblocked_de.ts | 390 ++++++++++---------- translations/whyblocked_en.ts | 116 +++--- 10 files changed, 552 insertions(+), 495 deletions(-) create mode 100644 src/qt/dialog_add.cpp create mode 100644 src/qt/dialog_add.hpp create mode 100644 src/qt/main.cpp rename src/{interface_qt.cpp => qt/mainwindow.cpp} (79%) rename src/{interface_qt.hpp => qt/mainwindow.hpp} (73%) rename src/{ => qt}/whyblocked.ui (100%) rename src/{ => qt}/whyblocked_add.ui (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b47f7fb..b44f9fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required (VERSION 3.2) project (whyblocked - VERSION 0.14.0 + VERSION 0.14.1 LANGUAGES CXX ) @@ -41,11 +41,9 @@ configure_file ( "${PROJECT_BINARY_DIR}/version.hpp" ) -set(COMMON_LIBRARIES - ) - add_executable(whyblocked-gui - src/interface_qt.cpp src/whyblocked.cpp src/xdgcfg.cpp) + src/qt/main.cpp src/qt/mainwindow.cpp src/qt/dialog_add.cpp + src/whyblocked.cpp src/xdgcfg.cpp) target_link_libraries(whyblocked-gui ${LIBXDG_BASEDIR_LIBRARIES} vsqlitepp Qt5::Widgets ${LIBCONFIG_LIBRARIES} stdc++fs) diff --git a/src/qt/dialog_add.cpp b/src/qt/dialog_add.cpp new file mode 100644 index 0000000..106a067 --- /dev/null +++ b/src/qt/dialog_add.cpp @@ -0,0 +1,112 @@ +/* This file is part of whyblocked. + * Copyright © 2019 tastytea + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include "dialog_add.hpp" + +DialogAdd::DialogAdd(Database &database, QMainWindow *parent) +: QDialog(parent) +, _parent(static_cast(parent)) +, _database(database) +{ + setupUi(this); +} + + +void DialogAdd::set_data(const Database::data &data) +{ + text_user->setText(QString::fromStdString(data.user)); + radio_blocked->setChecked(data.blocked); + radio_silcenced->setChecked(!data.blocked); + text_reason->setText(QString::fromStdString(data.reason)); + for (const string &receipt : data.receipts) + { + QListWidgetItem *item = + new QListWidgetItem(QString::fromStdString(receipt)); + item->setFlags(item->flags() | Qt::ItemIsEditable); + list_receipts->insertItem(list_receipts->count(), item); + } +} + +const Database::data DialogAdd::get_data() const +{ + std::vector receipts; + for (int row = 0; row <= list_receipts->count() - 1; ++row) + { + receipts.push_back(list_receipts->item(row)->text().toStdString()); + } + + Database::data data; + data.user = text_user->text().toStdString(); + data.blocked = radio_blocked->isChecked(); + data.reason = text_reason->text().toStdString(); + data.receipts = receipts; + + return data; +} + +void DialogAdd::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasFormat("text/plain")) + { + event->acceptProposedAction(); + } +} + +void DialogAdd::dropEvent(QDropEvent *event) +{ + const QString text = event->mimeData()->text(); + QListWidgetItem *item = new QListWidgetItem(text); + item->setFlags(item->flags() | Qt::ItemIsEditable); + list_receipts->insertItem(list_receipts->count(), item); +} + +void DialogAdd::add_receipt() +{ + QListWidgetItem *item = new QListWidgetItem(tr("Insert receipt here.")); + item->setFlags(item->flags() | Qt::ItemIsEditable); + list_receipts->insertItem(list_receipts->count(), item); + list_receipts->editItem(item); +} + +void DialogAdd::remove_receipt() +{ + for (auto item :list_receipts->selectedItems()) + { + delete item; + } +} + +void DialogAdd::accept() +{ + if (property("edit").toBool()) + { + _parent->remove(); + } + Database::data data = get_data(); + + if (!data) + { + return; + } + + _database.add_user(data); + _parent->add_row(QString::fromStdString(data.user), + data.blocked, + QString::fromStdString(data.reason)); + + delete this; +} diff --git a/src/qt/dialog_add.hpp b/src/qt/dialog_add.hpp new file mode 100644 index 0000000..3d6680c --- /dev/null +++ b/src/qt/dialog_add.hpp @@ -0,0 +1,46 @@ +/* This file is part of whyblocked. + * Copyright © 2019 tastytea + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef DIALOG_ADD_HPP +#define DIALOG_ADD_HPP + +#include "mainwindow.hpp" +#include "ui_whyblocked_add.h" + +class DialogAdd : public QDialog, private Ui::DialogAdd +{ + Q_OBJECT + +public: + explicit DialogAdd(Database &database, QMainWindow *parent = nullptr); + void set_data(const Database::data &data); + +private: + const Database::data get_data() const; + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + + MainWindow *_parent; + Database &_database; + +private slots: + void add_receipt(); + void remove_receipt(); + void accept(); + +}; + +#endif // DIALOG_ADD_HPP diff --git a/src/qt/main.cpp b/src/qt/main.cpp new file mode 100644 index 0000000..969c197 --- /dev/null +++ b/src/qt/main.cpp @@ -0,0 +1,39 @@ +/* This file is part of whyblocked. + * Copyright © 2019 tastytea + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include "mainwindow.hpp" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + QCoreApplication::setApplicationName("Whyblocked"); + + QTranslator qtTranslator; + qtTranslator.load("qt_" + QLocale::system().name(), + QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + app.installTranslator(&qtTranslator); + QTranslator appTranslator; + appTranslator.load("whyblocked_" + QLocale::system().name(), + QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + app.installTranslator(&appTranslator); + + MainWindow win; + win.show(); + + return app.exec(); +} diff --git a/src/interface_qt.cpp b/src/qt/mainwindow.cpp similarity index 79% rename from src/interface_qt.cpp rename to src/qt/mainwindow.cpp index 92c8ef3..c6b924c 100644 --- a/src/interface_qt.cpp +++ b/src/qt/mainwindow.cpp @@ -20,12 +20,11 @@ #include #include #include -#include -#include #include #include #include "version.hpp" -#include "interface_qt.hpp" +#include "mainwindow.hpp" +#include "dialog_add.hpp" using std::wstring; @@ -177,33 +176,6 @@ MainWindow::~MainWindow() _config.write(); } -void MainWindow::populate_tableview(const vector &entries) -{ - _model->clear(); - _model->setHorizontalHeaderLabels( - { - tr("User/Instance"), - tr("Blocked/Silenced"), - tr("Reason") - }); - tableview->horizontalHeader()->resizeSection(0, _headersize[0]); - tableview->horizontalHeader()->resizeSection(1, _headersize[1]); - tableview->horizontalHeader()->resizeSection(2, _headersize[2]); - - for (const Database::data &entry : entries) - { - add_row(QString::fromStdString(entry.user), - entry.blocked, - QString::fromStdString(entry.reason)); - } -} - -void MainWindow::reload() -{ - _database.reload(); - populate_tableview(_dbdata); -} - void MainWindow::add_row(const QString &user, const int &blocked, const QString &reason) { @@ -221,33 +193,6 @@ void MainWindow::add_row(const QString &user, const int &blocked, _model->appendRow(items); } -void MainWindow::add() -{ - DialogAdd *dialog = new DialogAdd(_database, this); - dialog->show(); -} - -void MainWindow::edit() -{ - if (tableview->selectionModel()->selectedRows().count() != 1) - { - QMessageBox::warning(this, tr("Invalid selection"), - tr("Please select only 1 entry to edit.")); - return; - } - - DialogAdd *dialog = new DialogAdd(_database, this); - dialog->setWindowTitle(tr("Edit entry")); - - QModelIndex index = tableview->selectionModel()->selectedRows().first(); - const string user = index.sibling(index.row(), 0).data() - .toString().toStdString(); - - dialog->set_data(_database.get_user(user)); - dialog->setProperty("edit", true); - dialog->show(); -} - void MainWindow::remove() { QItemSelectionModel *selection = tableview->selectionModel(); @@ -268,17 +213,49 @@ void MainWindow::remove() } } -void MainWindow::find() +const string MainWindow::urls_to_hyperlinks(const string &text) { - if (widget_find->isVisible()) + std::regex re_url("((https?|gopher|ftps?)\\://[^ <]*)"); + return std::regex_replace(text, re_url, "$1"); +} + +void MainWindow::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasFormat("text/plain")) { - widget_find->hide(); + event->acceptProposedAction(); } - else +} + +void MainWindow::dropEvent(QDropEvent *event) +{ + string text = event->mimeData()->text().toStdString(); + const std::array fediverse = { - widget_find->show(); - text_find->setFocus(); + std::regex("https://([^/]+)/@([^/]+)"), // Mastodon + std::regex("https://([^/]+)/profile/([^/]+)"), // Friendica + std::regex("https://([^/]+)/users/([^/]+)"), // Pleroma + std::regex("https://([^/]+)/([^/]+)") // Gnusocial + }; + std::smatch match; + + for (const std::regex &re : fediverse) + { + std::regex_match(text, match, re); + const string instance = match[1]; + const string user = match[2]; + if (!instance.empty() && !user.empty()) + { + text = '@' + user + '@' + instance; + break; + } } + + DialogAdd *dialog = new DialogAdd(_database, this); + Database::data data; + data.user = text; + dialog->set_data(data); + dialog->show(); } bool MainWindow::eventFilter(QObject *obj, QEvent *event) @@ -337,6 +314,33 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) return QObject::eventFilter(obj, event); } +void MainWindow::add() +{ + DialogAdd *dialog = new DialogAdd(_database, this); + dialog->show(); +} + +void MainWindow::edit() +{ + if (tableview->selectionModel()->selectedRows().count() != 1) + { + QMessageBox::warning(this, tr("Invalid selection"), + tr("Please select only 1 entry to edit.")); + return; + } + + DialogAdd *dialog = new DialogAdd(_database, this); + dialog->setWindowTitle(tr("Edit entry")); + + QModelIndex index = tableview->selectionModel()->selectedRows().first(); + const string user = index.sibling(index.row(), 0).data() + .toString().toStdString(); + + dialog->set_data(_database.get_user(user)); + dialog->setProperty("edit", true); + dialog->show(); +} + void MainWindow::about() { QMessageBox::about(this, tr("About Whyblocked"), @@ -371,160 +375,42 @@ void MainWindow::show_details(QModelIndex index) label_receipts->setText(QString::fromStdString((text))); } -const string MainWindow::urls_to_hyperlinks(const string &text) +void MainWindow::populate_tableview(const vector &entries) { - std::regex re_url("((https?|gopher|ftps?)\\://[^ <]*)"); - return std::regex_replace(text, re_url, "$1"); -} - -void MainWindow::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasFormat("text/plain")) + _model->clear(); + _model->setHorizontalHeaderLabels( { - event->acceptProposedAction(); + tr("User/Instance"), + tr("Blocked/Silenced"), + tr("Reason") + }); + tableview->horizontalHeader()->resizeSection(0, _headersize[0]); + tableview->horizontalHeader()->resizeSection(1, _headersize[1]); + tableview->horizontalHeader()->resizeSection(2, _headersize[2]); + + for (const Database::data &entry : entries) + { + add_row(QString::fromStdString(entry.user), + entry.blocked, + QString::fromStdString(entry.reason)); } } -void MainWindow::dropEvent(QDropEvent *event) +void MainWindow::reload() { - string text = event->mimeData()->text().toStdString(); - const std::array fediverse = - { - std::regex("https://([^/]+)/@([^/]+)"), // Mastodon - std::regex("https://([^/]+)/profile/([^/]+)"), // Friendica - std::regex("https://([^/]+)/users/([^/]+)"), // Pleroma - std::regex("https://([^/]+)/([^/]+)") // Gnusocial - }; - std::smatch match; + _database.reload(); + populate_tableview(_dbdata); +} - for (const std::regex &re : fediverse) +void MainWindow::find() +{ + if (widget_find->isVisible()) { - std::regex_match(text, match, re); - const string instance = match[1]; - const string user = match[2]; - if (!instance.empty() && !user.empty()) - { - text = '@' + user + '@' + instance; - break; - } + widget_find->hide(); } - - DialogAdd *dialog = new DialogAdd(_database, this); - Database::data data; - data.user = text; - dialog->set_data(data); - dialog->show(); -} - -DialogAdd::DialogAdd(Database &database, QMainWindow *parent) -: QDialog(parent) -, _parent(static_cast(parent)) -, _database(database) -{ - setupUi(this); -} - -const Database::data DialogAdd::get_data() const -{ - std::vector receipts; - for (int row = 0; row <= list_receipts->count() - 1; ++row) + else { - receipts.push_back(list_receipts->item(row)->text().toStdString()); - } - - Database::data data; - data.user = text_user->text().toStdString(); - data.blocked = radio_blocked->isChecked(); - data.reason = text_reason->text().toStdString(); - data.receipts = receipts; - - return data; -} - -void DialogAdd::set_data(const Database::data &data) -{ - text_user->setText(QString::fromStdString(data.user)); - radio_blocked->setChecked(data.blocked); - radio_silcenced->setChecked(!data.blocked); - text_reason->setText(QString::fromStdString(data.reason)); - for (const string &receipt : data.receipts) - { - QListWidgetItem *item = - new QListWidgetItem(QString::fromStdString(receipt)); - item->setFlags(item->flags() | Qt::ItemIsEditable); - list_receipts->insertItem(list_receipts->count(), item); + widget_find->show(); + text_find->setFocus(); } } - -void DialogAdd::add_receipt() -{ - QListWidgetItem *item = new QListWidgetItem(tr("Insert receipt here.")); - item->setFlags(item->flags() | Qt::ItemIsEditable); - list_receipts->insertItem(list_receipts->count(), item); - list_receipts->editItem(item); -} - -void DialogAdd::remove_receipt() -{ - for (auto item :list_receipts->selectedItems()) - { - delete item; - } -} - -void DialogAdd::accept() -{ - if (property("edit").toBool()) - { - _parent->remove(); - } - Database::data data = get_data(); - - if (!data) - { - return; - } - - _database.add_user(data); - _parent->add_row(QString::fromStdString(data.user), - data.blocked, - QString::fromStdString(data.reason)); - - delete this; -} - -void DialogAdd::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasFormat("text/plain")) - { - event->acceptProposedAction(); - } -} - -void DialogAdd::dropEvent(QDropEvent *event) -{ - const QString text = event->mimeData()->text(); - QListWidgetItem *item = new QListWidgetItem(text); - item->setFlags(item->flags() | Qt::ItemIsEditable); - list_receipts->insertItem(list_receipts->count(), item); -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - QCoreApplication::setApplicationName("Whyblocked"); - - QTranslator qtTranslator; - qtTranslator.load("qt_" + QLocale::system().name(), - QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - app.installTranslator(&qtTranslator); - QTranslator appTranslator; - appTranslator.load("whyblocked_" + QLocale::system().name(), - QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - app.installTranslator(&appTranslator); - - MainWindow win; - win.show(); - - return app.exec(); -} diff --git a/src/interface_qt.hpp b/src/qt/mainwindow.hpp similarity index 73% rename from src/interface_qt.hpp rename to src/qt/mainwindow.hpp index 40a2b51..2ff375b 100644 --- a/src/interface_qt.hpp +++ b/src/qt/mainwindow.hpp @@ -14,8 +14,8 @@ * along with this program. If not, see . */ -#ifndef INTERFACE_QT_HPP -#define INTERFACE_QT_HPP +#ifndef MAINWINDOW_HPP +#define MAINWINDOW_HPP #include #include @@ -25,10 +25,9 @@ #include #include #include -#include "xdgcfg.hpp" -#include "whyblocked.hpp" +#include "../xdgcfg.hpp" +#include "../whyblocked.hpp" #include "ui_whyblocked.h" -#include "ui_whyblocked_add.h" using std::string; using std::vector; @@ -69,27 +68,4 @@ private slots: }; -class DialogAdd : public QDialog, private Ui::DialogAdd -{ - Q_OBJECT - -public: - explicit DialogAdd(Database &database, QMainWindow *parent = nullptr); - void set_data(const Database::data &data); - -private: - const Database::data get_data() const; - void dragEnterEvent(QDragEnterEvent *event); - void dropEvent(QDropEvent *event); - - MainWindow *_parent; - Database &_database; - -private slots: - void add_receipt(); - void remove_receipt(); - void accept(); - -}; - -#endif // INTERFACE_QT_HPP +#endif // MAINWINDOW_HPP diff --git a/src/whyblocked.ui b/src/qt/whyblocked.ui similarity index 100% rename from src/whyblocked.ui rename to src/qt/whyblocked.ui diff --git a/src/whyblocked_add.ui b/src/qt/whyblocked_add.ui similarity index 100% rename from src/whyblocked_add.ui rename to src/qt/whyblocked_add.ui diff --git a/translations/whyblocked_de.ts b/translations/whyblocked_de.ts index a4cf431..1f4fc09 100644 --- a/translations/whyblocked_de.ts +++ b/translations/whyblocked_de.ts @@ -4,285 +4,285 @@ DialogAdd - + Add entry - Eintrag hinzufügen + - + Memory aids, proof - Gedächtnisstützen, Beweise + - + Rece&ipts - Be&lege + - + Add receipt - Beleg hinzufügen + - + &Add - &Hinzufügen + - + &Blocked - &Blockiert + - + &Silenced - &Gedämpft + - + R&eason - B&egründung + - + Blocked/Silenced - Blockiert/Gedämpft + - + &User/Instance - Ben&utzer/Instanz + - + Remove receipt - Beleg entfernen + - + Re&move - Ent&fernen + - + Del - + - + You can drag URLs in here - Du kannst URLs hier hineinziehen + - + Insert receipt here. - Beleg hier einfügen. + MainWindow - + Whyblocked - + - + Search for Users/Instances - Suche nach Benutzern/Instanzen + - - Search for Reasons - Suche nach Begründungen - - - - Click or press enter to view receipts - Klicken oder Eingabe drücken, um Belege zu anzuzeigen - - - - Memory aids, proof - Gedächtnisstützen, Beweise - - - - Toolbar - Werkzeugleiste - - - - &Database - &Datenbank - - - - &Help - &Hilfe - - - - &Add - &Hinzufügen - - - - Add user or instance - Benutzer oder Instanz hinzufügen - - - - Ctrl+N - - - - - Re&move - Ent&fernen - - - - Remove user or instance - Benutzer oder Instanz entfernen - - - - Del - - - - - &About - &Über - - - - About this application - Über dieses Programm - - - - &Reload - Neu &laden - - - - Reload database - Datenbank neu laden - - - - Ctrl+R - - - - - &Quit - &Beenden - - - - Quit application - Programm beenden - - - - Ctrl+Q - - - - - &Edit - B&earbeiten - - - - - Edit entry - Eintrag bearbeiten - - - - &Find - &Finden - - - - Find entries - Finde Einträge - - - - Ctrl+F - - - - - + + User/Instance - Benutzer/Instanz + - - Blocked/Silenced - Blockiert/Gedämpft + + Search for Reasons + - - + + Reason - Begründung + - + + Click or press enter to view receipts + + + + + Memory aids, proof + + + + + Toolbar + + + + + &Database + + + + + &Help + + + + + &Add + + + + + Add user or instance + + + + + Ctrl+N + + + + + Re&move + + + + + Remove user or instance + + + + + Del + + + + + &About + + + + + About this application + + + + + &Reload + + + + + Reload database + + + + + Ctrl+R + + + + + &Quit + + + + + Quit application + + + + + Ctrl+Q + + + + + &Edit + + + + + + Edit entry + + + + + &Find + + + + + Find entries + + + + + Ctrl+F + + + + Try dragging an account from your webbrowser into this window. - Versuche, einen Account von deinem Webbrowser in dieses Fenster zu ziehen. + - + blocked - blockiert + - + silenced - gedämpft + - - Invalid selection - Ungültige Auswahl - - - - Please select only 1 entry to edit. - Bitte nur 1 Eintrag zum bearbeiten auswählen. - - - + Nothing selected - Nichts ausgewählt + - + Please select entries to remove. - Bitte wähle Einträge aus, die gelöscht werden sollen. + - + + Invalid selection + + + + + Please select only 1 entry to edit. + + + + About Whyblocked - Über Whyblocked + - + <p><b>Whyblocked</b> %1</p><p>Reminds you why you blocked someone.</p><p>Sourcecode: <a href="https://schlomp.space/tastytea/whyblocked">https://schlomp.space/tastytea/whyblocked</a></p><p><small>Copyright © 2018 <a href="mailto:tastytea@tastytea.de">tastytea</a>.<br>Licence GPLv3: <a href="https://www.gnu.org/licenses/gpl-3.0.html">GNU GPL version 3</a>.<br>This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions.</small></p> - <p><b>Whyblocked</b> %1</p><p>Erinnert dich, warum du jemanden blockiertest.</p><p>Quelltext: <a href="https://schlomp.space/tastytea/whyblocked">https://schlomp.space/tastytea/whyblocked</a></p><p><small>Copyright © 2018 <a href="mailto:tastytea@tastytea.de">tastytea</a>.<br>Lizenz GPLv3: <a href="https://www.gnu.org/licenses/gpl-3.0.html">GNU GPL version 3</a>.<br>Für dieses Programm besteht KEINERLEI GARANTIE. Dies ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen.</small></p> + - + Receipts: - Belege: + + + + + Blocked/Silenced + diff --git a/translations/whyblocked_en.ts b/translations/whyblocked_en.ts index c260eda..970fe8b 100644 --- a/translations/whyblocked_en.ts +++ b/translations/whyblocked_en.ts @@ -4,77 +4,77 @@ DialogAdd - + Add entry - + Memory aids, proof - + Rece&ipts - + Add receipt - + &Add - + &Blocked - + &Silenced - + R&eason - + Blocked/Silenced - + &User/Instance - + Remove receipt - + Re&move - + Del - + You can drag URLs in here - + Insert receipt here. @@ -82,205 +82,205 @@ MainWindow - + Whyblocked - + Search for Users/Instances - + Search for Reasons - + Click or press enter to view receipts - + Memory aids, proof - + Toolbar - + &Database - + &Help - + &Add - + Add user or instance - + Ctrl+N - + Re&move - + Remove user or instance - + Del - + &About - + About this application - + &Reload - + Reload database - + Ctrl+R - + &Quit - + Quit application - + Ctrl+Q - + &Edit - - + + Edit entry - + &Find - + Find entries - + Ctrl+F - - + + User/Instance - + Blocked/Silenced - - + + Reason - + Try dragging an account from your webbrowser into this window. - + blocked - + silenced - + Invalid selection - + Please select only 1 entry to edit. - + Nothing selected - + Please select entries to remove. - + About Whyblocked - + <p><b>Whyblocked</b> %1</p><p>Reminds you why you blocked someone.</p><p>Sourcecode: <a href="https://schlomp.space/tastytea/whyblocked">https://schlomp.space/tastytea/whyblocked</a></p><p><small>Copyright © 2018 <a href="mailto:tastytea@tastytea.de">tastytea</a>.<br>Licence GPLv3: <a href="https://www.gnu.org/licenses/gpl-3.0.html">GNU GPL version 3</a>.<br>This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions.</small></p> - + Receipts: