Commit 48e7b041 authored by Jyrki's avatar Jyrki :feet:
Browse files

First _real_ commit.

parent a98d7514
Showing with 1082 additions and 0 deletions
+1082 -0
project(justask-qt-client)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
find_package(Qt4 REQUIRED)
find_package(QJSON REQUIRED)
set(lang translations/de.ts)
include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR} ${QJSON_INCLUDE_DIR})
set(sources mainwindow.cpp settingsdialog.cpp main.cpp)
set(headers mainwindow.h settingsdialog.h)
set(forms mainwindow.ui settingsdialog.ui)
qt4_wrap_cpp(headers_moc ${headers})
qt4_wrap_ui(forms_headers ${forms})
qt4_add_translation(translations ${lang})
add_executable(justask-qt-client ${sources} ${headers_moc} ${forms_headers} ${translations})
target_link_libraries(justask-qt-client ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTNETWORK_LIBRARIES} ${QJSON_LIBRARIES})
install(TARGETS justask-qt-client RUNTIME DESTINATION bin)
# Find QJSON - JSON handling library for Qt
#
# This module defines
# QJSON_FOUND - whether the qsjon library was found
# QJSON_LIBRARIES - the qjson library
# QJSON_INCLUDE_DIR - the include path of the qjson library
#
if (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)
# in cache already
set(QJSON_FIND_QUIETLY TRUE)
endif (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)
if (NOT WIN32)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig)
pkg_check_modules(PC_QJSON QJson)
set(QJSON_DEFINITIONS ${PC_QJSON_CFLAGS_OTHER})
endif (NOT WIN32)
find_path(QJSON_INCLUDE_DIR parser.h
HINTS
${PC_QJSON_INCLUDEDIR}
${PC_QJSON_INCLUDE_DIRS}
${INCLUDE_INSTALL_DIR}
${KDE4_INCLUDE_DIR}
PATH_SUFFIXES qjson
)
find_library(QJSON_LIBRARIES NAMES qjson
HINTS
${PC_QJSON_LIBDIR}
${PC_QJSON_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${KDE4_LIB_DIR}
)
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set QJSON_FOUND to TRUE if
# all listed variables are TRUE
find_package_handle_standard_args(QJSON DEFAULT_MSG QJSON_LIBRARIES QJSON_INCLUDE_DIR)
mark_as_advanced(QJSON_INCLUDE_DIR QJSON_LIBRARIES)
[Project]
Name=justask-qt-client
Manager=KDevCMakeManager
VersionControl=
main.cpp 0 → 100644
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow foo;
foo.show();
return app.exec();
}
// kate: indent-mode cstyle; indent-width 4; replace-tabs on;
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "settingsdialog.h"
QSettings s("nilsding", "justask-qt");
QString user_name = "";
QString api_key = "";
QString api_endpoint = "";
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
nam = new QNetworkAccessManager();
s.beginGroup("general");
user_name = s.value("user_name", "").toString();
api_key = s.value("api_key", "").toString();
api_endpoint = s.value("installation_url", "http://").toString().append("/api.php?user_name=").append(user_name).append("&api_key=").append(api_key);
s.endGroup();
if (!(QString("").compare(user_name)) || !(QString("").compare(api_key))) {
SettingsDialog sd;
sd.exec();
}
// all available actions
knownActions << "info" << "get_inbox" << "get_answers";
connect(nam, SIGNAL(finished(QNetworkReply *)), this, SLOT(finished(QNetworkReply *)));
readSettings(true);
}
void MainWindow::writeSettings()
{
qDebug() << "[i] saving settings";
s.beginGroup("MainWindow");
s.setValue("size", size());
s.setValue("pos", pos());
s.endGroup();
}
void MainWindow::readSettings(bool window)
{
qDebug() << "[i] loading settings";
if (window) {
s.beginGroup("MainWindow");
this->resize(s.value("size", QSize(410, 211)).toSize());
this->move(s.value("pos", QPoint(200, 200)).toPoint());
this->repaint();
s.endGroup();
}
s.beginGroup("general");
user_name = s.value("user_name", "").toString();
api_key = s.value("api_key", "").toString();
api_endpoint = s.value("installation_url", "http://").toString().append("/api.php?user_name=").append(user_name).append("&api_key=").append(api_key);
s.endGroup();
doHttpRequest(QUrl(api_endpoint.append("&action=info")));
}
MainWindow::~MainWindow()
{
writeSettings();
delete nam;
delete ui;
}
void MainWindow::finished(QNetworkReply *reply)
{
if (reply->error() == QNetworkReply::NoError) {
QByteArray ba = reply->readAll();
qDebug() << "[i] request successful!";
qDebug() << "[i] ==> data:" << ba;
QVariantMap res = parser.parse(ba).toMap();
switch (res["code"].toInt()) {
case 200: { // success
switch (knownActions.indexOf(res["action"].toString())) {
case 0: { // info
// QMessageBox mb;
// mb.setWindowTitle(tr("Success"));
// mb.setIcon(QMessageBox::Information);
// mb.setText(tr("Hi, %1! You have already answered %2 questions.<br />"
// "There are %3 questions in your inbox waiting to be answered.<br /><br />Sending tweets is <strong>%4</strong> by default.")
// .arg(res["data"].toMap()["user_name"].toString()).arg(res["data"].toMap()["answer_count"].toInt()).arg(res["data"].toMap()["question_count"].toInt()).arg((res["data"].toMap()["twitter_check"].toBool()) ? tr("enabled") : tr("disabled")));
// mb.setParent(this);
// mb.exec();
ui->label_info_site_name->setText(res["data"].toMap()["site_name"].toString());
ui->label_user_name->setText(res["data"].toMap()["user_name"].toString());
ui->label_question_count->setText(res["data"].toMap()["question_count"].toString());
ui->label_answer_count->setText(res["data"].toMap()["answer_count"].toString());
ui->label_gravatar->setText(res["data"].toMap()["gravatar"].toBool() ? tr("Yes") : tr("No"));
ui->label_twitter_on->setText(res["data"].toMap()["twitter_on"].toBool() ? tr("Yes") : tr("No"));
ui->label_anon_questions->setText(res["data"].toMap()["anon_questions"].toBool() ? tr("Yes") : tr("No"));
break;
}
case 1: { // get_inbox
break;
}
case 2: { // get_answers
break;
}
default: { // ???
}
}
break;
}
case 405: {
QMessageBox mb;
mb.setWindowTitle("Error");
//ugh
break;
}
}
if (res["success"].toBool() == true && res["code"].toInt() == 200) {
QString s = QString("(").append(res["data"].toMap()["question_count"].toString()).append(") justask-qt-client");//.append(res["data"].toMap()["site_name"].toString());
this->setWindowTitle(s);
}
} else {
qDebug() << "[e] got an error while doing the network request:" << reply->errorString();
QMessageBox mb;
mb.setWindowTitle(tr("Error"));
mb.setIcon(QMessageBox::Critical);
switch (reply->error()) {
case QNetworkReply::NoError: {
mb.setText(tr("No error occurred.<br />Congratulations, you found aBug&trade;"));
break;
}
case QNetworkReply::ConnectionRefusedError: {
mb.setText(tr("Connection refused"));
break;
}
case QNetworkReply::RemoteHostClosedError: {
mb.setText(tr("The remote host closed the connection."));
break;
}
case QNetworkReply::HostNotFoundError: {
mb.setText(tr("Host not found."));
break;
}
case QNetworkReply::TimeoutError: {
mb.setText(tr("The connection timed out."));
break;
}
case QNetworkReply::SslHandshakeFailedError: {
mb.setText(tr("The SSL/TLS handshake failed."));
break;
}
case QNetworkReply::TemporaryNetworkFailureError: {
mb.setText(tr("The connection was broken due to disconnection from the network, however the system has initiated roaming to another access point."));
break;
}
case QNetworkReply::ContentAccessDenied: {
mb.setText(tr("HTTP 401: Access denied."));
break;
}
case QNetworkReply::ContentNotFoundError: {
mb.setText(tr("HTTP 404: File not found."));
break;
}
case QNetworkReply::UnknownNetworkError: {
mb.setText(tr("Network error."));
break;
}
default: {
mb.setText(tr("Unknown error."));
}
}
mb.setParent(this);
mb.exec();
}
}
/**
* Do a HTTP GET or POST request
* @param url The URL
* @param post If set to true, the HTTP request will be a POST request.
* @param postData The data to send with the POST request.
* @return The response
*/
void MainWindow::doHttpRequest(QUrl url, bool post, QString postData)
{
QByteArray ba;
ba.append(postData.toAscii());
qDebug() << "[i] initiating HTTP" << (post ? "POST" : "GET") << "request";
qDebug() << "[i] ==> URL:" << url;
if (post) {
qDebug() << "[i] ==> POST data:" << postData;
nam->post(QNetworkRequest(url), ba);
} else {
nam->get(QNetworkRequest(url));
}
}
void MainWindow::on_button_update_clicked()
{
doHttpRequest(QUrl(api_endpoint.append("&action=info")));
}
void MainWindow::on_action_Settings_triggered()
{
SettingsDialog sd(this);
sd.exec();
}
void MainWindow::on_action_AboutQt_triggered()
{
QMessageBox::aboutQt(this, tr("About %1").arg("Qt"));
}
void MainWindow::on_action_About_triggered()
{
QMessageBox::about(this, tr("About %1").arg("justask-qt-client"), "<strong>justask-qt-client</strong> - a Qt client for justask installations<br />"
"&copy; 2013 nilsding<br /><br />"
"justask-qt-client is free software: you can redistribute it and/or modify<br />"
"it under the terms of the GNU General Public License as published by<br />"
"the Free Software Foundation, either version 3 of the License, or<br />"
"(at your option) any later version.<br />"
"<a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">Read the full license text here</a><br /><br />"
"<a href=\"https://github.com/nilsding/justask-qt-client\">Get the source code at GitHub</a>");
}
// kate: indent-mode cstyle; indent-width 4; replace-tabs on;
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QSettings>
#include <QByteArray>
#include <QMessageBox>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <qjson/parser.h>
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void writeSettings();
void readSettings(bool window = false);
private slots:
void finished(QNetworkReply *reply);
void doHttpRequest(QUrl url, bool post = false, QString postData = "");
void on_button_update_clicked();
void on_action_Settings_triggered();
void on_action_AboutQt_triggered();
void on_action_About_triggered();
private:
Ui::MainWindow *ui;
QNetworkAccessManager *nam;
QJson::Parser parser;
QStringList knownActions;
};
#endif // MAINWINDOW_H
// kate: indent-mode cstyle; indent-width 4; replace-tabs on;
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>320</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>320</height>
</size>
</property>
<property name="windowTitle">
<string notr="true">justask-qt-client</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_info">
<attribute name="title">
<string>Information</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="2">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::FieldsStayAtSizeHint</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_user_name_i">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>User name:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_user_name">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_question_count_i">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Question count:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_question_count">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_answer_count_i">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Answer count:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_answer_count">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_gravatar_i">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Gravatar:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_gravatar">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_twitter_on_i">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Twitter:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label_twitter_on">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_anon_questions_i">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Anonymous questions:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="label_anon_questions">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="button_update">
<property name="text">
<string>&amp;Update</string>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_info_site_name">
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string notr="true">???</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_inbox">
<attribute name="title">
<string>Inbox</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_answers">
<attribute name="title">
<string>Answers</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menu_File">
<property name="title">
<string>&amp;File</string>
</property>
<addaction name="action_Settings"/>
<addaction name="action_Quit"/>
</widget>
<widget class="QMenu" name="menu_Help">
<property name="title">
<string>&amp;Help</string>
</property>
<addaction name="action_About"/>
<addaction name="action_AboutQt"/>
</widget>
<addaction name="menu_File"/>
<addaction name="menu_Help"/>
</widget>
<action name="action_Settings">
<property name="text">
<string>&amp;Settings</string>
</property>
<property name="shortcut">
<string>Ctrl+,</string>
</property>
<property name="menuRole">
<enum>QAction::PreferencesRole</enum>
</property>
</action>
<action name="action_Quit">
<property name="text">
<string>&amp;Quit</string>
</property>
<property name="shortcut">
<string>Ctrl+Q</string>
</property>
<property name="menuRole">
<enum>QAction::QuitRole</enum>
</property>
</action>
<action name="action_AboutQt">
<property name="text">
<string>About &amp;Qt</string>
</property>
<property name="menuRole">
<enum>QAction::AboutQtRole</enum>
</property>
</action>
<action name="action_About">
<property name="text">
<string>&amp;About</string>
</property>
<property name="menuRole">
<enum>QAction::AboutRole</enum>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections>
<connection>
<sender>action_Quit</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>199</x>
<y>149</y>
</hint>
</hints>
</connection>
</connections>
</ui>
#include "settingsdialog.h"
#include "ui_settingsdialog.h"
#include "mainwindow.h"
#include <QUrl>
extern QSettings s;
SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog)
{
ui->setupUi(this);
s.beginGroup("general");
ui->line_user_name->setText(s.value("user_name", "").toString());
ui->line_apikey->setText(s.value("api_key", "").toString());
ui->installation_url->setText(s.value("installation_url", "http://").toString());
s.endGroup();
}
SettingsDialog::~SettingsDialog()
{
delete ui;
}
void SettingsDialog::on_installation_url_textChanged(QString s)
{
if (s.toLower().startsWith("https://")) {
ui->http_s->setCurrentIndex(1);
ui->installation_url->setText(s.replace("https://", "", Qt::CaseInsensitive));
} else if (s.toLower().startsWith("http://")) {
ui->http_s->setCurrentIndex(0);
ui->installation_url->setText(s.replace("http://", "", Qt::CaseInsensitive));
}
}
void SettingsDialog::accept()
{
qDebug("[i] saving settings");
s.beginGroup("general");
s.setValue("user_name", ui->line_user_name->text());
s.setValue("api_key", ui->line_apikey->text());
s.setValue("installation_url", ui->http_s->currentText().append(ui->installation_url->text()));
s.endGroup();
QDialog::accept();
}
void SettingsDialog::reject()
{
qDebug("[i] settings not saved");
QDialog::reject();
}
// kate: indent-mode cstyle; indent-width 4; replace-tabs on;
#ifndef SETTINGSDIALOG_H
#define SETTINGSDIALOG_H
#include <QDialog>
#include <QSettings>
namespace Ui
{
class SettingsDialog;
}
class SettingsDialog : public QDialog
{
Q_OBJECT
public:
explicit SettingsDialog(QWidget *parent = 0);
~SettingsDialog();
private slots:
void on_installation_url_textChanged(QString s);
void accept();
void reject();
private:
Ui::SettingsDialog *ui;
};
#endif // SETTINGS_H
// kate: indent-mode cstyle; indent-width 4; replace-tabs on;
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SettingsDialog</class>
<widget class="QDialog" name="SettingsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>200</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>200</height>
</size>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_general">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_tab_general">
<item row="0" column="0">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::FieldsStayAtSizeHint</enum>
</property>
<item row="1" column="0">
<widget class="QLabel" name="label_user_name">
<property name="text">
<string>User name</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="line_user_name"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_api_key">
<property name="text">
<string>API Key</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_installation_url">
<property name="text">
<string>Installation URL</string>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="http_s">
<item>
<property name="text">
<string>http://</string>
</property>
</item>
<item>
<property name="text">
<string>https://</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QLineEdit" name="installation_url">
<property name="placeholderText">
<string>ask.example.com</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="line_apikey"/>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Tab 2</string>
</attribute>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>SettingsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>SettingsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="de" sourcelanguage="en">
<context>
<name>MainWindow</name>
<message>
<source>&amp;File</source>
<translation>&amp;Datei</translation>
</message>
<message>
<source>&amp;Help</source>
<translation>&amp;Hilfe</translation>
</message>
<message>
<source>&amp;Settings</source>
<translation>&amp;Einstellungen</translation>
</message>
<message>
<source>Ctrl+,</source>
<translation>Strg+,</translation>
</message>
<message>
<source>&amp;Quit</source>
<translation>&amp;Beenden</translation>
</message>
<message>
<source>Ctrl+Q</source>
<translation>Strg+Q</translation>
</message>
<message>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<source>No error occurred.&lt;br /&gt;Congratulations, you found aBug&amp;trade;</source>
<translation>Es ist kein Fehler aufgetreten.&lt;br /&gt;Herzlichen Glückwunsch, du hast einen Bug gefunden</translation>
</message>
<message>
<source>Connection refused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The remote host closed the connection.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Host not found.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection timed out.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The SSL/TLS handshake failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The connection was broken due to disconnection from the network, however the system has initiated roaming to another access point.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>HTTP 401: Access denied.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>HTTP 404: File not found.</source>
<translation>HTTP 404: Datei nicht gefunden.</translation>
</message>
<message>
<source>Network error.</source>
<translation>Netzwerkfehler.</translation>
</message>
<message>
<source>Unknown error.</source>
<translation>Unbekannter Fehler.</translation>
</message>
<message>
<source>Information</source>
<translation>Informationen</translation>
</message>
<message>
<source>User name:</source>
<translation>Benutzername:</translation>
</message>
<message>
<source>Unknown</source>
<translation>Unbekannt</translation>
</message>
<message>
<source>Question count:</source>
<translation>Anzahl der Fragen:</translation>
</message>
<message>
<source>Answer count:</source>
<translation>Anzahl der Antworten:</translation>
</message>
<message>
<source>Gravatar:</source>
<translation>Gravatar:</translation>
</message>
<message>
<source>Anonymous questions:</source>
<translation>Anonyme Fragen:</translation>
</message>
<message>
<source>Twitter:</source>
<translation>Twitter:</translation>
</message>
<message>
<source>&amp;Update</source>
<translation>&amp;Aktualisieren</translation>
</message>
<message>
<source>Inbox</source>
<translation>Eingang</translation>
</message>
<message>
<source>Answers</source>
<translation>Antworten</translation>
</message>
<message>
<source>Yes</source>
<translation>Ja</translation>
</message>
<message>
<source>No</source>
<translation>Nein</translation>
</message>
<message>
<source>About %1</source>
<translation>Über %1</translation>
</message>
<message>
<source>About &amp;Qt</source>
<translation>Über &amp;Qt</translation>
</message>
<message>
<source>&amp;About</source>
<translation>&amp;Über</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<source>General</source>
<translation>Allgemein</translation>
</message>
<message>
<source>User name</source>
<translation>Benutzername</translation>
</message>
<message>
<source>API Key</source>
<translation>API-Key</translation>
</message>
<message>
<source>Installation URL</source>
<translation>Installations-URL</translation>
</message>
<message>
<source>ask.example.com</source>
<translation>ask.example.com</translation>
</message>
<message>
<source>http://</source>
<translation></translation>
</message>
<message>
<source>https://</source>
<translation></translation>
</message>
<message>
<source>Tab 2</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment