latest changes from gta5sync

1.5.x
Syping 2017-10-12 22:21:45 +02:00
parent cfdc36d207
commit 4169e86f31
28 changed files with 943 additions and 773 deletions

View File

@ -31,7 +31,7 @@ CrewDatabase::CrewDatabase(QObject *parent) : QObject(parent)
dir.mkpath(StandardPaths::dataLocation());
dir.setPath(StandardPaths::dataLocation());
QString dirPath = dir.absolutePath();
QString defaultConfPath = dirPath % QDir::separator() % "crews.ini";
QString defaultConfPath = dirPath % "/crews.ini";
QSettings confPathSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
confPathSettings.beginGroup("Database");

View File

@ -171,17 +171,17 @@ void OptionsDialog::setupRadioButtons()
if (contentModeOk)
{
if (contentMode == 0)
switch (contentMode)
{
case 0:
ui->rbOpenWithSC->setChecked(true);
}
else if (contentMode == 1)
{
break;
case 1:
ui->rbOpenWithDC->setChecked(true);
}
else if (contentMode == 2)
{
break;
case 2:
ui->rbSelectWithSC->setChecked(true);
break;
}
}
}
@ -267,11 +267,7 @@ void OptionsDialog::applySettings()
TCInstance->loadTranslation(qApp);
}
#if QT_VERSION >= 0x050000
emit settingsApplied(newContentMode, ui->cbLanguage->currentData().toString());
#else
emit settingsApplied(newContentMode, ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()).toString());
#endif
emit settingsApplied(newContentMode, languageChanged);
if ((forceCustomFolder && ui->txtFolder->text() != currentCFolder) || (forceCustomFolder != currentFFolder && forceCustomFolder))
{

View File

@ -48,7 +48,7 @@ private slots:
void on_cmdExploreFolder_clicked();
signals:
void settingsApplied(int contentMode, QString language);
void settingsApplied(int contentMode, bool languageChanged);
private:
ProfileDatabase *profileDB;

View File

@ -30,6 +30,10 @@
#include <QRegExp>
#include <QDebug>
#if QT_VERSION >= 0x050000
#include <QSaveFile>
#endif
PictureExport::PictureExport()
{
@ -76,6 +80,7 @@ void PictureExport::exportAsPicture(QWidget *parent, SnapmaticPicture *picture)
// End Picture Settings
settings.beginGroup("FileDialogs");
bool dontUseNativeDialog = settings.value("DontUseNativeDialog", false).toBool();
settings.beginGroup("ExportAsPicture");
fileDialogPreSave: //Work?
@ -83,7 +88,7 @@ fileDialogPreSave: //Work?
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setViewMode(QFileDialog::Detail);
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
fileDialog.setDefaultSuffix("suffix");
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
@ -99,7 +104,7 @@ fileDialogPreSave: //Work?
fileDialog.setSidebarUrls(sidebarUrls);
fileDialog.setDirectory(settings.value("Directory", StandardPaths::picturesLocation()).toString());
fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geomtery", "").toByteArray());
fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geometry", "").toByteArray());
QString newPictureFileName = getPictureFileName(picture) % defaultExportFormat;
fileDialog.selectFile(newPictureFileName);
@ -142,15 +147,7 @@ fileDialogPreSave: //Work?
if (QFile::exists(selectedFile))
{
if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
{
if (!QFile::remove(selectedFile))
{
QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
goto fileDialogPreSave; //Work?
}
}
else
if (QMessageBox::No == QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
{
goto fileDialogPreSave; //Work?
}
@ -168,19 +165,51 @@ fileDialogPreSave: //Work?
exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
}
bool isSaved;
if (useCustomQuality)
int errorId = 0;
bool isSaved = false;
#if QT_VERSION >= 0x050000
QSaveFile *picFile = new QSaveFile(selectedFile);
#else
QFile *picFile = new QFile(selectedFile);
#endif
if (picFile->open(QIODevice::WriteOnly))
{
isSaved = exportPicture.save(selectedFile, saveFileFormat.toStdString().c_str(), customQuality);
isSaved = exportPicture.save(picFile, saveFileFormat.toStdString().c_str(), useCustomQuality ? customQuality : defaultQuality);
#if QT_VERSION >= 0x050000
if (isSaved)
{
isSaved = picFile->commit();
}
else
{
errorId = 1;
}
#else
picFile->close();
#endif
}
else
{
isSaved = exportPicture.save(selectedFile, saveFileFormat.toStdString().c_str(), 100);
errorId = 2;
}
delete picFile;
if (!isSaved)
{
QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to export current Snapmatic picture"));
switch (errorId)
{
case 0:
QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to export the picture because the system occurred a write failure"));
break;
case 1:
QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to export the picture because the format detection failures"));
break;
case 2:
QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to export the picture because the file can't be written"));
break;
default:
QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to export the picture because of an unknown reason"));
}
goto fileDialogPreSave; //Work?
}
}
@ -201,13 +230,10 @@ void PictureExport::exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("FileDialogs");
bool dontUseNativeDialog = settings.value("DontUseNativeDialog", false).toBool();
settings.beginGroup("ExportAsSnapmatic");
QString adjustedPicPath = picture->getPictureFileName();
if (adjustedPicPath.right(7) == ".hidden") // for the hidden file system
{
adjustedPicPath.remove(adjustedPicPath.length() - 7, 7);
}
QString adjustedPicPath = picture->getOriginalPictureFileName();
fileDialogPreSave: //Work?
QFileInfo sgdFileInfo(adjustedPicPath);
@ -215,7 +241,7 @@ fileDialogPreSave: //Work?
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setViewMode(QFileDialog::Detail);
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
fileDialog.setDefaultSuffix(".rem");
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
@ -232,9 +258,8 @@ fileDialogPreSave: //Work?
fileDialog.setSidebarUrls(sidebarUrls);
fileDialog.setDirectory(settings.value("Directory", StandardPaths::documentsLocation()).toString());
fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geometry", "").toByteArray());
fileDialog.selectFile(QString(picture->getExportPictureFileName() % ".g5e"));
fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geomtery", "").toByteArray());
if (fileDialog.exec())
{
@ -257,15 +282,7 @@ fileDialogPreSave: //Work?
if (QFile::exists(selectedFile))
{
if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
{
if (!QFile::remove(selectedFile))
{
QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
goto fileDialogPreSave; //Work?
}
}
else
if (QMessageBox::No == QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
{
goto fileDialogPreSave; //Work?
}

View File

@ -31,7 +31,7 @@ ProfileDatabase::ProfileDatabase(QObject *parent) : QObject(parent)
dir.mkpath(StandardPaths::dataLocation());
dir.setPath(StandardPaths::dataLocation());
QString dirPath = dir.absolutePath();
QString defaultConfPath = dirPath % QDir::separator() % "players.ini";
QString defaultConfPath = dirPath % "/players.ini";
QSettings confPathSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
confPathSettings.beginGroup("Database");

View File

@ -414,6 +414,7 @@ void ProfileInterface::on_cmdImport_clicked()
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("FileDialogs");
bool dontUseNativeDialog = settings.value("DontUseNativeDialog", false).toBool();
settings.beginGroup("ImportCopy");
fileDialogPreOpen: //Work?
@ -421,7 +422,7 @@ fileDialogPreOpen: //Work?
fileDialog.setFileMode(QFileDialog::ExistingFiles);
fileDialog.setViewMode(QFileDialog::Detail);
fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
fileDialog.setWindowTitle(tr("Import..."));
fileDialog.setLabelText(QFileDialog::Accept, tr("Import"));
@ -634,16 +635,16 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
SnapmaticProperties spJson = picture->getSnapmaticProperties();
spJson.uid = QString(currentTime +
QString::number(QDate::currentDate().dayOfYear())).toInt();
bool fExists = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid));
bool fExistsHidden = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid) % ".hidden");
bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid));
bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden");
int cEnough = 0;
while ((fExists || fExistsHidden) && cEnough < 5000)
{
currentTime = QString::number(currentTime.toInt() - 1);
spJson.uid = QString(currentTime +
QString::number(QDate::currentDate().dayOfYear())).toInt();
fExists = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid));
fExistsHidden = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid) % ".hidden");
fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid));
fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden");
cEnough++;
}
spJson.createdDateTime = QDateTime::currentDateTime();
@ -689,16 +690,16 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
SnapmaticProperties spJson = picture->getSnapmaticProperties();
spJson.uid = QString(currentTime +
QString::number(QDate::currentDate().dayOfYear())).toInt();
bool fExists = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid));
bool fExistsHidden = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid) % ".hidden");
bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid));
bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden");
int cEnough = 0;
while ((fExists || fExistsHidden) && cEnough < 25)
{
currentTime = QString::number(currentTime.toInt() - 1);
spJson.uid = QString(currentTime +
QString::number(QDate::currentDate().dayOfYear())).toInt();
fExists = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid));
fExistsHidden = QFile::exists(profileFolder % QDir::separator() % "PGTA5" % QString::number(spJson.uid) % ".hidden");
fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid));
fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden");
cEnough++;
}
spJson.createdDateTime = QDateTime::currentDateTime();
@ -764,28 +765,20 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool warn)
{
QString picFileName = picture->getPictureFileName();
QString adjustedFileName = picFileName;
if (adjustedFileName.right(7) == ".hidden") // for the hidden file system
{
adjustedFileName.remove(adjustedFileName.length() - 7, 7);
}
if (adjustedFileName.right(4) == ".bak") // for the backup file system
{
adjustedFileName.remove(adjustedFileName.length() - 4, 4);
}
QString adjustedFileName = picture->getOriginalPictureFileName();
if (picFileName.left(4) != "PGTA")
{
if (warn) QMessageBox::warning(this, tr("Import"), tr("Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e"));
return false;
}
else if (QFile::exists(profileFolder % QDir::separator() % adjustedFileName) || QFile::exists(profileFolder % QDir::separator() % adjustedFileName % ".hidden"))
else if (QFile::exists(profileFolder % "/" % adjustedFileName) || QFile::exists(profileFolder % "/" % adjustedFileName % ".hidden"))
{
if (warn) QMessageBox::warning(this, tr("Import"), tr("Failed to import the Snapmatic picture, the picture is already in the game"));
return false;
}
else if (picture->exportPicture(profileFolder % QDir::separator() % adjustedFileName, SnapmaticFormat::PGTA_Format))
else if (picture->exportPicture(profileFolder % "/" % adjustedFileName, SnapmaticFormat::PGTA_Format))
{
picture->setPicFilePath(profileFolder % QDir::separator() % adjustedFileName);
picture->setPicFilePath(profileFolder % "/" % adjustedFileName);
pictureLoaded(picture, true);
return true;
}
@ -811,7 +804,7 @@ bool ProfileInterface::importSavegameData(SavegameData *savegame, QString sgdPat
}
sgdFileName = "SGTA500" % sgdNumber;
if (!QFile::exists(profileFolder % QDir::separator() % sgdFileName))
if (!QFile::exists(profileFolder % "/" % sgdFileName))
{
foundFree = true;
}
@ -820,10 +813,10 @@ bool ProfileInterface::importSavegameData(SavegameData *savegame, QString sgdPat
if (foundFree)
{
if (QFile::copy(sgdPath, profileFolder % QDir::separator() % sgdFileName))
if (QFile::copy(sgdPath, profileFolder % "/" % sgdFileName))
{
savegame->setSavegameFileName(profileFolder % QDir::separator() % sgdFileName);
savegameLoaded(savegame, profileFolder % QDir::separator() % sgdFileName, true);
savegame->setSavegameFileName(profileFolder % "/" % sgdFileName);
savegameLoaded(savegame, profileFolder % "/" % sgdFileName, true);
return true;
}
else
@ -896,6 +889,7 @@ void ProfileInterface::exportSelected()
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("FileDialogs");
//bool dontUseNativeDialog = settings.value("DontUseNativeDialog", false).toBool();
settings.beginGroup("ExportDirectory");
QString exportDirectory = QFileDialog::getExistingDirectory(this, tr("Export selected"), settings.value(profileName, profileFolder).toString());
if (exportDirectory != "")
@ -1085,24 +1079,17 @@ void ProfileInterface::importFiles()
on_cmdImport_clicked();
}
void ProfileInterface::settingsApplied(int _contentMode, QString _language)
void ProfileInterface::settingsApplied(int _contentMode, bool languageChanged)
{
bool translationUpdated = false;
if (language != _language)
{
retranslateUi();
language = _language;
translationUpdated = true;
}
if (languageChanged) retranslateUi();
contentMode = _contentMode;
if (contentMode == 2)
{
foreach(ProfileWidget *widget, widgets.keys())
{
widget->setSelectionMode(true);
widget->setContentMode(contentMode);
if (translationUpdated) widget->retranslate();
if (languageChanged) widget->retranslate();
}
}
else
@ -1114,7 +1101,7 @@ void ProfileInterface::settingsApplied(int _contentMode, QString _language)
widget->setSelectionMode(false);
}
widget->setContentMode(contentMode);
if (translationUpdated) widget->retranslate();
if (languageChanged) widget->retranslate();
}
}
}
@ -1184,10 +1171,10 @@ void ProfileInterface::contextMenuTriggeredPIC(QContextMenuEvent *ev)
{
editMenu.addAction(SnapmaticWidget::tr("Hide &In-game"), picWidget, SLOT(makePictureHiddenSlot()));
}
editMenu.addAction(SnapmaticWidget::tr("&Edit Properties..."), picWidget, SLOT(editSnapmaticProperties()));
editMenu.addAction(PictureDialog::tr("&Edit Properties..."), picWidget, SLOT(editSnapmaticProperties()));
QMenu exportMenu(SnapmaticWidget::tr("&Export"), this);
exportMenu.addAction(SnapmaticWidget::tr("Export as &Picture..."), picWidget, SLOT(on_cmdExport_clicked()));
exportMenu.addAction(SnapmaticWidget::tr("Export as &Snapmatic..."), picWidget, SLOT(on_cmdCopy_clicked()));
exportMenu.addAction(PictureDialog::tr("Export as &Picture..."), picWidget, SLOT(on_cmdExport_clicked()));
exportMenu.addAction(PictureDialog::tr("Export as &Snapmatic..."), picWidget, SLOT(on_cmdCopy_clicked()));
contextMenu.addAction(SnapmaticWidget::tr("&View"), picWidget, SLOT(on_cmdView_clicked()));
contextMenu.addMenu(&editMenu);
contextMenu.addMenu(&exportMenu);

View File

@ -45,7 +45,7 @@ class ProfileInterface : public QWidget
public:
explicit ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
void setProfileFolder(QString folder, QString profile);
void settingsApplied(int contentMode, QString language);
void settingsApplied(int contentMode, bool languageChanged);
void setupProfileInterface();
void disableSelected();
void enableSelected();

View File

@ -23,6 +23,8 @@
#include <QStringBuilder>
#include <QStringList>
#include <QString>
#include <QThread>
#include <QList>
#include <QFile>
#include <QDir>
@ -61,7 +63,7 @@ void ProfileLoader::run()
foreach(const QString &SavegameFile, SavegameFiles)
{
emit loadingProgress(curFile, maximumV);
QString sgdPath = profileFolder % QDir::separator() % SavegameFile;
QString sgdPath = profileFolder % "/" % SavegameFile;
SavegameData *savegame = new SavegameData(sgdPath);
if (savegame->readingSavegame())
{
@ -72,7 +74,7 @@ void ProfileLoader::run()
foreach(const QString &SnapmaticPic, SnapmaticPics)
{
emit loadingProgress(curFile, maximumV);
QString picturePath = profileFolder % QDir::separator() % SnapmaticPic;
QString picturePath = profileFolder % "/" % SnapmaticPic;
SnapmaticPicture *picture = new SnapmaticPicture(picturePath);
if (picture->readingPicture(true, true, true))
{

View File

@ -18,8 +18,10 @@
#include "SidebarGenerator.h"
#include "SavegameWidget.h"
#include "StandardPaths.h"
#include "SavegameCopy.h"
#include "config.h"
#include <QStringBuilder>
#include <QMessageBox>
#include <QFileDialog>
#include <QSettings>
@ -32,7 +34,10 @@ SavegameCopy::SavegameCopy()
void SavegameCopy::copySavegame(QWidget *parent, QString sgdPath)
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("FileDialogs");
bool dontUseNativeDialog = settings.value("DontUseNativeDialog", false).toBool();
settings.beginGroup("SavegameCopy");
fileDialogPreSave: //Work?
QFileInfo sgdFileInfo(sgdPath);
@ -40,7 +45,7 @@ fileDialogPreSave: //Work?
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setViewMode(QFileDialog::Detail);
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
fileDialog.setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
fileDialog.setDefaultSuffix("");
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
@ -55,7 +60,8 @@ fileDialogPreSave: //Work?
QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
fileDialog.setSidebarUrls(sidebarUrls);
fileDialog.restoreState(settings.value("CopySavegame","").toByteArray());
fileDialog.setDirectory(settings.value("Directory", StandardPaths::picturesLocation()).toString());
fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geometry", "").toByteArray());
fileDialog.selectFile(sgdFileInfo.fileName());
if (fileDialog.exec())
@ -95,6 +101,8 @@ fileDialogPreSave: //Work?
}
}
settings.setValue("CopySavegame", fileDialog.saveState());
settings.setValue(parent->objectName() % "+Geometry", fileDialog.saveGeometry());
settings.setValue("Directory", fileDialog.directory().absolutePath());
settings.endGroup();
settings.endGroup();
}

View File

@ -128,7 +128,7 @@ void SavegameWidget::on_cmdCopy_clicked()
void SavegameWidget::on_cmdDelete_clicked()
{
int uchoice = QMessageBox::question(this, tr("Delete savegame"), tr("Are you sure to delete %1 from your savegames?").arg("\""+sgdStr+"\""), QMessageBox::No | QMessageBox::Yes, QMessageBox::No);
int uchoice = QMessageBox::question(this, tr("Delete Savegame"), tr("Are you sure to delete %1 from your savegames?").arg("\""+sgdStr+"\""), QMessageBox::No | QMessageBox::Yes, QMessageBox::No);
if (uchoice == QMessageBox::Yes)
{
if (!QFile::exists(sgdPath))
@ -141,7 +141,7 @@ void SavegameWidget::on_cmdDelete_clicked()
}
else
{
QMessageBox::warning(this, tr("Delete savegame"), tr("Failed at deleting %1 from your savegames").arg("\""+sgdStr+"\""));
QMessageBox::warning(this, tr("Delete Savegame"), tr("Failed at deleting %1 from your savegames").arg("\""+sgdStr+"\""));
}
}
}

View File

@ -225,22 +225,18 @@ void SnapmaticEditor::on_cmdApply_clicked()
localSpJson.isMeme = ui->cbMeme->isChecked();
if (smpic)
{
QString originalFileName = smpic->getPictureFilePath();
QString adjustedFileName = originalFileName;
if (adjustedFileName.right(7) == ".hidden") // for the hidden file system
{
adjustedFileName.remove(adjustedFileName.length() - 7, 7);
}
QString backupFileName = adjustedFileName % ".bak";
QString currentFilePath = smpic->getPictureFilePath();
QString originalFilePath = smpic->getOriginalPictureFilePath();
QString backupFileName = originalFilePath % ".bak";
if (!QFile::exists(backupFileName))
{
QFile::copy(adjustedFileName, backupFileName);
QFile::copy(currentFilePath, backupFileName);
}
SnapmaticProperties fallbackProperties = smpic->getSnapmaticProperties();
QString fallbackTitle = smpic->getPictureTitle();
smpic->setSnapmaticProperties(localSpJson);
smpic->setPictureTitle(snapmaticTitle);
if (!smpic->exportPicture(originalFileName))
if (!smpic->exportPicture(currentFilePath))
{
QMessageBox::warning(this, tr("Snapmatic Properties"), tr("Patching of Snapmatic Properties failed because of I/O Error"));
smpic->setSnapmaticProperties(fallbackProperties);

View File

@ -33,6 +33,12 @@
#include <QSize>
#include <QFile>
#if QT_VERSION >= 0x050000
#include <QSaveFile>
#else
#include "StandardPaths.h"
#endif
// PARSER ALLOCATIONS
#define snapmaticHeaderLength 278
#define snapmaticUsefulLength 260
@ -546,6 +552,34 @@ QString SnapmaticPicture::getExportPictureFileName()
return picExportFileName;
}
QString SnapmaticPicture::getOriginalPictureFileName()
{
QString newPicFileName = picFileName;
if (picFileName.right(4) == ".bak")
{
newPicFileName = QString(picFileName).remove(picFileName.length() - 4, 4);
}
if (picFileName.right(7) == ".hidden")
{
newPicFileName = QString(picFileName).remove(picFileName.length() - 7, 7);
}
return newPicFileName;
}
QString SnapmaticPicture::getOriginalPictureFilePath()
{
QString newPicFilePath = picFilePath;
if (picFilePath.right(4) == ".bak")
{
newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 4, 4);
}
if (picFilePath.right(7) == ".hidden")
{
newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 7, 7);
}
return newPicFilePath;
}
QString SnapmaticPicture::getPictureFileName()
{
return picFileName;
@ -887,7 +921,13 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat fo
}
}
QFile *picFile = new QFile(fileName);
bool saveSuccess = false;
bool writeFailure = false;
#if QT_VERSION >= 0x050000
QSaveFile *picFile = new QSaveFile(fileName);
#else
QFile *picFile = new QFile(StandardPaths::tempLocation() % "/" % QFileInfo(fileName).fileName() % ".tmp");
#endif
if (picFile->open(QIODevice::WriteOnly))
{
if (format == SnapmaticFormat::G5E_Format)
@ -913,16 +953,22 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat fo
g5eHeader += QByteArray("FIL"); // Before File Name
g5eHeader += stockFileNameUTF8; // File Name
g5eHeader += QByteArray("COM"); // Before Compressed
picFile->write(g5eHeader);
if (picFile->write(g5eHeader) == -1) { writeFailure = true; }
if (!lowRamMode)
{
picFile->write(qCompress(rawPicContent, 9)); // Compressed Snapmatic
if (picFile->write(qCompress(rawPicContent, 9)) == -1) { writeFailure = true; } // Compressed Snapmatic
}
else
{
picFile->write(rawPicContent);
if (picFile->write(rawPicContent) == -1) { writeFailure = true; }
}
#if QT_VERSION >= 0x050000
if (writeFailure) { picFile->cancelWriting(); }
else { saveSuccess = picFile->commit(); }
#else
if (!writeFailure) { saveSuccess = true; }
picFile->close();
#endif
delete picFile;
}
else if (format == SnapmaticFormat::JPEG_Format)
@ -937,9 +983,15 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat fo
{
jpegRawContent = jpegRawContent.left(jpegRawContentSizeE);
}
picFile->write(jpegRawContent);
if (picFile->write(jpegRawContent) == -1) { writeFailure = true; }
#if QT_VERSION >= 0x050000
if (writeFailure) { picFile->cancelWriting(); }
else { saveSuccess = picFile->commit(); }
#else
if (!writeFailure) { saveSuccess = true; }
picFile->close();
#endif
}
picFile->close();
delete picFile;
}
else
@ -947,21 +999,49 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat fo
// Classic straight export
if (!lowRamMode)
{
picFile->write(rawPicContent);
if (picFile->write(rawPicContent) == -1) { writeFailure = true; }
}
else
{
picFile->write(qUncompress(rawPicContent));
if (picFile->write(qUncompress(rawPicContent)) == -1) { writeFailure = true; }
}
#if QT_VERSION >= 0x050000
if (writeFailure) { picFile->cancelWriting(); }
else { saveSuccess = picFile->commit(); }
#else
if (!writeFailure) { saveSuccess = true; }
picFile->close();
#endif
delete picFile;
}
return true;
#if QT_VERSION <= 0x050000
if (saveSuccess)
{
bool tempBakCreated = false;
if (QFile::exists(fileName))
{
if (!QFile::rename(fileName, fileName % ".tmp"))
{
QFile::remove(StandardPaths::tempLocation() % "/" % QFileInfo(fileName).fileName() % ".tmp");
return false;
}
tempBakCreated = true;
}
if (!QFile::rename(StandardPaths::tempLocation() % "/" % QFileInfo(fileName).fileName() % ".tmp", fileName))
{
QFile::remove(StandardPaths::tempLocation() % "/" % QFileInfo(fileName).fileName() % ".tmp");
if (tempBakCreated) { QFile::rename(fileName % ".tmp", fileName); }
return false;
}
if (tempBakCreated) { QFile::remove(fileName % ".tmp"); }
}
#endif
return saveSuccess;
}
else
{
delete picFile;
return false;
return saveSuccess;
}
}

View File

@ -70,6 +70,8 @@ public:
QString getPictureFileName();
QString getPictureFilePath();
QString getExportPictureFileName();
QString getOriginalPictureFileName();
QString getOriginalPictureFilePath();
int getContentMaxLength();
bool setImage(const QImage &picture);
bool setPictureTitl(const QString &newTitle);

View File

@ -17,12 +17,8 @@
*****************************************************************************/
#include "StringParser.h"
#include "config.h"
#include <QTextDocument>
#include <QLibraryInfo>
#ifndef GTA5VIEW_CMD
#include <QApplication>
#endif
#include <QTextCodec>
#include <QByteArray>
#include <QFileInfo>
@ -30,6 +26,11 @@
#include <QList>
#include <QDir>
#ifdef GTA5SYNC_PROJECT
#include <QApplication>
#include "config.h"
#endif
StringParser::StringParser()
{
@ -46,16 +47,25 @@ QString StringParser::parseTitleString(const QByteArray &commitBytes, int maxLen
QString StringParser::convertDrawStringForLog(const QString &inputStr)
{
QString outputStr = inputStr;
return outputStr.replace("&","&u;").replace(",","&c;");
return outputStr.replace("&","&u;").replace(",", "&c;");
}
QString StringParser::convertLogStringForDraw(const QString &inputStr)
{
QString outputStr = inputStr;
return outputStr.replace("&c;",",").replace("&u;","&");
return outputStr.replace("&c;",",").replace("&u;", "&");
}
#ifndef GTA5VIEW_CMD
QString StringParser::escapeString(const QString &toEscape)
{
#if QT_VERSION >= 0x050000
return toEscape.toHtmlEscaped();
#else
return Qt::escape(toEscape);
#endif
}
#ifdef GTA5SYNC_PROJECT
QString StringParser::convertBuildedString(const QString &buildedStr)
{
QString outputStr = buildedStr;
@ -69,12 +79,3 @@ QString StringParser::convertBuildedString(const QString &buildedStr)
return outputStr;
}
#endif
QString StringParser::escapeString(const QString &toEscape)
{
#if QT_VERSION >= 0x050000
return toEscape.toHtmlEscaped();
#else
return Qt::escape(toEscape);
#endif
}

View File

@ -29,10 +29,10 @@ public:
static QString parseTitleString(const QByteArray &commitBytes, int maxLength);
static QString convertDrawStringForLog(const QString &inputStr);
static QString convertLogStringForDraw(const QString &inputStr);
#ifndef GTA5VIEW_CMD
static QString escapeString(const QString &toEscape);
#ifdef GTA5SYNC_PROJECT
static QString convertBuildedString(const QString &buildedStr);
#endif
static QString escapeString(const QString &toEscape);
};
#endif // STRINGPARSER_H

View File

@ -301,14 +301,14 @@ bool TranslationClass::loadSystemTranslation_p(const QString &langPath, QTransla
if (langList.length() == 2)
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
qDebug() << "loadLanguageFile" << QString(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
#endif
if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
if (QFile::exists(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
{
if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
if (appTranslator->load(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
qDebug() << "loadLanguageFileSuccess" << QString(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
#endif
isEnglishMode = false;
currentLanguage = languageName;
@ -317,14 +317,14 @@ bool TranslationClass::loadSystemTranslation_p(const QString &langPath, QTransla
}
}
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFile" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (QFile::exists(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (appTranslator->load(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFileSuccess" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
isEnglishMode = false;
currentLanguage = languageName;
@ -356,14 +356,14 @@ bool TranslationClass::loadSystemTranslation_p(const QString &langPath, QTransla
else if (langList.length() == 1)
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFile" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (QFile::exists(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (appTranslator->load(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFileSuccess" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
isEnglishMode = false;
currentLanguage = languageName;
@ -390,28 +390,28 @@ bool TranslationClass::loadUserTranslation_p(const QString &langPath, QTranslato
if (langList.length() == 2)
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
qDebug() << "loadLanguageFile" << QString(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
#endif
if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
if (QFile::exists(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
{
if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
if (appTranslator->load(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
qDebug() << "loadLanguageFileSuccess" << QString(langPath % "/gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
#endif
currentLanguage = languageName;
return true;
}
}
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFile" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (QFile::exists(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (appTranslator->load(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFileSuccess" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
currentLanguage = languageName;
return true;
@ -421,14 +421,14 @@ bool TranslationClass::loadUserTranslation_p(const QString &langPath, QTranslato
else if (langList.length() == 1)
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFile" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (QFile::exists(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
if (appTranslator->load(langPath % "/gta5sync_" % langList.at(0) % ".qm"))
{
#ifdef GTA5SYNC_DEBUG
qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
qDebug() << "loadLanguageFileSuccess" << QString(langPath % "/gta5sync_" % langList.at(0) % ".qm");
#endif
currentLanguage = languageName;
return true;

View File

@ -132,7 +132,7 @@ void UserInterface::setupDirEnv()
if (folderExists)
{
QDir GTAV_ProfilesDir;
GTAV_ProfilesFolder = GTAV_Folder % QDir::separator() % "Profiles";
GTAV_ProfilesFolder = GTAV_Folder % "/Profiles";
GTAV_ProfilesDir.setPath(GTAV_ProfilesFolder);
GTAV_Profiles = GTAV_ProfilesDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
@ -213,7 +213,7 @@ void UserInterface::openProfile(const QString &profileName_)
ui->swProfile->addWidget(profileUI);
ui->swProfile->setCurrentWidget(profileUI);
profileUI->setProfileFolder(GTAV_ProfilesFolder % QDir::separator() % profileName, profileName);
profileUI->settingsApplied(contentMode, language);
profileUI->settingsApplied(contentMode, false);
profileUI->setupProfileInterface();
QObject::connect(profileUI, SIGNAL(profileClosed()), this, SLOT(closeProfile()));
QObject::connect(profileUI, SIGNAL(profileLoaded()), this, SLOT(profileLoaded()));
@ -323,7 +323,7 @@ void UserInterface::on_actionOptions_triggered()
OptionsDialog *optionsDialog = new OptionsDialog(profileDB, this);
optionsDialog->setWindowIcon(windowIcon());
optionsDialog->commitProfiles(GTAV_Profiles);
QObject::connect(optionsDialog, SIGNAL(settingsApplied(int, QString)), this, SLOT(settingsApplied(int, QString)));
QObject::connect(optionsDialog, SIGNAL(settingsApplied(int, bool)), this, SLOT(settingsApplied(int, bool)));
optionsDialog->setModal(true);
#ifdef Q_OS_ANDROID
@ -494,17 +494,16 @@ void UserInterface::openSavegameFile(SavegameData *savegame)
sgdDialog.exec();
}
void UserInterface::settingsApplied(int _contentMode, QString _language)
void UserInterface::settingsApplied(int _contentMode, bool languageChanged)
{
if (language != _language)
if (languageChanged)
{
retranslateUi();
language = _language;
}
contentMode = _contentMode;
if (profileOpen)
{
profileUI->settingsApplied(contentMode, language);
profileUI->settingsApplied(contentMode, languageChanged);
}
}

View File

@ -62,7 +62,7 @@ private slots:
void on_actionSelect_GTA_Folder_triggered();
void on_action_Enable_In_game_triggered();
void on_action_Disable_In_game_triggered();
void settingsApplied(int contentMode, QString language);
void settingsApplied(int contentMode, bool languageChanged);
protected:
void closeEvent(QCloseEvent *ev);

View File

@ -1,5 +1,5 @@
/*****************************************************************************
* gta5view Grand Theft Auto V Profile Viewer
* gta5sync GRAND THEFT AUTO V SYNC
* Copyright (C) 2016-2017 Syping
*
* This program is free software: you can redistribute it and/or modify
@ -18,7 +18,6 @@
#ifndef CONFIG_H
#define CONFIG_H
#include <QtGlobal>
#include <QString>
#ifndef GTA5SYNC_APPVENDOR
@ -95,12 +94,12 @@
#ifdef GTA5SYNC_DAILYB
#ifndef GTA5SYNC_BUILDTYPE
#define GTA5SYNC_BUILDTYPE "Daily Build"
#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Daily Build")
#endif
#endif
#ifndef GTA5SYNC_BUILDTYPE
#define GTA5SYNC_BUILDTYPE "Custom"
#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Custom")
#endif
#ifdef GTA5SYNC_QCONF

View File

@ -21,13 +21,10 @@ QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 4): greaterThan(QT_MINOR_VERSION, 1): win32: QT += winextras
DEFINES += GTA5SYNC_DISABLED
DEPLOYMENT.display_name = gta5view
TARGET = gta5view
TEMPLATE = app
DEFINES += GTA5SYNC_CSDF # Not assisting at proper usage of SnapmaticPicture class
HEADERS += config.h
PRECOMPILED_HEADER += config.h
@ -136,6 +133,12 @@ DISTFILES += res/app.rc \
INCLUDEPATH += ./uimod
# GTA5SYNC/GTA5VIEW ONLY
DEFINES += GTA5SYNC_DISABLED
DEFINES += GTA5SYNC_PROJECT # Enable exclusive gta5sync/gta5view functions
DEFINES += GTA5SYNC_CSDF # Not assisting at proper usage of SnapmaticPicture class
# WINDOWS ONLY
win32: DEFINES += GTA5SYNC_WIN

Binary file not shown.

View File

@ -219,35 +219,41 @@ Pictures and Savegames</source>
Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
</message>
<message>
<location filename="../config.h" line="62"/>
<location filename="../config.h" line="61"/>
<source>Release</source>
<translation>Release</translation>
</message>
<message>
<location filename="../config.h" line="68"/>
<location filename="../config.h" line="67"/>
<source>Release Candidate</source>
<translation>Release Candidate</translation>
</message>
<message>
<location filename="../config.h" line="74"/>
<location filename="../config.h" line="73"/>
<location filename="../config.h" line="97"/>
<source>Daily Build</source>
<translation>Daily Build</translation>
</message>
<message>
<location filename="../config.h" line="80"/>
<location filename="../config.h" line="79"/>
<source>Developer</source>
<translation>Entwickler</translation>
</message>
<message>
<location filename="../config.h" line="86"/>
<location filename="../config.h" line="85"/>
<source>Beta</source>
<translation>Beta</translation>
</message>
<message>
<location filename="../config.h" line="92"/>
<location filename="../config.h" line="91"/>
<source>Alpha</source>
<translation>Alpha</translation>
</message>
<message>
<location filename="../config.h" line="102"/>
<source>Custom</source>
<translation>Eigener</translation>
</message>
</context>
<context>
<name>CrewDatabase</name>
@ -667,7 +673,7 @@ Wenn du es als Avatar verwenden möchtest wird es abgetrennt!</translation>
<translation type="vanished">%1 (%2 wenn verfügbar)</translation>
</message>
<message>
<location filename="../OptionsDialog.cpp" line="289"/>
<location filename="../OptionsDialog.cpp" line="274"/>
<source>%1</source>
<comment>%1</comment>
<translation>%1</translation>
@ -693,7 +699,7 @@ Wenn du es als Avatar verwenden möchtest wird es abgetrennt!</translation>
<translation>System</translation>
</message>
<message>
<location filename="../OptionsDialog.cpp" line="289"/>
<location filename="../OptionsDialog.cpp" line="274"/>
<source>The new Custom Folder will initialise after you restart %1.</source>
<translation>Der eigene Ordner wird initialisiert sobald du %1 neugestartet hast.</translation>
</message>
@ -702,15 +708,15 @@ Wenn du es als Avatar verwenden möchtest wird es abgetrennt!</translation>
<translation type="vanished">Die Änderung der Sprache nimmt Effekt sobald du %1 neugestartet hast.</translation>
</message>
<