diff --git a/CMakeLists.txt b/CMakeLists.txt
index f028be6..97d4837 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -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
diff --git a/DatabaseThread.cpp b/DatabaseThread.cpp
index 498ad90..a944638 100644
--- a/DatabaseThread.cpp
+++ b/DatabaseThread.cpp
@@ -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();
}
}
diff --git a/MessageThread.cpp b/MessageThread.cpp
new file mode 100644
index 0000000..2781ac6
--- /dev/null
+++ b/MessageThread.cpp
@@ -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 .
+*****************************************************************************/
+
+#include "TranslationClass.h"
+#include "MessageThread.h"
+#include "AppEnv.h"
+#include "config.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+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 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();
+}
diff --git a/MessageThread.h b/MessageThread.h
new file mode 100644
index 0000000..fa2d25b
--- /dev/null
+++ b/MessageThread.h
@@ -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 .
+*****************************************************************************/
+
+#ifndef MESSAGETHREAD_H
+#define MESSAGETHREAD_H
+
+#include
+#include
+#include
+
+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
diff --git a/UserInterface.cpp b/UserInterface.cpp
index a9d7734..78476ea 100644
--- a/UserInterface.cpp
+++ b/UserInterface.cpp
@@ -40,14 +40,21 @@
#include
#include
#include
+#include
#include
#include
#include
#include
+#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);
diff --git a/UserInterface.h b/UserInterface.h
index c6f9ed2..7e5259d 100644
--- a/UserInterface.h
+++ b/UserInterface.h
@@ -31,6 +31,10 @@
#include
#include
+#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 profileBtns;
diff --git a/gta5view.pro b/gta5view.pro
index db2c77e..7761343 100644
--- a/gta5view.pro
+++ b/gta5view.pro
@@ -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) {
diff --git a/main.cpp b/main.cpp
index f08ab01..870a1bb 100644
--- a/main.cpp
+++ b/main.cpp
@@ -59,6 +59,10 @@
#include
#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
diff --git a/res/gta5sync.ts b/res/gta5sync.ts
index 9510eff..e408904 100644
--- a/res/gta5sync.ts
+++ b/res/gta5sync.ts
@@ -1315,7 +1315,7 @@ Press 1 for Default View
-
+
@@ -1360,26 +1360,26 @@ Press 1 for Default View
-
+
-
+
-
+
-
+
@@ -1398,13 +1398,13 @@ Press 1 for Default View
-
+
-
+
@@ -1614,7 +1614,7 @@ Press 1 for Default View
-
+
@@ -1622,17 +1622,17 @@ Press 1 for Default View
QApplication
-
+
-
+
-
+
@@ -2209,22 +2209,22 @@ Press 1 for Default View
TelemetryDialog
-
+
-
+
-
+
-
+
@@ -2233,7 +2233,7 @@ Press 1 for Default View
UserInterface
-
+
@@ -2265,6 +2265,7 @@ Press 1 for Default View
+
@@ -2300,8 +2301,8 @@ Press 1 for Default View
-
-
+
+
@@ -2357,15 +2358,15 @@ Press 1 for Default View
-
+
-
-
+
+
@@ -2414,29 +2415,34 @@ Press 1 for Default View
-
-
-
+
+
+
-
+
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
diff --git a/res/gta5sync_de.qm b/res/gta5sync_de.qm
index ce9dec1..246cd44 100644
Binary files a/res/gta5sync_de.qm and b/res/gta5sync_de.qm differ
diff --git a/res/gta5sync_de.ts b/res/gta5sync_de.ts
index 8b00064..0d5d6e2 100644
--- a/res/gta5sync_de.ts
+++ b/res/gta5sync_de.ts
@@ -1333,13 +1333,13 @@ Drücke 1 für Standardmodus
-
+
Spielstanddateien (SGTA*)
-
+
Snapmatic Bilder (PGTA*)
@@ -1359,7 +1359,7 @@ Drücke 1 für Standardmodus
-
+
Alle Dateien (**)
@@ -1380,13 +1380,13 @@ Drücke 1 für Standardmodus
-
+
Fehler beim Lesen vom Snapmatic Bild
-
+
Fehler beim Lesen von Spielstanddatei
@@ -1427,7 +1427,7 @@ Drücke 1 für Standardmodus
-
+
Keine gültige Datei wurde ausgewählt
@@ -1631,13 +1631,13 @@ Drücke 1 für Standardmodus
Exportiere Datei %1 von %2 Dateien
-
+
Alle Profildateien (*.g5e SGTA* PGTA*)
-
+
GTA V Export (*.g5e)
@@ -1645,17 +1645,17 @@ Drücke 1 für Standardmodus
QApplication
-
+
Schrift
-
+
Ausgewähle Schrift: %1
-
+
<h4>Willkommen zu %1!</h4>Möchtest du %1 einstellen bevor du es nutzt?
@@ -2234,22 +2234,22 @@ Drücke 1 für Standardmodus
TelemetryDialog
-
+
%1 Benutzerstatistik
-
+
Sollen bei Einreichungen Persönliche Nutzungsdaten einbezogen werden um %1 in der Zukunft zu unterstützen?
-
+
Ja, ich möchte Persönliche Nutzungsdaten einbeziehen.
-
+
&OK
@@ -2349,7 +2349,7 @@ Drücke 1 für Standardmodus
-
+
Wähle >A V Ordner...
@@ -2365,6 +2365,7 @@ Drücke 1 für Standardmodus
+
S&chließen
@@ -2399,51 +2400,56 @@ Drücke 1 für Standardmodus
Dateien &importieren...
-
-
-
+
+
+
Profil auswählen
-
-
+
+
Wähle GTA V Ordner...
-
+
Datei öffnen...
-
+
%2 - %1
-
-
+
+
&Über %1
-
-
-
-
+
+
+
+
Datei öffnen
-
+
Kann nicht %1 öffnen weil Dateiformat nicht gültig ist
+
+
+
+ %1 - Nachrichten
+
diff --git a/res/gta5sync_en_US.ts b/res/gta5sync_en_US.ts
index 386924d..518ff52 100644
--- a/res/gta5sync_en_US.ts
+++ b/res/gta5sync_en_US.ts
@@ -1331,19 +1331,19 @@ Press 1 for Default View
-
+
-
+
-
+
@@ -1358,14 +1358,14 @@ Press 1 for Default View
-
+
-
+
@@ -1384,13 +1384,13 @@ Press 1 for Default View
-
+
-
+
@@ -1614,7 +1614,7 @@ Press 1 for Default View
-
+
@@ -1622,17 +1622,17 @@ Press 1 for Default View
QApplication
-
+
-
+
-
+
@@ -2209,22 +2209,22 @@ Press 1 for Default View
TelemetryDialog
-
+
-
+
-
+
-
+
@@ -2233,7 +2233,7 @@ Press 1 for Default View
UserInterface
-
+
@@ -2265,6 +2265,7 @@ Press 1 for Default View
+
@@ -2295,8 +2296,8 @@ Press 1 for Default View
-
-
+
+
@@ -2352,15 +2353,15 @@ Press 1 for Default View
-
+
-
-
+
+
@@ -2400,30 +2401,35 @@ Press 1 for Default View
-
-
-
+
+
+
-
+
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
diff --git a/res/gta5sync_fr.ts b/res/gta5sync_fr.ts
index 891d5f2..a746d61 100644
--- a/res/gta5sync_fr.ts
+++ b/res/gta5sync_fr.ts
@@ -1344,13 +1344,13 @@ Appuyer sur 1 pour le mode par défaut
-
+
Fichiers de sauvegarde GTA (SGTA*)
-
+
Photos Snapmatic (PGTA*)
@@ -1365,7 +1365,7 @@ Appuyer sur 1 pour le mode par défaut
-
+
Tous les fichiers (**)
@@ -1387,7 +1387,7 @@ Appuyer sur 1 pour le mode par défaut
-
+
Fichier invalide
@@ -1398,13 +1398,13 @@ Appuyer sur 1 pour le mode par défaut
-
+
Impossible d'ouvrir la photo Snapmatic
-
+
Impossible de lire le fichier de sauvegarde
@@ -1632,13 +1632,13 @@ Appuyer sur 1 pour le mode par défaut
Supprimer la sélection ?
-
+
Tous les fichiers de profil (*.g5e SGTA* PGTA*)
-
+
GTA V Export (*.g5e)
@@ -1646,17 +1646,17 @@ Appuyer sur 1 pour le mode par défaut
QApplication
-
+
Police
-
+
Police sélectionnée : %1
-
+
<h4>Bienvenue sur %1!</h4>Voulez-vous configurer %1 avant de l'utiliser t?
@@ -2237,22 +2237,22 @@ Appuyer sur 1 pour le mode par défaut
TelemetryDialog
-
+
Voulez-vous aider au développement de %1 en transmettant vos données d'utilisation ?
-
+
Statistiques utilisateurs %1
-
+
Oui, je veux partager mes données d'utilisation.
-
+
&OK
@@ -2287,6 +2287,7 @@ Appuyer sur 1 pour le mode par défaut
+
Fer&mer
@@ -2362,15 +2363,15 @@ Appuyer sur 1 pour le mode par défaut
-
+
Modifier l'emplacement de >A V...
-
-
+
+
Modifier l'emplacement de GTA V...
@@ -2416,42 +2417,47 @@ Appuyer sur 1 pour le mode par défaut
-
+
%2 - %1
-
-
+
+
&À propos de %1
-
-
-
+
+
+
Sélectionner un profil
-
+
Ouvrir...
-
-
-
-
+
+
+
+
Ouvrir
-
+
Impossible d'ouvrir %1, format invalide
+
+
+
+
+
diff --git a/res/gta5sync_ko.ts b/res/gta5sync_ko.ts
index 7e71a0b..7d2c644 100644
--- a/res/gta5sync_ko.ts
+++ b/res/gta5sync_ko.ts
@@ -1347,7 +1347,7 @@ Press 1 for Default View
-
+
모든 파일 (**)
@@ -1392,26 +1392,26 @@ Press 1 for Default View
-
+
GTA V로 내보내기 (*.g5e)
-
+
세이브 파일 (SGTA*)
-
+
스냅매틱 사진 (PGTA*)
-
+
올바른 파일이 선택되지 않았습니다
@@ -1432,13 +1432,13 @@ Press 1 for Default View
-
+
스냅매틱 사진을 읽지 못했습니다
-
+
세이브 파일을 읽지 못했습니다
@@ -1657,7 +1657,7 @@ Press 1 for Default View
제목 변경
-
+
모든 프로필 파일 (*.g5e SGTA* PGTA*)
@@ -1665,17 +1665,17 @@ Press 1 for Default View
QApplication
-
+
폰트
-
+
선택된 폰트: %1
-
+
<h4>%1에 오신 것을 환영합니다!</h4>%1을 사용하기 전에 구성하시겠습니까?
@@ -2259,22 +2259,22 @@ Press 1 for Default View
TelemetryDialog
-
+
개인 사용 데이터를 제출에 포함시켜 %1이(가) 개선되기를 원합니까?
-
+
%1 사용자 통계
-
+
예, 개인 사용 데이터를 포함시키고 싶습니다.
-
+
확인(&O)
@@ -2283,7 +2283,7 @@ Press 1 for Default View
UserInterface
-
+
%2 - %1
@@ -2316,6 +2316,7 @@ Press 1 for Default View
+
닫기(&C)
@@ -2351,8 +2352,8 @@ Press 1 for Default View
-
-
+
+
%1 정보(&A)
@@ -2408,15 +2409,15 @@ Press 1 for Default View
-
+
GTA V 폴더 선택(&G)...
-
-
+
+
GTA V 폴더 선택
@@ -2465,29 +2466,34 @@ Press 1 for Default View
인게임 숨기기
-
-
-
+
+
+
프로필 선택
-
+
파일 열기...
-
-
-
-
+
+
+
+
파일 열기
-
+
올바른 파일 형식이 아니므로 %1을 열 수 없습니다
+
+
+
+
+
diff --git a/res/gta5sync_ru.ts b/res/gta5sync_ru.ts
index 797cc8b..1b2dd12 100644
--- a/res/gta5sync_ru.ts
+++ b/res/gta5sync_ru.ts
@@ -1345,13 +1345,13 @@ Press 1 for Default View
-
+
Файлы сохранения (SGTA*)
-
+
Картинка Snapmatic (PGTA*)
@@ -1359,7 +1359,7 @@ Press 1 for Default View
-
+
Все файлы (**)
@@ -1380,20 +1380,20 @@ Press 1 for Default View
-
+
Не удалось загрузить картинку Snapmatic
-
+
Не удалось загрузить файл сохранения
-
+
Выбранный файл неверен
@@ -1646,13 +1646,13 @@ Press 1 for Default View
Экспортируется файл %1 из %2
-
+
Все файлы профиля (*.g5e SGTA* PGTA*)
-
+
GTA V Export (*.g5e)
@@ -1660,17 +1660,17 @@ Press 1 for Default View
QApplication
-
+
Шрифт
-
+
Выбранный шрифт: %1
-
+
<h4>Добро пожаловать в %1!</h4>Хочешь изменить настройки %1 перед использованием?
@@ -2249,22 +2249,22 @@ Press 1 for Default View
TelemetryDialog
-
+
Разрешишь нам собирать статистику о пользовании тобой %1? Это поможет нам в разработке.
-
+
%1 Пользовательская статистика
-
+
Да, передавать данные о пользовании программой.
-
+
&ОК
@@ -2339,7 +2339,7 @@ Press 1 for Default View
-
+
Выбрать &папку GTA V...
@@ -2375,6 +2375,7 @@ Press 1 for Default View
+
&Закрыть
@@ -2414,51 +2415,56 @@ Press 1 for Default View
&Открыть файл...
-
-
-
+
+
+
Выбор профиля
-
-
+
+
Выбрать папку GTA V...
-
+
%2 - %1
-
-
+
+
&О программе %1
-
+
Открыть файл...
-
-
-
-
+
+
+
+
Открыть файл
-
+
Не удалось открыть %1 из-за неверного формата файла
+
+
+
+
+
diff --git a/res/gta5sync_uk.ts b/res/gta5sync_uk.ts
index 2115c75..fda1d75 100644
--- a/res/gta5sync_uk.ts
+++ b/res/gta5sync_uk.ts
@@ -1337,7 +1337,7 @@ Press 1 for Default View
-
+
Усі файли (**)
@@ -1382,26 +1382,26 @@ Press 1 for Default View
-
+
GTA V Export (*.g5e)
-
+
Файли збереження гри (SGTA*)
-
+
Snapmatic зображення (PGTA*)
-
+
Вибрані недійсні файли
@@ -1422,13 +1422,13 @@ Press 1 for Default View
-
+
Не вдалося прочитати Snapmatic картинку
-
+
Не вдалося прочитати файл збереження гри
@@ -1642,7 +1642,7 @@ Press 1 for Default View
Змінити назву
-
+
Усі файли зображень (*.g5e SGTA* PGTA*)
@@ -1650,17 +1650,17 @@ Press 1 for Default View
QApplication
-
+
Шрифт
-
+
Вибраний шрифт:%1
-
+
<h4>Ласкаво просимо до %1!</h4>Ви хочете налаштувати %1 перед використанням?
@@ -2239,22 +2239,22 @@ Press 1 for Default View
TelemetryDialog
-
+
Ви хочете допомогти %1 покращитись у майбутньому, включивши дані особистого користування?
-
+
%1 Статистика користувачів
-
+
Так, я хочу включити дані особистого користування.
-
+
&OK
&OK
@@ -2264,7 +2264,7 @@ Press 1 for Default View
UserInterface
-
+
%2 - %1
@@ -2296,6 +2296,7 @@ Press 1 for Default View
+
&Закрити
@@ -2331,8 +2332,8 @@ Press 1 for Default View
-
-
+
+
&Про %1
@@ -2388,15 +2389,15 @@ Press 1 for Default View
-
+
Вибрати >A V теку...
-
-
+
+
Вибрати GTA V теку...
@@ -2445,29 +2446,34 @@ Press 1 for Default View
Сховати у грі
-
-
-
+
+
+
Вибрати профіль
-
+
Відкрити файл...
-
-
-
-
+
+
+
+
Відкрити файл
-
+
Неможливо відкрити %1 через невідомий формат файлу
+
+
+
+
+
diff --git a/res/gta5sync_zh_TW.ts b/res/gta5sync_zh_TW.ts
index 670f5ff..20b79d4 100644
--- a/res/gta5sync_zh_TW.ts
+++ b/res/gta5sync_zh_TW.ts
@@ -1331,7 +1331,7 @@ Press 1 for Default View
-
+
所有檔案 (**)
@@ -1376,26 +1376,26 @@ Press 1 for Default View
-
+
GTA V Export (*.g5e)
-
+
遊戲存檔 (SGTA*)
-
+
Snapmatic 圖片 (PGTA*)
-
+
沒有選擇有效的檔案
@@ -1414,13 +1414,13 @@ Press 1 for Default View
-
+
無法讀取 Snapmatic 圖片
-
+
無法讀取遊戲存檔
@@ -1632,7 +1632,7 @@ Press 1 for Default View
更改標題
-
+
所有設定檔檔案 (*.g5e SGTA* PGTA*)
@@ -1640,17 +1640,17 @@ Press 1 for Default View
QApplication
-
+
字體
-
+
選擇的字體: %1
-
+
<h4>歡迎使用 %1!</h4> 你想在開始前先設定 %1 嗎?
@@ -2229,22 +2229,22 @@ Press 1 for Default View
TelemetryDialog
-
+
你希望通過收集資料來幫助改善 %1 嗎?
-
+
%1 使用者統計
-
+
是的,我想幫忙.
-
+
確定(&O)
@@ -2253,7 +2253,7 @@ Press 1 for Default View
UserInterface
-
+
%2 - %1
@@ -2285,6 +2285,7 @@ Press 1 for Default View
+
關閉(&C)
@@ -2320,8 +2321,8 @@ Press 1 for Default View
-
-
+
+
關於 %1(&A)
@@ -2377,15 +2378,15 @@ Press 1 for Default View
-
+
選擇 GTA V 資料夾(&G)...
-
-
+
+
選擇 GTA V 資料夾...
@@ -2434,29 +2435,34 @@ Press 1 for Default View
在遊戲中隱藏
-
-
-
+
+
+
選擇設定檔
-
+
開啟檔案...
-
-
-
-
+
+
+
+
開啟檔案
-
+
格式無效,無法開啟 %1
+
+
+
+
+