Made translations possible for the text interface
the build failed Détails

Closes #5
Cette révision appartient à :
tastytea 2018-10-18 21:31:05 +02:00
Parent cedebb1e83
révision 2c38822243
Signé par: tastytea
ID de la clé GPG: CFC39497F1B26E07
6 fichiers modifiés avec 648 ajouts et 91 suppressions

Voir le fichier

@ -1,12 +1,13 @@
cmake_minimum_required (VERSION 3.6)
project (whyblocked
VERSION 0.9.0
VERSION 0.10.0
LANGUAGES CXX
)
include(GNUInstallDirs)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBXDG_BASEDIR REQUIRED libxdg-basedir)
find_package(Qt5Core CONFIG REQUIRED)
if(NOT WITHOUT_GUI)
find_package(Qt5Widgets CONFIG REQUIRED)
endif()
@ -37,13 +38,14 @@ configure_file (
if(Qt5_LRELEASE_EXECUTABLE)
file(GLOB TS_FILES "translations/*.ts")
file(GLOB TS_SRC_FILES "src/*")
qt5_create_translation(QM_FILES ${TS_SRC_FILES} ${TS_FILES} OPTIONS -no-obsolete)
qt5_create_translation(QM_FILES ${TS_SRC_FILES} ${TS_FILES}
OPTIONS -no-obsolete)
qt5_add_translation(QM_FILES ${TS_FILES})
endif()
add_executable(whyblocked src/interface_text.cpp src/whyblocked.cpp)
target_link_libraries(whyblocked
${LIBXDG_BASEDIR_LIBRARIES} vsqlitepp stdc++fs)
${LIBXDG_BASEDIR_LIBRARIES} vsqlitepp stdc++fs Qt5::Core)
install(TARGETS whyblocked DESTINATION ${CMAKE_INSTALL_BINDIR})
if(NOT WITHOUT_GUI)

Voir le fichier

@ -32,6 +32,7 @@ Gentoo ebuilds are available via my
* [cmake](https://cmake.org/) (at least 3.6)
* [vsqlite++](http://vsqlite.virtuosic-bytes.com/) (tested: 0.3.13)
* [libxdg-basedir](http://repo.or.cz/w/libxdg-basedir.git) (tested: 1.2)
* [qtcore](https://www.qt.io/) (tested: 5.11/5.7)
* [qtwidgets](https://www.qt.io/) (tested: 5.11/5.7)
#### Get sourcecode

Voir le fichier

@ -15,14 +15,26 @@
*/
#include <iostream>
#include <QCoreApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include "version.hpp"
#include "whyblocked.hpp"
#include "interface_text.hpp"
using std::cout;
using std::cerr;
using std::cin;
const string get_answer(const string &question)
// Allow cout to output QStrings
std::ostream &operator <<(std::ostream &stream, const QString &str)
{
stream << str.toStdString();
return stream;
}
const string Text::get_answer(const QString &question)
{
string answer;
@ -32,37 +44,37 @@ const string get_answer(const string &question)
return answer;
}
const bool askblocked()
const bool Text::askblocked()
{
while (true)
{
const string blocked = get_answer("Blocked(b) or silenced(s)");
if (blocked[0] == 'b' || blocked[0] == 'B')
const string blocked = get_answer(tr("Blocked(b) or silenced(s)"));
if (blocked[0] == tr("b")[0] || blocked[0] == tr("B"))
{
return true;
}
else if (blocked[0] == 's' || blocked[0] == 'S')
else if (blocked[0] == tr("s")[0] || blocked[0] == tr("S")[0])
{
return false;
}
}
}
const void askrecipes(const string &user)
const void Text::askrecipes(const string &user)
{
while (true)
{
const string receipt_yn = get_answer("Add receipt? [y/n]");
if (receipt_yn[0] == 'y' || receipt_yn[0] == 'Y')
const string receipt_yn = get_answer(tr("Add receipt? [y/n]"));
if (receipt_yn[0] == tr("y")[0] || receipt_yn[0] == tr("Y")[0])
{
const string receipt = get_answer("Receipt");
const string receipt = get_answer(tr("Receipt"));
if (database::add_receipt(user, receipt))
{
cout << "Receipt added.\n";
cout << tr("Receipt added.") << '\n';
}
}
else if (receipt_yn[0] == 'n' || receipt_yn[0] == 'N')
else if (receipt_yn[0] == tr("n")[0] || receipt_yn[0] == tr("N")[0])
{
break;
}
@ -73,9 +85,9 @@ const void askrecipes(const string &user)
}
}
const void add()
const void Text::add()
{
const string user = get_answer("User or instance");
const string user = get_answer(tr("User or instance"));
int blocked;
if (askblocked())
@ -86,24 +98,24 @@ const void add()
{
blocked = 0;
}
const string reason = get_answer("Reason");
const string reason = get_answer(tr("Reason"));
if (database::add_block(user, blocked, reason))
{
cout << user << " added.\n";
cout << user << " " << tr("added.") << '\n';
}
askrecipes(user);
}
const void edit()
const void Text::edit()
{
result_details olddata;
const string olduser = get_answer("User or instance");
const string olduser = get_answer(tr("User or instance"));
if (database::details(olduser, olddata))
{
cout << "A blank line keeps the former value.\n";
string newuser = get_answer("Change user or instance to");
cout << tr("A blank line keeps the former value.") << '\n';
string newuser = get_answer(tr("Change user or instance to"));
if (newuser.empty())
{
newuser = olduser;
@ -119,8 +131,8 @@ const void edit()
blocked = 0;
}
cout << "Old reason was: " << std::get<1>(olddata) << '\n';
string newreason = get_answer("Change reason to");
cout << tr("Old reason was:") << " " << std::get<1>(olddata) << '\n';
string newreason = get_answer(tr("Change reason to"));
if (newreason.empty())
{
newreason = std::get<1>(olddata);
@ -129,8 +141,8 @@ const void edit()
std::vector<string> newreceipts;
for (const string &oldreceipt : std::get<2>(olddata))
{
cout << "Old receipt was: " << oldreceipt << '\n';
string newreceipt = get_answer("Change receipt to");
cout << tr("Old receipt was:") << " " << oldreceipt << '\n';
string newreceipt = get_answer(tr("Change receipt to"));
if (newreceipt.empty())
{
newreceipt = oldreceipt;
@ -152,22 +164,22 @@ const void edit()
}
else
{
cerr << "Could not remove " << olduser << ".\n";
cerr << tr("Could not remove") << " " << olduser << ".\n";
}
}
}
const void remove()
const void Text::remove()
{
const string user = get_answer("User or instance");
const string user = get_answer(tr("User or instance"));
if (database::remove(user))
{
cout << user << " removed.\n";
cout << user << " " << tr("removed.") << '\n';
}
}
const void view()
const void Text::view()
{
result_view result;
if (database::view(result))
@ -176,39 +188,39 @@ const void view()
{
if (std::get<1>(line) == 1)
{
cout << " Blocked: ";
cout << tr(" Blocked:") << " ";
}
else
{
cout << "Silenced: ";
cout << tr("Silenced:") << " ";
}
cout << std::get<0>(line) << " because: ";
cout << std::get<0>(line) << " " << tr("because:") << " ";
cout << std::get<2>(line) << '\n';
}
}
}
const void details()
const void Text::details()
{
const string user = get_answer("User or instance");
const string user = get_answer(tr("User or instance"));
{
result_details result;
if (database::details(user, result))
{
cout << user << " is ";
cout << user << " " << tr("is") << " ";
if (std::get<0>(result) == 1)
{
cout << "blocked, because: ";
cout << tr("blocked, because:") << " ";
}
else if (std::get<0>(result) == 0)
{
cout << "silenced, because: ";
cout << tr("silenced, because:") << " ";
}
cout << std::get<1>(result) << '\n';
if (!std::get<2>(result).empty())
{
cout << "Receipts:\n";
cout << tr("Receipts:") << '\n';
for (const string &url : std::get<2>(result))
{
cout << " " << url << '\n';
@ -218,69 +230,75 @@ const void details()
}
}
const void help()
const void Text::help()
{
cout << "Type add, edit, remove, view or details. Or just the first letter.\n";
cout << "Type help or h to show this help. Type quit or q to quit the program.\n";
cout << tr(
"Type add, edit, remove, view or details. Or just the first letter.")
<< '\n';
cout << tr(
"Type help or h to show this help. Type quit or q to quit the program.")
<< '\n';
}
int main(int argc, char *argv[])
Text::Text(QObject *parent) : QObject(parent)
{
bool keeprunning = true;
cout << "This is whyblocked " << global::version << ".\n";
cout << tr("This is Whyblocked") << " " << global::version << ".\n";
help();
while (keeprunning)
{
string answer = get_answer("");
switch (answer[0])
if (answer[0] == tr("a")[0] || answer[0] == tr("A")[0])
{
case 'a':
case 'A':
{
add();
break;
}
case 'e':
case 'E':
{
edit();
break;
}
case 'r':
case 'R':
{
remove();
break;
}
case 'v':
case 'V':
{
view();
break;
}
case 'd':
case 'D':
{
details();
break;
}
case 'h':
case 'H':
{
help();
break;
}
case 'q':
case 'Q':
{
keeprunning = false;
break;
}
default:
cout << "Response not understood.\n";
add();
}
else if (answer[0] == tr("e")[0] || answer[0] == tr("E")[0])
{
edit();
}
else if (answer[0] == tr("r")[0] || answer[0] == tr("R")[0])
{
remove();
}
else if (answer[0] == tr("v")[0] || answer[0] == tr("V")[0])
{
view();
}
else if (answer[0] == tr("d")[0] || answer[0] == tr("D")[0])
{
details();
}
else if (answer[0] == tr("h")[0] || answer[0] == tr("H")[0])
{
help();
}
else if (answer[0] == tr("q")[0] || answer[0] == tr("Q")[0])
{
keeprunning = false;
}
else
{
cout << tr("Response not understood.") << '\n';
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication 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);
Text t(&app);
return 0;
}

44
src/interface_text.hpp Fichier normal
Voir le fichier

@ -0,0 +1,44 @@
/* This file is part of whyblocked.
* Copyright © 2018 tastytea <tastytea@tastytea.de>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef INTERFACE_TEXT_HPP
#define INTERFACE_TEXT_HPP
#include <string>
#include <QtCore>
using std::string;
class Text : public QObject
{
Q_OBJECT
public:
explicit Text(QObject *parent = nullptr);
private:
const string get_answer(const QString &question);
const bool askblocked();
const void askrecipes(const string &user);
const void add();
const void edit();
const void remove();
const void view();
const void details();
const void help();
};
#endif // INTERFACE_TEXT_HPP

Voir le fichier

@ -248,4 +248,250 @@
<translation>&lt;p&gt;&lt;b&gt;Whyblocked&lt;/b&gt; %1&lt;/p&gt;&lt;p&gt;Erinnert dich, warum du jemanden blockiertest.&lt;/p&gt;&lt;p&gt;Quelltext: &lt;a href=&quot;https://schlomp.space/tastytea/whyblocked&quot;&gt;https://schlomp.space/tastytea/whyblocked&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Copyright © 2018 &lt;a href=&quot;mailto:tastytea@tastytea.de&quot;&gt;tastytea&lt;/a&gt;.&lt;br&gt;Lizenz GPLv3: &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html&quot;&gt;GNU GPL version 3&lt;/a&gt;.&lt;br&gt;Für dieses Programm besteht KEINERLEI GARANTIE. Dies ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen.&lt;/small&gt;&lt;/p&gt;</translation>
</message>
</context>
<context>
<name>Text</name>
<message>
<location filename="../src/interface_text.cpp" line="51"/>
<source>Blocked(b) or silenced(s)</source>
<translation>Blockiert(b) oder Gedämpft(g)</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="52"/>
<source>b</source>
<translation>b</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="52"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="56"/>
<source>s</source>
<translation>g</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="56"/>
<source>S</source>
<translation>G</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="67"/>
<source>Add receipt? [y/n]</source>
<translation>Beleg hinzufügen? [j/n]</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="68"/>
<source>y</source>
<translation>j</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="68"/>
<source>Y</source>
<translation>J</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="70"/>
<source>Receipt</source>
<translation>Beleg</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="74"/>
<source>Receipt added.</source>
<translation>Beleg hinzugefügt.</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="77"/>
<source>n</source>
<translation>n</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="77"/>
<source>N</source>
<translation>N</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="90"/>
<location filename="../src/interface_text.cpp" line="114"/>
<location filename="../src/interface_text.cpp" line="174"/>
<location filename="../src/interface_text.cpp" line="205"/>
<source>User or instance</source>
<translation>Benutzer oder Instanz</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="101"/>
<source>Reason</source>
<translation>Begründung</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="105"/>
<source>added.</source>
<translation>hinzugefügt.</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="117"/>
<source>A blank line keeps the former value.</source>
<translation>Leere Zeile um den alten Wert zu erhalten.</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="118"/>
<source>Change user or instance to</source>
<translation>Ändere Benutzer oder Instanz zu</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="134"/>
<source>Old reason was:</source>
<translation>Alte Begründung war:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="135"/>
<source>Change reason to</source>
<translation>Ändere Begründung zu</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="144"/>
<source>Old receipt was:</source>
<translation>Alter Beleg war:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="145"/>
<source>Change receipt to</source>
<translation>Ändere beleg zu</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="167"/>
<source>Could not remove</source>
<translation>Konnte nicht entfernen:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="178"/>
<source>removed.</source>
<translation>entfernt.</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="191"/>
<source> Blocked:</source>
<translation>Blockiert:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="195"/>
<source>Silenced:</source>
<translation> Gedämpft:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="197"/>
<source>because:</source>
<translation>weil:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="210"/>
<source>is</source>
<translation>ist</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="213"/>
<source>blocked, because:</source>
<translation>blockiert, weil:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="217"/>
<source>silenced, because:</source>
<translation>gedämpft, weil:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="223"/>
<source>Receipts:</source>
<translation>Belege:</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="235"/>
<source>Type add, edit, remove, view or details. Or just the first letter.</source>
<translation>Schreibe zufügen, ändern, entfernen, anschauen oder details. Oder nur den Anfangsbuchstaben.</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="238"/>
<source>Type help or h to show this help. Type quit or q to quit the program.</source>
<translation>Schreibe hilfe oder h, um die Hilfe anzuzeigen. Schreibe beenden oder b um das Programm zu beenden.</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="247"/>
<source>This is Whyblocked</source>
<translation>Dies ist Whyblocked</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="252"/>
<source>a</source>
<translation>z</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="252"/>
<source>A</source>
<translation>Z</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="256"/>
<source>e</source>
<translation>ä</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="256"/>
<source>E</source>
<translation>Ä</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="260"/>
<source>r</source>
<translation>e</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="260"/>
<source>R</source>
<translation>E</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="264"/>
<source>v</source>
<translation>a</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="264"/>
<source>V</source>
<translation>A</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="268"/>
<source>d</source>
<translation>d</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="268"/>
<source>D</source>
<translation>D</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="272"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="272"/>
<source>H</source>
<translation>H</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="276"/>
<source>q</source>
<translation>b</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="276"/>
<source>Q</source>
<translation>B</translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="282"/>
<source>Response not understood.</source>
<translation>Antwort nicht verstanden.</translation>
</message>
</context>
</TS>

Voir le fichier

@ -248,4 +248,250 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Text</name>
<message>
<location filename="../src/interface_text.cpp" line="51"/>
<source>Blocked(b) or silenced(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="52"/>
<source>b</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="52"/>
<source>B</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="56"/>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="56"/>
<source>S</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="67"/>
<source>Add receipt? [y/n]</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="68"/>
<source>y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="68"/>
<source>Y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="70"/>
<source>Receipt</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="74"/>
<source>Receipt added.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="77"/>
<source>n</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="77"/>
<source>N</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="90"/>
<location filename="../src/interface_text.cpp" line="114"/>
<location filename="../src/interface_text.cpp" line="174"/>
<location filename="../src/interface_text.cpp" line="205"/>
<source>User or instance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="101"/>
<source>Reason</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="105"/>
<source>added.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="117"/>
<source>A blank line keeps the former value.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="118"/>
<source>Change user or instance to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="134"/>
<source>Old reason was:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="135"/>
<source>Change reason to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="144"/>
<source>Old receipt was:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="145"/>
<source>Change receipt to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="167"/>
<source>Could not remove</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="178"/>
<source>removed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="191"/>
<source> Blocked:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="195"/>
<source>Silenced:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="197"/>
<source>because:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="210"/>
<source>is</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="213"/>
<source>blocked, because:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="217"/>
<source>silenced, because:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="223"/>
<source>Receipts:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="235"/>
<source>Type add, edit, remove, view or details. Or just the first letter.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="238"/>
<source>Type help or h to show this help. Type quit or q to quit the program.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="247"/>
<source>This is Whyblocked</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="252"/>
<source>a</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="252"/>
<source>A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="256"/>
<source>e</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="256"/>
<source>E</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="260"/>
<source>r</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="260"/>
<source>R</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="264"/>
<source>v</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="264"/>
<source>V</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="268"/>
<source>d</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="268"/>
<source>D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="272"/>
<source>h</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="272"/>
<source>H</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="276"/>
<source>q</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="276"/>
<source>Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/interface_text.cpp" line="282"/>
<source>Response not understood.</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>