added motd message system
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Syping 2020-09-13 02:10:15 +02:00
parent 57c32eea58
commit 15dfc2c84b
17 changed files with 648 additions and 251 deletions

View file

@ -177,6 +177,24 @@ if(FLATPAK_BUILD)
)
endif()
option(WITH_MOTD "Developer message system directed to users" OFF)
if(WITH_MOTD)
list(APPEND GTA5VIEW_HEADERS
MessageThread.h
)
list(APPEND GTA5VIEW_SOURCES
MessageThread.cpp
)
list(APPEND GTA5VIEW_DEFINES
-DGTA5SYNC_MOTD
)
if(MOTD_WEBURL)
list(APPEND GTA5VIEW_DEFINES
"-DGTA5SYNC_MOTD_WEBURL=\"${MOTD_WEBURL}\""
)
endif()
endif()
option(WITH_TELEMETRY "Hardware survey and basic telemetry system" OFF)
if(WITH_TELEMETRY)
list(APPEND GTA5VIEW_HEADERS

View file

@ -1,6 +1,6 @@
/*****************************************************************************
* gta5view Grand Theft Auto V Profile Viewer
* Copyright (C) 2016-2017 Syping
* Copyright (C) 2016-2020 Syping
*
* 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
@ -48,11 +48,8 @@ void DatabaseThread::run()
while (threadRunning)
{
if (threadRunning)
{
QTimer::singleShot(300000, &threadLoop, SLOT(quit()));
threadLoop.exec();
}
QTimer::singleShot(300000, &threadLoop, SLOT(quit()));
threadLoop.exec();
}
}

111
MessageThread.cpp Normal file
View file

@ -0,0 +1,111 @@
/*****************************************************************************
* gta5view Grand Theft Auto V Profile Viewer
* Copyright (C) 2020 Syping
*
* 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, either version 3 of the License, or
* (at your option) any later version.
*
* 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/>.
*****************************************************************************/
#include "TranslationClass.h"
#include "MessageThread.h"
#include "AppEnv.h"
#include "config.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QEventLoop>
#include <QUrlQuery>
#include <QTimer>
#include <QDebug>
#include <QUrl>
MessageThread::MessageThread(uint cacheId, QObject *parent) : QThread(parent), cacheId(cacheId)
{
threadRunning = true;
}
void MessageThread::run()
{
QEventLoop threadLoop;
QObject::connect(this, SIGNAL(threadTerminated()), &threadLoop, SLOT(quit()));
while (threadRunning) {
{
#ifdef GTA5SYNC_MOTD_WEBURL
QUrl motdWebUrl = QUrl(GTA5SYNC_MOTD_WEBURL);
#else
QUrl motdWebUrl = QUrl("https://motd.syping.de/gta5view-dev/");
#endif
QUrlQuery urlQuery(motdWebUrl);
urlQuery.addQueryItem("code", GTA5SYNC_BUILDCODE);
urlQuery.addQueryItem("cacheid", QString::number(cacheId));
urlQuery.addQueryItem("lang", Translator->getCurrentLanguage());
urlQuery.addQueryItem("version", GTA5SYNC_APPVER);
motdWebUrl.setQuery(urlQuery);
QNetworkAccessManager *netManager = new QNetworkAccessManager();
QNetworkRequest netRequest(motdWebUrl);
netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
QNetworkReply *netReply = netManager->get(netRequest);
QEventLoop downloadLoop;
QObject::connect(netManager, SIGNAL(finished(QNetworkReply*)), &downloadLoop, SLOT(quit()));
QObject::connect(this, SIGNAL(threadTerminated()), &threadLoop, SLOT(quit()));
QTimer::singleShot(60000, &downloadLoop, SLOT(quit()));
downloadLoop.exec();
if (netReply->isFinished()) {
QByteArray jsonContent = netReply->readAll();
QString headerData = QString::fromUtf8(netReply->rawHeader("gta5view"));
if (!headerData.isEmpty()) {
QMap<QString,QString> headerMap;
const QStringList headerVarList = headerData.split(';');
for (QString headerVar : headerVarList) {
QStringList varValueList = headerVar.split('=');
if (varValueList.length() >= 2) {
const QString variable = varValueList.at(0).trimmed();
varValueList.removeFirst();
const QString value = varValueList.join('=');
headerMap.insert(variable, value);
}
}
if (headerMap.value("update", "false") == "true") {
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonContent);
emit messagesArrived(jsonDocument.object());
}
if (headerMap.contains("cache")) {
bool uintOk;
uint cacheVal = headerMap.value("cache").toUInt(&uintOk);
if (uintOk) {
cacheId = cacheVal;
emit updateCacheId(cacheId);
}
}
}
}
delete netReply;
delete netManager;
}
QTimer::singleShot(300000, &threadLoop, SLOT(quit()));
threadLoop.exec();
}
}
void MessageThread::terminateThread()
{
threadRunning = false;
emit threadTerminated();
}

48
MessageThread.h Normal file
View file

@ -0,0 +1,48 @@
/*****************************************************************************
* gta5view Grand Theft Auto V Profile Viewer
* Copyright (C) 2020 Syping
*
* 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, either version 3 of the License, or
* (at your option) any later version.
*
* 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 MESSAGETHREAD_H
#define MESSAGETHREAD_H
#include <QJsonObject>
#include <QObject>
#include <QThread>
class MessageThread : public QThread
{
Q_OBJECT
public:
explicit MessageThread(uint cacheId, QObject *parent = 0);
public slots:
void terminateThread();
private:
bool threadRunning;
uint cacheId;
protected:
void run();
signals:
void messagesArrived(const QJsonObject &messageObject);
void updateCacheId(uint cacheId);
void threadTerminated();
};
#endif // MESSAGETHREAD_H

View file

@ -40,14 +40,21 @@
#include <QMessageBox>
#include <QSettings>
#include <QFileInfo>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QDir>
#include <QMap>
#ifdef GTA5SYNC_MOTD
UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, MessageThread *threadMessage, QWidget *parent) :
QMainWindow(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB), threadMessage(threadMessage),
ui(new Ui::UserInterface)
#else
UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent) :
QMainWindow(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB),
ui(new Ui::UserInterface)
#endif
{
ui->setupUi(this);
contentMode = 0;
@ -328,7 +335,11 @@ void UserInterface::closeProfile_p()
void UserInterface::closeEvent(QCloseEvent *ev)
{
Q_UNUSED(ev)
#ifdef GTA5SYNC_MOTD
threadMessage->terminateThread();
#else
threadDB->terminateThread();
#endif
}
UserInterface::~UserInterface()
@ -603,6 +614,119 @@ void UserInterface::settingsApplied(int _contentMode, bool languageChanged)
}
}
#ifdef GTA5SYNC_MOTD
void UserInterface::messagesArrived(const QJsonObject &object)
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("Messages");
QJsonObject::const_iterator it = object.constBegin();
QJsonObject::const_iterator end = object.constEnd();
QStringList messages;
while (it != end) {
const QString key = it.key();
const QJsonValue value = it.value();
bool uintOk;
uint messageId = key.toUInt(&uintOk);
if (uintOk && value.isString()) {
const QString valueStr = value.toString();
settings.setValue(QString::number(messageId), valueStr);
messages << valueStr;
}
it++;
}
settings.endGroup();
if (!messages.isEmpty())
showMessages(messages);
}
void UserInterface::showMessages(const QStringList messages)
{
QDialog *messageDialog = new QDialog(this);
messageDialog->setWindowTitle(tr("%1 - Messages").arg(GTA5SYNC_APPSTR));
messageDialog->setWindowFlags(messageDialog->windowFlags()^Qt::WindowContextHelpButtonHint);
QVBoxLayout *messageLayout = new QVBoxLayout;
messageDialog->setLayout(messageLayout);
QStackedWidget *stackWidget = new QStackedWidget(messageDialog);
for (const QString message : messages) {
QLabel *messageLabel = new QLabel(messageDialog);
messageLabel->setText(message);
messageLabel->setWordWrap(true);
stackWidget->addWidget(messageLabel);
}
messageLayout->addWidget(stackWidget);
QHBoxLayout *buttonLayout = new QHBoxLayout;
QPushButton *backButton = new QPushButton(messageDialog);
QPushButton *nextButton = new QPushButton(messageDialog);
if (QIcon::hasThemeIcon("go-previous") && QIcon::hasThemeIcon("go-next") && QIcon::hasThemeIcon("list-add")) {
backButton->setIcon(QIcon::fromTheme("go-previous"));
nextButton->setIcon(QIcon::fromTheme("go-next"));
}
else {
backButton->setIcon(QIcon(":/img/back.svgz"));
nextButton->setIcon(QIcon(":/img/next.svgz"));
}
backButton->setEnabled(false);
if (stackWidget->count() <= 1) {
nextButton->setEnabled(false);
}
buttonLayout->addWidget(backButton);
buttonLayout->addWidget(nextButton);
buttonLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
QPushButton *closeButton = new QPushButton(messageDialog);
closeButton->setText(tr("&Close"));
if (QIcon::hasThemeIcon("dialog-close")) {
closeButton->setIcon(QIcon::fromTheme("dialog-close"));
}
else if (QIcon::hasThemeIcon("gtk-close")) {
closeButton->setIcon(QIcon::fromTheme("gtk-close"));
}
buttonLayout->addWidget(closeButton);
messageLayout->addLayout(buttonLayout);
QObject::connect(backButton, &QPushButton::clicked, [stackWidget,backButton,nextButton,closeButton]() {
int index = stackWidget->currentIndex();
if (index > 0) {
index--;
stackWidget->setCurrentIndex(index);
nextButton->setEnabled(true);
if (index > 0) {
backButton->setEnabled(true);
}
else {
backButton->setEnabled(false);
closeButton->setFocus();
}
}
});
QObject::connect(nextButton, &QPushButton::clicked, [stackWidget,backButton,nextButton,closeButton]() {
int index = stackWidget->currentIndex();
if (index < stackWidget->count()-1) {
index++;
stackWidget->setCurrentIndex(index);
backButton->setEnabled(true);
if (index < stackWidget->count()-1) {
nextButton->setEnabled(true);
}
else {
nextButton->setEnabled(false);
closeButton->setFocus();
}
}
});
QObject::connect(closeButton, &QPushButton::clicked, messageDialog, &QDialog::accept);
QObject::connect(messageDialog, &QDialog::finished, messageDialog, &QDialog::deleteLater);
QTimer::singleShot(0, closeButton, SLOT(setFocus()));
messageDialog->show();
}
void UserInterface::updateCacheId(uint cacheId)
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("Messages");
settings.setValue("CacheId", cacheId);
settings.endGroup();
}
#endif
void UserInterface::on_actionSelect_GTA_Folder_triggered()
{
QString GTAV_Folder_Temp = QFileDialog::getExistingDirectory(this, tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);

View file

@ -31,6 +31,10 @@
#include <QString>
#include <QMap>
#ifdef GTA5SYNC_MOTD
#include "MessageThread.h"
#endif
namespace Ui {
class UserInterface;
}
@ -39,7 +43,11 @@ class UserInterface : public QMainWindow
{
Q_OBJECT
public:
#ifdef GTA5SYNC_MOTD
explicit UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, MessageThread *messageThread, QWidget *parent = 0);
#else
explicit UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
#endif
void setupDirEnv();
~UserInterface();
@ -67,6 +75,11 @@ private slots:
void on_actionSet_Crew_triggered();
void on_actionSet_Title_triggered();
void settingsApplied(int contentMode, bool languageChanged);
#ifdef GTA5SYNC_MOTD
void messagesArrived(const QJsonObject &object);
void showMessages(const QStringList messages);
void updateCacheId(uint cacheId);
#endif
protected:
void closeEvent(QCloseEvent *ev);
@ -75,6 +88,9 @@ private:
ProfileDatabase *profileDB;
CrewDatabase *crewDB;
DatabaseThread *threadDB;
#ifdef GTA5SYNC_MOTD
MessageThread *threadMessage;
#endif
Ui::UserInterface *ui;
ProfileInterface *profileUI;
QList<QPushButton*> profileBtns;

View file

@ -40,6 +40,7 @@ SOURCES += main.cpp \
ImportDialog.cpp \
JsonEditorDialog.cpp \
MapLocationDialog.cpp \
MessageThread.cpp \
OptionsDialog.cpp \
PictureDialog.cpp \
PictureExport.cpp \
@ -81,6 +82,7 @@ HEADERS += \
ImportDialog.h \
JsonEditorDialog.h \
MapLocationDialog.h \
MessageThread.h \
OptionsDialog.h \
PictureDialog.h \
PictureExport.h \
@ -236,10 +238,10 @@ INSTALLS += target pixmaps appfiles
# QCONF BASED BUILD STUFF
contains(DEFINES, GTA5SYNC_QCONF){
contains(DEFINES, GTA5SYNC_QCONF) {
isEqual(QT_MAJOR_VERSION, 4): RESOURCES -= res/tr_qt4.qrc
isEqual(QT_MAJOR_VERSION, 5): RESOURCES -= res/tr_qt5.qrc
!contains(DEFINES, GTA5SYNC_QCONF_IN){
!contains(DEFINES, GTA5SYNC_QCONF_IN) {
RESOURCES -= res/tr_g5p.qrc
langfiles.path = $$GTA5SYNC_PREFIX/share/gta5view/translations
langfiles.files = $$PWD/res/gta5sync_en_US.qm $$PWD/res/gta5sync_de.qm $$PWD/res/gta5sync_fr.qm $$PWD/res/gta5sync_ko.qm $$PWD/res/gta5sync_ru.qm $$PWD/res/gta5sync_uk.qm $$PWD/res/gta5sync_zh_TW.qm $$PWD/res/qtbase_en_GB.qm
@ -249,13 +251,25 @@ contains(DEFINES, GTA5SYNC_QCONF){
# TELEMETRY BASED STUFF
!contains(DEFINES, GTA5SYNC_TELEMETRY){
!contains(DEFINES, GTA5SYNC_TELEMETRY) {
SOURCES -= TelemetryClass.cpp \
tmext/TelemetryClassAuthenticator.cpp
HEADERS -= TelemetryClass.h \
tmext/TelemetryClassAuthenticator.h
}
!contains(DEFINES, GTA5SYNC_MOTD) {
SOURCES -= MessageThread.cpp
HEADERS -= MessageThread.h
} else {
lessThan(QT_MAJOR_VERSION, 5) {
SOURCES -= MessageThread.cpp
HEADERS -= MessageThread.h
DEFINES -= GTA5SYNC_MOTD
message("Messages require Qt5 or newer!")
}
}
# CMAKE BASED STUFF
unix: greaterThan(QT_MAJOR_VERSION, 4) {

View file

@ -59,6 +59,10 @@
#include <iostream>
#endif
#ifdef GTA5SYNC_MOTD
#include "MessageThread.h"
#endif
#ifdef GTA5SYNC_TELEMETRY
#include "TelemetryClass.h"
#endif
@ -258,9 +262,7 @@ int main(int argc, char *argv[])
bool readOk = picture.readingPictureFromFile(arg1);
picDialog.setWindowIcon(IconLoader::loadingAppIcon());
picDialog.setSnapmaticPicture(&picture, readOk);
#ifndef Q_OS_LINUX
picDialog.setWindowFlags(picDialog.windowFlags()^Qt::Dialog^Qt::Window);
#endif
int crewID = picture.getSnapmaticProperties().crewID;
if (crewID != 0) { crewDB.addCrew(crewID); }
@ -305,7 +307,26 @@ int main(int argc, char *argv[])
QObject::connect(&threadDB, SIGNAL(finished()), &a, SLOT(quit()));
threadDB.start();
#ifdef GTA5SYNC_MOTD
uint cacheId;
{
QSettings messageSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
messageSettings.beginGroup("Messages");
cacheId = messageSettings.value("CacheId", 0).toUInt();
messageSettings.endGroup();
}
MessageThread threadMessage(cacheId);
QObject::connect(&threadMessage, SIGNAL(finished()), &threadDB, SLOT(terminateThread()));
threadMessage.start();
#endif
#ifdef GTA5SYNC_MOTD
UserInterface uiWindow(&profileDB, &crewDB, &threadDB, &threadMessage);
QObject::connect(&threadMessage, SIGNAL(messagesArrived(QJsonObject)), &uiWindow, SLOT(messagesArrived(QJsonObject)));
QObject::connect(&threadMessage, SIGNAL(updateCacheId(uint)), &uiWindow, SLOT(updateCacheId(uint)));
#else
UserInterface uiWindow(&profileDB, &crewDB, &threadDB);
#endif
uiWindow.setWindowIcon(IconLoader::loadingAppIcon());
uiWindow.setupDirEnv();
#ifdef Q_OS_ANDROID

View file

@ -1315,7 +1315,7 @@ Press 1 for Default View</source>
<location filename="../ImportDialog.cpp" line="438"/>
<location filename="../ImportDialog.cpp" line="759"/>
<location filename="../ProfileInterface.cpp" line="529"/>
<location filename="../UserInterface.cpp" line="463"/>
<location filename="../UserInterface.cpp" line="474"/>
<source>All files (**)</source>
<translation type="unfinished"></translation>
</message>
@ -1360,26 +1360,26 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="525"/>
<location filename="../UserInterface.cpp" line="460"/>
<location filename="../UserInterface.cpp" line="471"/>
<source>GTA V Export (*.g5e)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="526"/>
<location filename="../UserInterface.cpp" line="461"/>
<location filename="../UserInterface.cpp" line="472"/>
<source>Savegames files (SGTA*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="527"/>
<location filename="../UserInterface.cpp" line="462"/>
<location filename="../UserInterface.cpp" line="473"/>
<source>Snapmatic pictures (PGTA*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="553"/>
<location filename="../ProfileInterface.cpp" line="944"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>No valid file is selected</source>
<translation type="unfinished"></translation>
</message>
@ -1398,13 +1398,13 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="650"/>
<location filename="../UserInterface.cpp" line="503"/>
<location filename="../UserInterface.cpp" line="514"/>
<source>Failed to read Snapmatic picture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="685"/>
<location filename="../UserInterface.cpp" line="519"/>
<location filename="../UserInterface.cpp" line="530"/>
<source>Failed to read Savegame file</source>
<translation type="unfinished"></translation>
</message>
@ -1614,7 +1614,7 @@ Press 1 for Default View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="459"/>
<location filename="../UserInterface.cpp" line="470"/>
<source>All profile files (*.g5e SGTA* PGTA*)</source>
<translation type="unfinished"></translation>
</message>
@ -1622,17 +1622,17 @@ Press 1 for Default View</source>
<context>
<name>QApplication</name>
<message>
<location filename="../main.cpp" line="113"/>
<location filename="../main.cpp" line="117"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="113"/>
<location filename="../main.cpp" line="117"/>
<source>Selected Font: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="140"/>
<location filename="../main.cpp" line="144"/>
<source>&lt;h4&gt;Welcome to %1!&lt;/h4&gt;You want to configure %1 before you start using it?</source>
<translation type="unfinished"></translation>
</message>
@ -2209,22 +2209,22 @@ Press 1 for Default View</source>
<context>
<name>TelemetryDialog</name>
<message>
<location filename="../main.cpp" line="169"/>
<location filename="../main.cpp" line="173"/>
<source>You want help %1 to improve in the future by including personal usage data in your submission?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="170"/>
<location filename="../main.cpp" line="174"/>
<source>%1 User Statistics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="174"/>
<location filename="../main.cpp" line="178"/>
<source>Yes, I want include personal usage data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="183"/>
<location filename="../main.cpp" line="187"/>
<source>&amp;OK</source>
<translation type="unfinished"></translation>
</message>
@ -2233,7 +2233,7 @@ Press 1 for Default View</source>
<name>UserInterface</name>
<message>
<location filename="../UserInterface.ui" line="20"/>
<location filename="../UserInterface.cpp" line="61"/>
<location filename="../UserInterface.cpp" line="68"/>
<source>%2 - %1</source>
<translation type="unfinished"></translation>
</message>
@ -2265,6 +2265,7 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../UserInterface.ui" line="153"/>
<location filename="../UserInterface.cpp" line="676"/>
<source>&amp;Close</source>
<translation type="unfinished"></translation>
</message>
@ -2300,8 +2301,8 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../UserInterface.ui" line="236"/>
<location filename="../UserInterface.cpp" line="59"/>
<location filename="../UserInterface.cpp" line="641"/>
<location filename="../UserInterface.cpp" line="66"/>
<location filename="../UserInterface.cpp" line="765"/>
<source>&amp;About %1</source>
<translation type="unfinished"></translation>
</message>
@ -2357,15 +2358,15 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../UserInterface.ui" line="319"/>
<location filename="../UserInterface.cpp" line="247"/>
<location filename="../UserInterface.cpp" line="254"/>
<source>Select &amp;GTA V Folder...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.ui" line="322"/>
<location filename="../OptionsDialog.cpp" line="744"/>
<location filename="../UserInterface.cpp" line="188"/>
<location filename="../UserInterface.cpp" line="608"/>
<location filename="../UserInterface.cpp" line="195"/>
<location filename="../UserInterface.cpp" line="732"/>
<source>Select GTA V Folder...</source>
<translation type="unfinished"></translation>
</message>
@ -2414,29 +2415,34 @@ Press 1 for Default View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="63"/>
<location filename="../UserInterface.cpp" line="313"/>
<location filename="../UserInterface.cpp" line="655"/>
<location filename="../UserInterface.cpp" line="70"/>
<location filename="../UserInterface.cpp" line="320"/>
<location filename="../UserInterface.cpp" line="779"/>
<source>Select Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="456"/>
<location filename="../UserInterface.cpp" line="467"/>
<source>Open File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="503"/>
<location filename="../UserInterface.cpp" line="519"/>
<location filename="../UserInterface.cpp" line="546"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="514"/>
<location filename="../UserInterface.cpp" line="530"/>
<location filename="../UserInterface.cpp" line="557"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>Open File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="546"/>
<location filename="../UserInterface.cpp" line="557"/>
<source>Can&apos;t open %1 because of not valid file format</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="645"/>
<source>%1 - Messages</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

Binary file not shown.

View file

@ -1333,13 +1333,13 @@ Drücke 1 für Standardmodus</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="526"/>
<location filename="../UserInterface.cpp" line="461"/>
<location filename="../UserInterface.cpp" line="472"/>
<source>Savegames files (SGTA*)</source>
<translation>Spielstanddateien (SGTA*)</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="527"/>
<location filename="../UserInterface.cpp" line="462"/>
<location filename="../UserInterface.cpp" line="473"/>
<source>Snapmatic pictures (PGTA*)</source>
<translation>Snapmatic Bilder (PGTA*)</translation>
</message>
@ -1359,7 +1359,7 @@ Drücke 1 für Standardmodus</translation>
<location filename="../ImportDialog.cpp" line="438"/>
<location filename="../ImportDialog.cpp" line="759"/>
<location filename="../ProfileInterface.cpp" line="529"/>
<location filename="../UserInterface.cpp" line="463"/>
<location filename="../UserInterface.cpp" line="474"/>
<source>All files (**)</source>
<translation>Alle Dateien (**)</translation>
</message>
@ -1380,13 +1380,13 @@ Drücke 1 für Standardmodus</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="650"/>
<location filename="../UserInterface.cpp" line="503"/>
<location filename="../UserInterface.cpp" line="514"/>
<source>Failed to read Snapmatic picture</source>
<translation>Fehler beim Lesen vom Snapmatic Bild</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="685"/>
<location filename="../UserInterface.cpp" line="519"/>
<location filename="../UserInterface.cpp" line="530"/>
<source>Failed to read Savegame file</source>
<translation>Fehler beim Lesen von Spielstanddatei</translation>
</message>
@ -1427,7 +1427,7 @@ Drücke 1 für Standardmodus</translation>
<message>
<location filename="../ProfileInterface.cpp" line="553"/>
<location filename="../ProfileInterface.cpp" line="944"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>No valid file is selected</source>
<translation>Keine gültige Datei wurde ausgewählt</translation>
</message>
@ -1631,13 +1631,13 @@ Drücke 1 für Standardmodus</translation>
<translation>Exportiere Datei %1 von %2 Dateien</translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="459"/>
<location filename="../UserInterface.cpp" line="470"/>
<source>All profile files (*.g5e SGTA* PGTA*)</source>
<translation>Alle Profildateien (*.g5e SGTA* PGTA*)</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="525"/>
<location filename="../UserInterface.cpp" line="460"/>
<location filename="../UserInterface.cpp" line="471"/>
<source>GTA V Export (*.g5e)</source>
<translation>GTA V Export (*.g5e)</translation>
</message>
@ -1645,17 +1645,17 @@ Drücke 1 für Standardmodus</translation>
<context>
<name>QApplication</name>
<message>
<location filename="../main.cpp" line="113"/>
<location filename="../main.cpp" line="117"/>
<source>Font</source>
<translation>Schrift</translation>
</message>
<message>
<location filename="../main.cpp" line="113"/>
<location filename="../main.cpp" line="117"/>
<source>Selected Font: %1</source>
<translation>Ausgewähle Schrift: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="140"/>
<location filename="../main.cpp" line="144"/>
<source>&lt;h4&gt;Welcome to %1!&lt;/h4&gt;You want to configure %1 before you start using it?</source>
<translation>&lt;h4&gt;Willkommen zu %1!&lt;/h4&gt;Möchtest du %1 einstellen bevor du es nutzt?</translation>
</message>
@ -2234,22 +2234,22 @@ Drücke 1 für Standardmodus</translation>
<context>
<name>TelemetryDialog</name>
<message>
<location filename="../main.cpp" line="170"/>
<location filename="../main.cpp" line="174"/>
<source>%1 User Statistics</source>
<translation>%1 Benutzerstatistik</translation>
</message>
<message>
<location filename="../main.cpp" line="169"/>
<location filename="../main.cpp" line="173"/>
<source>You want help %1 to improve in the future by including personal usage data in your submission?</source>
<translation>Sollen bei Einreichungen Persönliche Nutzungsdaten einbezogen werden um %1 in der Zukunft zu unterstützen?</translation>
</message>
<message>
<location filename="../main.cpp" line="174"/>
<location filename="../main.cpp" line="178"/>
<source>Yes, I want include personal usage data.</source>
<translation>Ja, ich möchte Persönliche Nutzungsdaten einbeziehen.</translation>
</message>
<message>
<location filename="../main.cpp" line="183"/>
<location filename="../main.cpp" line="187"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@ -2349,7 +2349,7 @@ Drücke 1 für Standardmodus</translation>
</message>
<message>
<location filename="../UserInterface.ui" line="319"/>
<location filename="../UserInterface.cpp" line="247"/>
<location filename="../UserInterface.cpp" line="254"/>
<source>Select &amp;GTA V Folder...</source>
<translation>Wähle &amp;GTA V Ordner...</translation>
</message>
@ -2365,6 +2365,7 @@ Drücke 1 für Standardmodus</translation>
</message>
<message>
<location filename="../UserInterface.ui" line="153"/>
<location filename="../UserInterface.cpp" line="676"/>
<source>&amp;Close</source>
<translation>S&amp;chließen</translation>
</message>
@ -2399,51 +2400,56 @@ Drücke 1 für Standardmodus</translation>
<translation>Dateien &amp;importieren...</translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="63"/>
<location filename="../UserInterface.cpp" line="313"/>
<location filename="../UserInterface.cpp" line="655"/>
<location filename="../UserInterface.cpp" line="70"/>
<location filename="../UserInterface.cpp" line="320"/>
<location filename="../UserInterface.cpp" line="779"/>
<source>Select Profile</source>
<translation>Profil auswählen</translation>
</message>
<message>
<location filename="../UserInterface.ui" line="322"/>
<location filename="../OptionsDialog.cpp" line="744"/>
<location filename="../UserInterface.cpp" line="188"/>
<location filename="../UserInterface.cpp" line="608"/>
<location filename="../UserInterface.cpp" line="195"/>
<location filename="../UserInterface.cpp" line="732"/>
<source>Select GTA V Folder...</source>
<translation>Wähle GTA V Ordner...</translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="456"/>
<location filename="../UserInterface.cpp" line="467"/>
<source>Open File...</source>
<translation>Datei öffnen...</translation>
</message>
<message>
<location filename="../UserInterface.ui" line="20"/>
<location filename="../UserInterface.cpp" line="61"/>
<location filename="../UserInterface.cpp" line="68"/>
<source>%2 - %1</source>
<translation>%2 - %1</translation>
</message>
<message>
<location filename="../UserInterface.ui" line="236"/>
<location filename="../UserInterface.cpp" line="59"/>
<location filename="../UserInterface.cpp" line="641"/>
<location filename="../UserInterface.cpp" line="66"/>
<location filename="../UserInterface.cpp" line="765"/>
<source>&amp;About %1</source>
<translation>&amp;Über %1</translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="503"/>
<location filename="../UserInterface.cpp" line="519"/>
<location filename="../UserInterface.cpp" line="546"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="514"/>
<location filename="../UserInterface.cpp" line="530"/>
<location filename="../UserInterface.cpp" line="557"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>Open File</source>
<translation>Datei öffnen</translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="546"/>
<location filename="../UserInterface.cpp" line="557"/>
<source>Can&apos;t open %1 because of not valid file format</source>
<translation>Kann nicht %1 öffnen weil Dateiformat nicht gültig ist</translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="645"/>
<source>%1 - Messages</source>
<translation>%1 - Nachrichten</translation>
</message>
<message>
<location filename="../UserInterface.ui" line="134"/>
<source>&amp;Reload</source>

View file

@ -1331,19 +1331,19 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="525"/>
<location filename="../UserInterface.cpp" line="460"/>
<location filename="../UserInterface.cpp" line="471"/>
<source>GTA V Export (*.g5e)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="526"/>
<location filename="../UserInterface.cpp" line="461"/>
<location filename="../UserInterface.cpp" line="472"/>
<source>Savegames files (SGTA*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="527"/>
<location filename="../UserInterface.cpp" line="462"/>
<location filename="../UserInterface.cpp" line="473"/>
<source>Snapmatic pictures (PGTA*)</source>
<translation type="unfinished"></translation>
</message>
@ -1358,14 +1358,14 @@ Press 1 for Default View</source>
<location filename="../ImportDialog.cpp" line="438"/>
<location filename="../ImportDialog.cpp" line="759"/>
<location filename="../ProfileInterface.cpp" line="529"/>
<location filename="../UserInterface.cpp" line="463"/>
<location filename="../UserInterface.cpp" line="474"/>
<source>All files (**)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="553"/>
<location filename="../ProfileInterface.cpp" line="944"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>No valid file is selected</source>
<translation type="unfinished"></translation>
</message>
@ -1384,13 +1384,13 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="650"/>
<location filename="../UserInterface.cpp" line="503"/>
<location filename="../UserInterface.cpp" line="514"/>
<source>Failed to read Snapmatic picture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="685"/>
<location filename="../UserInterface.cpp" line="519"/>
<location filename="../UserInterface.cpp" line="530"/>
<source>Failed to read Savegame file</source>
<translation type="unfinished"></translation>
</message>
@ -1614,7 +1614,7 @@ Press 1 for Default View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="459"/>
<location filename="../UserInterface.cpp" line="470"/>
<source>All profile files (*.g5e SGTA* PGTA*)</source>
<translation type="unfinished"></translation>
</message>
@ -1622,17 +1622,17 @@ Press 1 for Default View</source>
<context>
<name>QApplication</name>
<message>
<location filename="../main.cpp" line="113"/>
<location filename="../main.cpp" line="117"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="113"/>
<location filename="../main.cpp" line="117"/>
<source>Selected Font: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="140"/>
<location filename="../main.cpp" line="144"/>
<source>&lt;h4&gt;Welcome to %1!&lt;/h4&gt;You want to configure %1 before you start using it?</source>
<translation type="unfinished"></translation>
</message>
@ -2209,22 +2209,22 @@ Press 1 for Default View</source>
<context>
<name>TelemetryDialog</name>
<message>
<location filename="../main.cpp" line="169"/>
<location filename="../main.cpp" line="173"/>
<source>You want help %1 to improve in the future by including personal usage data in your submission?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="170"/>
<location filename="../main.cpp" line="174"/>
<source>%1 User Statistics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="174"/>
<location filename="../main.cpp" line="178"/>
<source>Yes, I want include personal usage data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="183"/>
<location filename="../main.cpp" line="187"/>
<source>&amp;OK</source>
<translation type="unfinished"></translation>
</message>
@ -2233,7 +2233,7 @@ Press 1 for Default View</source>
<name>UserInterface</name>
<message>
<location filename="../UserInterface.ui" line="20"/>
<location filename="../UserInterface.cpp" line="61"/>
<location filename="../UserInterface.cpp" line="68"/>
<source>%2 - %1</source>
<translation type="unfinished"></translation>
</message>
@ -2265,6 +2265,7 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../UserInterface.ui" line="153"/>
<location filename="../UserInterface.cpp" line="676"/>
<source>&amp;Close</source>
<translation type="unfinished"></translation>
</message>
@ -2295,8 +2296,8 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../UserInterface.ui" line="236"/>
<location filename="../UserInterface.cpp" line="59"/>
<location filename="../UserInterface.cpp" line="641"/>
<location filename="../UserInterface.cpp" line="66"/>
<location filename="../UserInterface.cpp" line="765"/>
<source>&amp;About %1</source>
<translation type="unfinished"></translation>
</message>
@ -2352,15 +2353,15 @@ Press 1 for Default View</source>
</message>
<message>
<location filename="../UserInterface.ui" line="319"/>
<location filename="../UserInterface.cpp" line="247"/>
<location filename="../UserInterface.cpp" line="254"/>
<source>Select &amp;GTA V Folder...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.ui" line="322"/>
<location filename="../OptionsDialog.cpp" line="744"/>
<location filename="../UserInterface.cpp" line="188"/>
<location filename="../UserInterface.cpp" line="608"/>
<location filename="../UserInterface.cpp" line="195"/>
<location filename="../UserInterface.cpp" line="732"/>
<source>Select GTA V Folder...</source>
<translation type="unfinished"></translation>
</message>
@ -2400,30 +2401,35 @@ Press 1 for Default View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="63"/>
<location filename="../UserInterface.cpp" line="313"/>
<location filename="../UserInterface.cpp" line="655"/>
<location filename="../UserInterface.cpp" line="70"/>
<location filename="../UserInterface.cpp" line="320"/>
<location filename="../UserInterface.cpp" line="779"/>
<source>Select Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="456"/>
<location filename="../UserInterface.cpp" line="467"/>
<source>Open File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="503"/>
<location filename="../UserInterface.cpp" line="519"/>
<location filename="../UserInterface.cpp" line="546"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="514"/>
<location filename="../UserInterface.cpp" line="530"/>
<location filename="../UserInterface.cpp" line="557"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>Open File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="546"/>
<location filename="../UserInterface.cpp" line="557"/>
<source>Can&apos;t open %1 because of not valid file format</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../UserInterface.cpp" line="645"/>
<source>%1 - Messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="1545"/>
<location filename="../ProfileInterface.cpp" line="1559"/>

View file

@ -1344,13 +1344,13 @@ Appuyer sur 1 pour le mode par défaut</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="526"/>
<location filename="../UserInterface.cpp" line="461"/>
<location filename="../UserInterface.cpp" line="472"/>
<source>Savegames files (SGTA*)</source>
<translation>Fichiers de sauvegarde GTA (SGTA*)</translation>
</message>
<message>
<location filename="../ProfileInterface.cpp" line="527"/>
<location filename="../UserInterface.cpp" line="462"/>
<location filename="../UserInterface.cpp" line="473"/>
<source>Snapmatic pictures (PGTA*)</source>
<translation>Photos Snapmatic (PGTA*)</translation>
</message>
@ -1365,7 +1365,7 @@ Appuyer sur 1 pour le mode par défaut</translation>
<location filename="../ImportDialog.cpp" line="438"/>
<location filename="../ImportDialog.cpp" line="759"/>
<location filename="../ProfileInterface.cpp" line="529"/>
<location filename="../UserInterface.cpp" line="463"/>
<location filename="../UserInterface.cpp" line="474"/>
<source>All files (**)</source>
<translation>Tous les fichiers (**)</translation>
</message>
@ -1387,7 +1387,7 @@ Appuyer sur 1 pour le mode par défaut</translation>
<message>
<location filename="../ProfileInterface.cpp" line="553"/>
<location filename="../ProfileInterface.cpp" line="944"/>
<location filename="../UserInterface.cpp" line="551"/>
<location filename="../UserInterface.cpp" line="562"/>
<source>No valid file is selected</source>
<translation>Fichier invalide</translation>
</message>
@ -1398,13 +1398,13 @@ Appu