diff --git a/RagePhoto.cpp b/RagePhoto.cpp index fa5875b..f85e24d 100644 --- a/RagePhoto.cpp +++ b/RagePhoto.cpp @@ -22,6 +22,13 @@ #include #include +RagePhoto::RagePhoto() +{ + p_photoFormat = PhotoFormat::Undefined; + p_isLoaded = false; + p_inputMode = -1; +} + RagePhoto::RagePhoto(const QByteArray &data) : p_fileData(data) { p_photoFormat = PhotoFormat::Undefined; @@ -50,6 +57,9 @@ bool RagePhoto::isLoaded() bool RagePhoto::load() { + if (p_inputMode == -1) + return false; + if (p_isLoaded) clear(); @@ -71,11 +81,11 @@ bool RagePhoto::load() QBuffer dataBuffer(&p_fileData); dataBuffer.open(QIODevice::ReadOnly); - char formatHeader[4]; - qint64 size = dataBuffer.read(formatHeader, 4); + char uInt32Buffer[4]; + qint64 size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - quint32 format = charToUInt32LE(formatHeader); + quint32 format = charToUInt32LE(uInt32Buffer); if (format == static_cast(PhotoFormat::GTA5)) { char photoHeader[256]; @@ -88,54 +98,47 @@ bool RagePhoto::load() p_photoString += photoChar; } - char checksum[4]; - size = dataBuffer.read(checksum, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_headerSum = charToUInt32LE(checksum); + p_headerSum = charToUInt32LE(uInt32Buffer); - char endOfFile[4]; - size = dataBuffer.read(endOfFile, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_endOfFile = charToUInt32LE(endOfFile); + p_endOfFile = charToUInt32LE(uInt32Buffer); - char jsonOffset[4]; - size = dataBuffer.read(jsonOffset, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_jsonOffset = charToUInt32LE(jsonOffset); + p_jsonOffset = charToUInt32LE(uInt32Buffer); - char titleOffset[4]; - size = dataBuffer.read(titleOffset, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_titlOffset = charToUInt32LE(titleOffset); + p_titlOffset = charToUInt32LE(uInt32Buffer); - char descOffset[4]; - size = dataBuffer.read(descOffset, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_descOffset = charToUInt32LE(descOffset); + p_descOffset = charToUInt32LE(uInt32Buffer); - char jpegMarker[4]; - size = dataBuffer.read(jpegMarker, 4); + char markerBuffer[4]; + size = dataBuffer.read(markerBuffer, 4); if (size != 4) return false; - if (strncmp(jpegMarker, "JPEG", 4) != 0) + if (strncmp(markerBuffer, "JPEG", 4) != 0) return false; - char jpegBuffer[4]; - size = dataBuffer.read(jpegBuffer, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_jpegBuffer = charToUInt32LE(jpegBuffer); + p_photoBuffer = charToUInt32LE(uInt32Buffer); - char photoSize[4]; - size = dataBuffer.read(photoSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - quint32 t_photoSize = charToUInt32LE(photoSize); + quint32 t_photoSize = charToUInt32LE(uInt32Buffer); char photoData[t_photoSize]; size = dataBuffer.read(photoData, t_photoSize); @@ -144,24 +147,22 @@ bool RagePhoto::load() p_photoData = QByteArray(photoData, t_photoSize); dataBuffer.seek(p_jsonOffset + 264); - char jsonMarker[4]; - size = dataBuffer.read(jsonMarker, 4); + size = dataBuffer.read(markerBuffer, 4); if (size != 4) return false; - if (strncmp(jsonMarker, "JSON", 4) != 0) + if (strncmp(markerBuffer, "JSON", 4) != 0) return false; - char jsonSize[4]; - size = dataBuffer.read(jsonSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_jsonSize = charToUInt32LE(jsonSize); + p_jsonBuffer = charToUInt32LE(uInt32Buffer); - char jsonBytes[p_jsonSize]; - size = dataBuffer.read(jsonBytes, p_jsonSize); - if (size != p_jsonSize) + char jsonBytes[p_jsonBuffer]; + size = dataBuffer.read(jsonBytes, p_jsonBuffer); + if (size != p_jsonBuffer) return false; - for (quint32 i = 0; i != p_jsonSize; i++) { + for (quint32 i = 0; i != p_jsonBuffer; i++) { if (jsonBytes[i] == '\x00') break; p_jsonData += jsonBytes[i]; @@ -172,59 +173,54 @@ bool RagePhoto::load() p_jsonObject = t_jsonDocument.object(); dataBuffer.seek(p_titlOffset + 264); - char titlMarker[4]; - size = dataBuffer.read(titlMarker, 4); + size = dataBuffer.read(markerBuffer, 4); if (size != 4) return false; - if (strncmp(titlMarker, "TITL", 4) != 0) + if (strncmp(markerBuffer, "TITL", 4) != 0) return false; - char titlSize[4]; - size = dataBuffer.read(titlSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_titlSize = charToUInt32LE(titlSize); + p_titlBuffer = charToUInt32LE(uInt32Buffer); - char titlBytes[p_titlSize]; - size = dataBuffer.read(titlBytes, p_titlSize); - if (size != p_titlSize) + char titlBytes[p_titlBuffer]; + size = dataBuffer.read(titlBytes, p_titlBuffer); + if (size != p_titlBuffer) return false; - for (const QChar &titlChar : QString::fromUtf8(titlBytes, p_titlSize)) { + for (const QChar &titlChar : QString::fromUtf8(titlBytes, p_titlBuffer)) { if (titlChar.isNull()) break; p_titleString += titlChar; } dataBuffer.seek(p_descOffset + 264); - char descMarker[4]; - size = dataBuffer.read(descMarker, 4); + size = dataBuffer.read(markerBuffer, 4); if (size != 4) return false; - if (strncmp(descMarker, "DESC", 4) != 0) + if (strncmp(markerBuffer, "DESC", 4) != 0) return false; - char descSize[4]; - size = dataBuffer.read(descSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_descSize = charToUInt32LE(descSize); + p_descBuffer = charToUInt32LE(uInt32Buffer); - char descBytes[p_descSize]; - size = dataBuffer.read(descBytes, p_descSize); - if (size != p_descSize) + char descBytes[p_descBuffer]; + size = dataBuffer.read(descBytes, p_descBuffer); + if (size != p_descBuffer) return false; - for (const QChar &descChar : QString::fromUtf8(descBytes, p_descSize)) { + for (const QChar &descChar : QString::fromUtf8(descBytes, p_descBuffer)) { if (descChar.isNull()) break; p_descriptionString += descChar; } dataBuffer.seek(p_endOfFile + 260); - char jendMarker[4]; - size = dataBuffer.read(jendMarker, 4); + size = dataBuffer.read(markerBuffer, 4); if (size != 4) return false; - if (strncmp(jendMarker, "JEND", 4) != 0) + if (strncmp(markerBuffer, "JEND", 4) != 0) return false; if (p_photoFormat != PhotoFormat::G5EX) @@ -235,119 +231,126 @@ bool RagePhoto::load() return true; } else if (format == static_cast(PhotoFormat::G5EX)) { - char formatHeader[4]; - size = dataBuffer.read(formatHeader, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - quint32 format = charToUInt32LE(formatHeader); + format = charToUInt32LE(uInt32Buffer); if (format == static_cast(ExportFormat::G5E3P)) { - char photoHeaderSize[4]; - size = dataBuffer.peek(photoHeaderSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - quint32 i_photoHeaderSize = charToUInt32BE(photoHeaderSize) + 4; + quint32 compressedSize = charToUInt32LE(uInt32Buffer); - char compressedPhotoHeader[i_photoHeaderSize]; - size = dataBuffer.read(compressedPhotoHeader, i_photoHeaderSize); - if (size != i_photoHeaderSize) + char compressedPhotoHeader[compressedSize]; + size = dataBuffer.read(compressedPhotoHeader, compressedSize); + if (size != compressedSize) return false; - QByteArray t_photoHeaderBytes = QByteArray::fromRawData(compressedPhotoHeader, i_photoHeaderSize); - t_photoHeaderBytes = qUncompress(t_photoHeaderBytes); - p_photoString = QString::fromUtf8(t_photoHeaderBytes); + QByteArray t_photoHeader = QByteArray::fromRawData(compressedPhotoHeader, compressedSize); + t_photoHeader = qUncompress(t_photoHeader); + if (t_photoHeader.isEmpty()) + return false; + p_photoString = QString::fromUtf8(t_photoHeader); - char checksum[4]; - size = dataBuffer.read(checksum, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_headerSum = charToUInt32LE(checksum); + p_headerSum = charToUInt32LE(uInt32Buffer); - char jpegBuffer[4]; - size = dataBuffer.read(jpegBuffer, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_jpegBuffer = charToUInt32LE(jpegBuffer); + p_photoBuffer = charToUInt32LE(uInt32Buffer); - char photoSize[4]; - size = dataBuffer.peek(photoSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - quint32 i_photoSize = charToUInt32BE(photoSize) + 4; + compressedSize = charToUInt32LE(uInt32Buffer); - char compressedPhoto[i_photoSize]; - size = dataBuffer.read(compressedPhoto, i_photoSize); - if (size != i_photoSize) + char compressedPhoto[compressedSize]; + size = dataBuffer.read(compressedPhoto, compressedSize); + if (size != compressedSize) return false; - QByteArray t_photoData = QByteArray::fromRawData(compressedPhoto, i_photoSize); + QByteArray t_photoData = QByteArray::fromRawData(compressedPhoto, compressedSize); p_photoData = qUncompress(t_photoData); - char jsonOffset[4]; - size = dataBuffer.read(jsonOffset, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_jsonOffset = charToUInt32LE(jsonOffset); + p_jsonOffset = charToUInt32LE(uInt32Buffer); - char jsonSize[4]; - size = dataBuffer.peek(jsonSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_jsonSize = charToUInt32BE(jsonSize) + 4; + p_jsonBuffer = charToUInt32LE(uInt32Buffer); - char compressedJson[p_jsonSize]; - size = dataBuffer.read(compressedJson, p_jsonSize); - if (size != p_jsonSize) + size = dataBuffer.read(uInt32Buffer, 4); + if (size != 4) return false; - QByteArray t_jsonBytes = QByteArray::fromRawData(compressedJson, p_jsonSize); + compressedSize = charToUInt32LE(uInt32Buffer); + + char compressedJson[compressedSize]; + size = dataBuffer.read(compressedJson, compressedSize); + if (size != compressedSize) + return false; + QByteArray t_jsonBytes = QByteArray::fromRawData(compressedJson, compressedSize); p_jsonData = qUncompress(t_jsonBytes); + if (p_jsonData.isEmpty()) + return false; QJsonDocument t_jsonDocument = QJsonDocument::fromJson(p_jsonData); if (t_jsonDocument.isNull()) return false; p_jsonObject = t_jsonDocument.object(); - char titleOffset[4]; - size = dataBuffer.read(titleOffset, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_titlOffset = charToUInt32LE(titleOffset); + p_titlOffset = charToUInt32LE(uInt32Buffer); - char titlSize[4]; - size = dataBuffer.peek(titlSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_titlSize = charToUInt32BE(titlSize) + 4; + p_titlBuffer = charToUInt32LE(uInt32Buffer); - char compressedTitl[p_titlSize]; - size = dataBuffer.read(compressedTitl, p_titlSize); - if (size != p_titlSize) + size = dataBuffer.read(uInt32Buffer, 4); + if (size != 4) return false; - QByteArray t_titlBytes = QByteArray::fromRawData(compressedTitl, p_titlSize); + compressedSize = charToUInt32LE(uInt32Buffer); + + char compressedTitl[compressedSize]; + size = dataBuffer.read(compressedTitl, compressedSize); + if (size != compressedSize) + return false; + QByteArray t_titlBytes = QByteArray::fromRawData(compressedTitl, compressedSize); t_titlBytes = qUncompress(t_titlBytes); p_titleString = QString::fromUtf8(t_titlBytes); - char descOffset[4]; - size = dataBuffer.read(descOffset, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_descOffset = charToUInt32LE(descOffset); + p_descOffset = charToUInt32LE(uInt32Buffer); - char descSize[4]; - size = dataBuffer.peek(descSize, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_descSize = charToUInt32BE(descSize) + 4; + p_descBuffer = charToUInt32LE(uInt32Buffer); - char compressedDesc[p_descSize]; - size = dataBuffer.read(compressedDesc, p_descSize); - if (size != p_descSize) + size = dataBuffer.read(uInt32Buffer, 4); + if (size != 4) return false; - QByteArray t_descBytes = QByteArray::fromRawData(compressedDesc, p_descSize); + compressedSize = charToUInt32LE(uInt32Buffer); + + char compressedDesc[compressedSize]; + size = dataBuffer.read(compressedDesc, compressedSize); + if (size != compressedSize) + return false; + QByteArray t_descBytes = QByteArray::fromRawData(compressedDesc, compressedSize); t_descBytes = qUncompress(t_descBytes); p_descriptionString = QString::fromUtf8(t_descBytes); - char endOfFile[4]; - size = dataBuffer.read(endOfFile, 4); + size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) return false; - p_endOfFile = charToUInt32LE(endOfFile); + p_endOfFile = charToUInt32LE(uInt32Buffer); p_photoFormat = PhotoFormat::G5EX; @@ -358,6 +361,8 @@ bool RagePhoto::load() else if (format == static_cast(ExportFormat::G5E2P)) { p_photoFormat = PhotoFormat::G5EX; p_fileData = qUncompress(dataBuffer.readAll()); + if (p_fileData.isEmpty()) + return false; p_inputMode = 0; return load(); } @@ -378,6 +383,8 @@ bool RagePhoto::load() p_photoFormat = PhotoFormat::G5EX; p_fileData = qUncompress(dataBuffer.readAll()); + if (p_fileData.isEmpty()) + return false; p_inputMode = 0; return load(); } @@ -431,15 +438,15 @@ bool RagePhoto::setJsonData(const QByteArray &data) QJsonDocument t_jsonDocument = QJsonDocument::fromJson(data); if (t_jsonDocument.isNull()) return false; + p_jsonData = t_jsonDocument.toJson(QJsonDocument::Compact); p_jsonObject = t_jsonDocument.object(); - p_jsonData = data; return true; } bool RagePhoto::setPhotoData(const QByteArray &data) { quint32 size = data.size(); - if (size > p_jpegBuffer) + if (size > p_photoBuffer) return false; p_photoData = data; return true; @@ -447,7 +454,7 @@ bool RagePhoto::setPhotoData(const QByteArray &data) bool RagePhoto::setPhotoData(const char *data, int size) { - if ((quint32)size > p_jpegBuffer) + if ((quint32)size > p_photoBuffer) return false; p_photoData = QByteArray(data, size); return true; @@ -463,9 +470,17 @@ void RagePhoto::setTitle(const QString &title) p_titleString = title; } -const QByteArray RagePhoto::jsonData() +const QByteArray RagePhoto::jsonData(JsonFormat jsonFormat) { - return p_jsonData; + if (jsonFormat == JsonFormat::Compact) { + return QJsonDocument(p_jsonObject).toJson(QJsonDocument::Compact); + } + else if (jsonFormat == JsonFormat::Indented) { + return QJsonDocument(p_jsonObject).toJson(QJsonDocument::Indented); + } + else { + return p_jsonData; + } } const QJsonObject RagePhoto::jsonObject() @@ -495,7 +510,7 @@ const QString RagePhoto::title() quint32 RagePhoto::photoBuffer() { - return p_jpegBuffer; + return p_photoBuffer; } quint32 RagePhoto::photoSize() @@ -519,11 +534,79 @@ QByteArray RagePhoto::save(PhotoFormat photoFormat) void RagePhoto::save(QIODevice *ioDevice, PhotoFormat photoFormat) { - if (photoFormat == PhotoFormat::GTA5) { - char formatHeader[4]; - quint32 format = (quint32)PhotoFormat::GTA5; - uInt32ToCharLE(&format, formatHeader); - ioDevice->write(formatHeader, 4); + if (photoFormat == PhotoFormat::G5EX) { + char uInt32Buffer[4]; + quint32 format = static_cast(PhotoFormat::G5EX); + uInt32ToCharLE(&format, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + format = static_cast(ExportFormat::G5E3P); + uInt32ToCharLE(&format, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + QByteArray compressedData = qCompress(p_photoString.toUtf8(), 9); + quint32 compressedSize = compressedData.size(); + uInt32ToCharLE(&compressedSize, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + ioDevice->write(compressedData); + + uInt32ToCharLE(&p_headerSum, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + uInt32ToCharLE(&p_photoBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + compressedData = qCompress(p_photoData, 9); + compressedSize = compressedData.size(); + uInt32ToCharLE(&compressedSize, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + ioDevice->write(compressedData); + + uInt32ToCharLE(&p_jsonOffset, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + uInt32ToCharLE(&p_jsonBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + compressedData = qCompress(p_jsonData, 9); + compressedSize = compressedData.size(); + uInt32ToCharLE(&compressedSize, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + ioDevice->write(compressedData); + + uInt32ToCharLE(&p_titlOffset, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + uInt32ToCharLE(&p_titlBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + compressedData = qCompress(p_titleString.toUtf8(), 9); + compressedSize = compressedData.size(); + uInt32ToCharLE(&compressedSize, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + ioDevice->write(compressedData); + + uInt32ToCharLE(&p_descOffset, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + uInt32ToCharLE(&p_descBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + compressedData = qCompress(p_descriptionString.toUtf8(), 9); + compressedSize = compressedData.size(); + uInt32ToCharLE(&compressedSize, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + ioDevice->write(compressedData); + + uInt32ToCharLE(&p_endOfFile, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); + + ioDevice->aboutToClose(); + } + else if (photoFormat == PhotoFormat::GTA5) { + char uInt32Buffer[4]; + quint32 format = static_cast(PhotoFormat::GTA5); + uInt32ToCharLE(&format, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); QByteArray photoHeader = QTextCodec::codecForName("UTF-16LE")->fromUnicode(p_photoString); if (photoHeader.left(2) == "\xFF\xFE") { @@ -539,85 +622,75 @@ void RagePhoto::save(QIODevice *ioDevice, PhotoFormat photoFormat) ioDevice->write("\x00", 1); } - char checksum[4]; - uInt32ToCharLE(&p_headerSum, checksum); - ioDevice->write(checksum, 4); + uInt32ToCharLE(&p_headerSum, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); - char endOfFile[4]; - uInt32ToCharLE(&p_endOfFile, endOfFile); - ioDevice->write(endOfFile, 4); + uInt32ToCharLE(&p_endOfFile, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); - char jsonOffset[4]; - uInt32ToCharLE(&p_jsonOffset, jsonOffset); - ioDevice->write(jsonOffset, 4); + uInt32ToCharLE(&p_jsonOffset, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); - char titlOffset[4]; - uInt32ToCharLE(&p_titlOffset, titlOffset); - ioDevice->write(titlOffset, 4); + uInt32ToCharLE(&p_titlOffset, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); - char descOffset[4]; - uInt32ToCharLE(&p_descOffset, descOffset); - ioDevice->write(descOffset, 4); + uInt32ToCharLE(&p_descOffset, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); - ioDevice->write("JPEG"); + ioDevice->write("JPEG", 4); - char jpegBuffer[4]; - uInt32ToCharLE(&p_jpegBuffer, jpegBuffer); - ioDevice->write(jpegBuffer, 4); + uInt32ToCharLE(&p_photoBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); quint32 t_photoSize = p_photoData.size(); - char photoSize[4]; - uInt32ToCharLE(&t_photoSize, photoSize); - ioDevice->write(photoSize, 4); + uInt32ToCharLE(&t_photoSize, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); ioDevice->write(p_photoData); - for (qint64 size = t_photoSize; size < p_jpegBuffer; size++) { + for (qint64 size = t_photoSize; size < p_photoBuffer; size++) { ioDevice->write("\x00", 1); } ioDevice->seek(p_jsonOffset + 264); - ioDevice->write("JSON"); + ioDevice->write("JSON", 4); - char jsonSize[4]; - uInt32ToCharLE(&p_jsonSize, jsonSize); - ioDevice->write(jsonSize, 4); + uInt32ToCharLE(&p_jsonBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); qint64 dataSize = p_jsonData.size(); ioDevice->write(p_jsonData); - for (qint64 size = dataSize; size < p_jsonSize; size++) { + for (qint64 size = dataSize; size < p_jsonBuffer; size++) { ioDevice->write("\x00", 1); } ioDevice->seek(p_titlOffset + 264); - ioDevice->write("TITL"); + ioDevice->write("TITL", 4); - char titlSize[4]; - uInt32ToCharLE(&p_titlSize, titlSize); - ioDevice->write(titlSize, 4); + uInt32ToCharLE(&p_titlBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); QByteArray data = p_titleString.toUtf8(); dataSize = data.size(); ioDevice->write(data); - for (qint64 size = dataSize; size < p_titlSize; size++) { + for (qint64 size = dataSize; size < p_titlBuffer; size++) { ioDevice->write("\x00", 1); } ioDevice->seek(p_descOffset + 264); - ioDevice->write("DESC"); + ioDevice->write("DESC", 4); - char descSize[4]; - uInt32ToCharLE(&p_descSize, descSize); - ioDevice->write(descSize, 4); + uInt32ToCharLE(&p_descBuffer, uInt32Buffer); + ioDevice->write(uInt32Buffer, 4); data = p_descriptionString.toUtf8(); dataSize = data.size(); ioDevice->write(data); - for (qint64 size = dataSize; size < p_descSize; size++) { + for (qint64 size = dataSize; size < p_descBuffer; size++) { ioDevice->write("\x00", 1); } ioDevice->seek(p_endOfFile + 260); - ioDevice->write("JEND"); + ioDevice->write("JEND", 4); ioDevice->aboutToClose(); } } diff --git a/RagePhoto.h b/RagePhoto.h index 2d49c24..4dc9bef 100644 --- a/RagePhoto.h +++ b/RagePhoto.h @@ -27,6 +27,11 @@ class RagePhoto : public QObject { Q_OBJECT public: + enum class JsonFormat : quint8 { + Original = 0, + Compact = 1, + Indented = 2, + }; enum class ExportFormat : quint32 { G5E1P = 0x454C0010U, G5E2P = 0x01000032U, @@ -41,8 +46,9 @@ public: RDR2 = 0x04000000U, Undefined = 0, }; + explicit RagePhoto(); explicit RagePhoto(const QByteArray &data); - explicit RagePhoto(const QString &filePath = QString()); + explicit RagePhoto(const QString &filePath); explicit RagePhoto(QIODevice *ioDevice); bool isLoaded(); bool load(); @@ -57,7 +63,7 @@ public: void setPhotoFormat(PhotoFormat photoFormat); void setTitle(const QString &title); const QJsonObject jsonObject(); - const QByteArray jsonData(); + const QByteArray jsonData(JsonFormat jsonFormat = JsonFormat::Original); const QByteArray photoData(); const QString description(); const QString photoString(); @@ -84,15 +90,15 @@ private: QString p_filePath; QString p_photoString; QString p_titleString; + quint32 p_descBuffer; quint32 p_descOffset; - quint32 p_descSize; quint32 p_endOfFile; quint32 p_headerSum; - quint32 p_jpegBuffer; + quint32 p_jsonBuffer; quint32 p_jsonOffset; - quint32 p_jsonSize; + quint32 p_photoBuffer; + quint32 p_titlBuffer; quint32 p_titlOffset; - quint32 p_titlSize; bool p_isLoaded; int p_inputMode; }; diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp index b193754..53908d0 100644 --- a/SnapmaticPicture.cpp +++ b/SnapmaticPicture.cpp @@ -188,9 +188,8 @@ bool SnapmaticPicture::setImage(const QImage &picture) picStreamT.open(QIODevice::WriteOnly); saveSuccess = picture.save(&picStreamT, "JPEG", comLvl); picStreamT.close(); - if (saveSuccess) - { - if ((quint32)picByteArrayT.length() > jpegPicStreamLength) { + if (saveSuccess) { + if (static_cast(picByteArrayT.length()) > jpegPicStreamLength) { comLvl--; saveSuccess = false; } @@ -207,15 +206,27 @@ bool SnapmaticPicture::setImage(const QImage &picture) bool SnapmaticPicture::setPictureStream(const QByteArray &streamArray) // clean method { bool success = ragePhoto.setPhotoData(streamArray); - // SAVE HERE - return false; + if (success) { + if (cacheEnabled) { + QImage replacedPicture; + replacedPicture.loadFromData(streamArray); + cachePicture = replacedPicture; + } + return true; + } + else { + return false; + } } bool SnapmaticPicture::setPictureTitl(const QString &newTitle_) { - ragePhoto.setTitle(newTitle_); - // SAVE HERE - return false; + QString newTitle = newTitle_; + if (newTitle.length() > 39) { + newTitle = newTitle.left(39); + } + ragePhoto.setTitle(newTitle); + return true; } int SnapmaticPicture::getContentMaxLength() @@ -591,7 +602,6 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties properties) bool SnapmaticPicture::setJsonStr(const QString &newJsonStr, bool updateProperties) { if (ragePhoto.setJsonData(newJsonStr.toUtf8())) { - // SAVE HERE if (updateProperties) parseJsonContent(); return true; @@ -605,129 +615,88 @@ bool SnapmaticPicture::setJsonStr(const QString &newJsonStr, bool updateProperti bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat format_) { - // // Keep current format when Auto_Format is used - // SnapmaticFormat format = format_; - // if (format_ == SnapmaticFormat::Auto_Format) - // { - // if (ragePhoto.photoFormat() == RagePhoto::PhotoFormat::G5EX) - // { - // format = SnapmaticFormat::G5E_Format; - // } - // else - // { - // format = SnapmaticFormat::PGTA_Format; - // } - // } + // Keep current format when Auto_Format is used + SnapmaticFormat format = format_; + if (format_ == SnapmaticFormat::Auto_Format) + { + if (ragePhoto.photoFormat() == RagePhoto::PhotoFormat::G5EX) + { + format = SnapmaticFormat::G5E_Format; + } + else + { + format = SnapmaticFormat::PGTA_Format; + } + } - // 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) - // { - // // Modern compressed export (v2) - // QByteArray g5eHeader; - // g5eHeader.reserve(10); - // g5eHeader += '\x00'; // First Null Byte - // g5eHeader += QByteArray("G5E"); // GTA 5 Export - // g5eHeader += '\x32'; g5eHeader += '\x00'; // 2 byte GTA 5 Export Version - // g5eHeader += '\x00'; g5eHeader += '\x01'; // 2 byte GTA 5 Export Type - // if (picFile->write(g5eHeader) == -1) { writeFailure = true; } - // if (!lowRamMode) - // { - // if (picFile->write(qCompress(rawPicContent, 9)) == -1) { writeFailure = true; } // Compressed Snapmatic - // } - // else - // { - // 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) - // { - // // JPEG export - // QBuffer snapmaticStream(&rawPicContent); - // snapmaticStream.open(QIODevice::ReadOnly); - // if (snapmaticStream.seek(jpegStreamEditorBegin)) - // { - // QByteArray jpegRawContent = snapmaticStream.read(jpegPicStreamLength); - // if (jpegRawContentSizeE != 0) - // { - // jpegRawContent = jpegRawContent.left(jpegRawContentSizeE); - // } - // 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 - // } - // delete picFile; - // } - // else - // { - // // Classic straight export - // if (!lowRamMode) - // { - // if (picFile->write(rawPicContent) == -1) { writeFailure = true; } - // } - // else - // { - // 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; - // } - //#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 saveSuccess; - // } - return false; + bool saveSuccess = 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) + { + ragePhoto.save(picFile, RagePhoto::PhotoFormat::G5EX); +#if QT_VERSION >= 0x050000 + saveSuccess = picFile->commit(); +#else + saveSuccess = true; + picFile->close(); +#endif + delete picFile; + } + else if (format == SnapmaticFormat::JPEG_Format) + { + picFile->write(ragePhoto.photoData()); +#if QT_VERSION >= 0x050000 + saveSuccess = picFile->commit(); +#else + saveSuccess = true; + picFile->close(); +#endif + delete picFile; + } + else + { + ragePhoto.save(picFile, RagePhoto::PhotoFormat::GTA5); +#if QT_VERSION >= 0x050000 + saveSuccess = picFile->commit(); +#else + saveSuccess = true; + picFile->close(); +#endif + delete picFile; + } +#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 saveSuccess; + } } void SnapmaticPicture::setPicFileName(const QString &picFileName_) diff --git a/res/gta5sync.ts b/res/gta5sync.ts index a750ee0..5ba25e5 100644 --- a/res/gta5sync.ts +++ b/res/gta5sync.ts @@ -343,14 +343,14 @@ Pictures and Savegames - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! - + Custom Picture Custom Picture Description in SC, don't use Special Character! @@ -992,37 +992,37 @@ Y: %2 - + Export as &Picture... - + Export as &Snapmatic... - + &Edit Properties... - + &Overwrite Image... - + Open &Map Viewer... - + Open &JSON Editor... @@ -1274,23 +1274,23 @@ Press 1 for Default View - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... @@ -1307,226 +1307,226 @@ Press 1 for Default View - + All image files (%1) - - + + All files (**) - + Can't import %1 because file can't be open - + Can't import %1 because file can't be parsed properly - + Enabled pictures: %1 of %2 - + Loading... - + Snapmatic Loader - + <h4>Following Snapmatic Pictures got repaired</h4>%1 - + Importable files (%1) - - + + GTA V Export (*.g5e) - - + + Savegames files (SGTA*) - - + + Snapmatic pictures (PGTA*) - - - + + + No valid file is selected - - + + Import file %1 of %2 files - + Import failed with... %1 - - + + Failed to read Snapmatic picture - - + + Failed to read Savegame file - + Can't import %1 because file format can't be detected - + Prepare Content for Import... - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? - + Failed to import the Snapmatic picture, can't copy the file into profile - + Failed to import the Savegame, can't copy the file into profile - + Failed to import the Savegame, no Savegame slot is left - - - - - + + + + + Export selected... - - + + JPG pictures and GTA Snapmatic - - + + JPG pictures only - - + + GTA Snapmatic only - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: - + Initialising export... - + Export failed with... %1 - - + + No Snapmatic pictures or Savegames files are selected - - - + + + Remove selected - + You really want remove the selected Snapmatic picutres and Savegame files? - + Failed to remove all selected Snapmatic pictures and/or Savegame files - - - - - - + + + + + + No Snapmatic pictures are selected - - - - - - + + + + + + %1 failed with... %2 @@ -1534,87 +1534,87 @@ Press 1 for Default View - - + + Qualify as Avatar - - - - + + + + Patch selected... - - - - - - - - + + + + + + + + Patch file %1 of %2 files - + Qualify %1 failed with... - - + + Change Players... - + Change Players %1 failed with... - - - + + + Change Crew... - + Failed to enter a valid Snapmatic Crew ID - + Change Crew %1 failed with... - - - + + + Change Title... - + Failed to enter a valid Snapmatic title - + Change Title %1 failed with... - + All profile files (*.g5e SGTA* PGTA*) @@ -1700,37 +1700,37 @@ Press 1 for Default View - + &View - + &Export - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All @@ -1933,25 +1933,25 @@ Press 1 for Default View - + Snapmatic Crew - + New Snapmatic crew: - + Snapmatic Title - + New Snapmatic title: @@ -2008,64 +2008,64 @@ Press 1 for Default View SnapmaticPicture - + JSON is incomplete and malformed - + JSON is incomplete - + JSON is malformed - + PHOTO - %1 - + open file %1 - + header not exists - + header is malformed - + picture not exists (%1) - + JSON not exists (%1) - + title not exists (%1) - + description not exists (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error @@ -2126,52 +2126,52 @@ Press 1 for Default View - + Edi&t - + Show &In-game - + Hide &In-game - + &Export - + &View - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All @@ -2255,7 +2255,7 @@ Press 1 for Default View - + &Close @@ -2292,7 +2292,7 @@ Press 1 for Default View - + &About %1 @@ -2348,15 +2348,15 @@ Press 1 for Default View - + Select &GTA V Folder... - - + + Select GTA V Folder... @@ -2391,46 +2391,46 @@ Press 1 for Default View - - + + Show In-game - - + + Hide In-game - - + + Select Profile - + Open File... - - - - + + + + Open File - + Can't open %1 because of not valid file format - + %1 - Messages diff --git a/res/gta5sync_de.qm b/res/gta5sync_de.qm index ce90a9d..00627a7 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 11b3e12..fb2996f 100644 --- a/res/gta5sync_de.ts +++ b/res/gta5sync_de.ts @@ -359,14 +359,14 @@ Snapmatic Bilder und Spielständen - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! Eigener Avatar - + Custom Picture Custom Picture Description in SC, don't use Special Character! Eigenes Bild @@ -1013,31 +1013,31 @@ Y: %2 - + Export as &Picture... Als &Bild exportieren... - + Export as &Snapmatic... Als &Snapmatic exportieren... - + &Edit Properties... Eigenschaften bearb&eiten... - + &Overwrite Image... Bild &überschreiben... - + Open &Map Viewer... &Kartenansicht öffnen... @@ -1186,7 +1186,7 @@ Drücke 1 für Standardmodus - + Open &JSON Editor... &JSON Editor öffnen... @@ -1284,40 +1284,40 @@ Drücke 1 für Standardmodus S&chließen - + Loading... Lade... - + Snapmatic Loader Snapmatic Lader - + <h4>Following Snapmatic Pictures got repaired</h4>%1 <h4>Folgende Snapmatic Bilder wurden repariert</h4>%1 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... Importieren... @@ -1332,45 +1332,45 @@ Drücke 1 für Standardmodus Importieren - - + + Savegames files (SGTA*) Spielstanddateien (SGTA*) - - + + Snapmatic pictures (PGTA*) Snapmatic Bilder (PGTA*) - + Importable files (%1) Importfähige Dateien (%1) - + All image files (%1) Alle Bilddateien (%1) - - + + All files (**) Alle Dateien (**) - - + + Import file %1 of %2 files Importiere Datei %1 von %2 Dateien - + Import failed with... %1 @@ -1379,149 +1379,149 @@ Drücke 1 für Standardmodus %1 - - + + Failed to read Snapmatic picture Fehler beim Lesen vom Snapmatic Bild - - + + Failed to read Savegame file Fehler beim Lesen von Spielstanddatei - + Can't import %1 because file can't be open Kann %1 nicht importieren weil die Datei nicht geöffnet werden kann - + Can't import %1 because file can't be parsed properly Kann %1 nicht importieren weil die Datei nicht richtig gelesen werden kann - + Can't import %1 because file format can't be detected Kann %1 nicht importieren weil das Dateiformat nicht erkannt werden kann - + Initialising export... Initialisiere Export... - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA oder endet mit .g5e - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1Exportiere Snapmatic Bilder%2<br><br>JPG Bilder machen es möglich sie mit ein Bildansicht Programm zu öffnen<br>Das GTA Snapmatic Format macht es möglich sie wieder ins Game zu importieren<br><br>Exportieren als: - - - + + + No valid file is selected Keine gültige Datei wurde ausgewählt - + Enabled pictures: %1 of %2 Aktivierte Bilder: %1 von %2 - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? Ein Snapmatic Bild mit der Uid %1 existiert bereits, möchtest du dein Import eine neue Uid und Zeitstempel zuweisen? - + Failed to import the Snapmatic picture, can't copy the file into profile Fehlgeschlagen beim Importieren vom Snapmatic Bild, kann Snapmatic Bild nicht ins Profil kopieren - + Failed to import the Savegame, can't copy the file into profile Fehlgeschlagen beim Importieren vom Spielstand, kann Spielstanddatei nicht ins Profil kopieren - + Failed to import the Savegame, no Savegame slot is left Fehlgeschlagen beim Importieren vom Spielstand, kein Spielstandslot mehr frei - - + + JPG pictures and GTA Snapmatic JPG Bilder und GTA Snapmatic - - + + JPG pictures only Nur JPG Bilder - - + + GTA Snapmatic only Nur GTA Snapmatic - - - - + + + + Patch selected... Auswahl patchen... - - - - - - - - + + + + + + + + Patch file %1 of %2 files Patche Datei %1 von %2 Dateien - - + + Qualify as Avatar Als Avatar qualifizieren - - - - - - + + + + + + No Snapmatic pictures are selected Keine Snapmatic Bilder sind ausgewählt - + Failed to remove all selected Snapmatic pictures and/or Savegame files Fehlgeschlagen beim Entfernen von allen augewählten Snapmatic Bildern und/oder Spielstanddateien - - - - - - + + + + + + %1 failed with... %2 @@ -1531,93 +1531,93 @@ Drücke 1 für Standardmodus %2 - + Prepare Content for Import... Bereite Inhalt für Import vor... - + Qualify %1 failed with... Qualifizieren - - + + Change Players... Spieler ändern... - + Change Players %1 failed with... Spieler ändern - - - + + + Change Crew... Crew ändern... - + Failed to enter a valid Snapmatic Crew ID Fehlgeschlagen beim Eingeben von einer gültigen Crew ID - + Change Crew %1 failed with... Crew ändern - - - + + + Change Title... Titel ändern... - + Failed to enter a valid Snapmatic title Fehlgeschlagen beim Eingeben eines gültigen Snapmatic Titel - + Change Title %1 failed with... Titel ändern - - + + No Snapmatic pictures or Savegames files are selected Keine Snapmatic Bilder oder Spielstände sind ausgewählt - - - + + + Remove selected Auswahl löschen - + You really want remove the selected Snapmatic picutres and Savegame files? Möchtest du wirklich die ausgewählten Snapmatic Bilder und Spielstanddateien löschen? - - - - - + + + + + Export selected... Auswahl exportieren... - + Export failed with... %1 @@ -1631,13 +1631,13 @@ Drücke 1 für Standardmodus Exportiere Datei %1 von %2 Dateien - + All profile files (*.g5e SGTA* PGTA*) Alle Profildateien (*.g5e SGTA* PGTA*) - - + + GTA V Export (*.g5e) GTA V Export (*.g5e) @@ -1769,32 +1769,32 @@ Drücke 1 für Standardmodus Fehlgeschlagen beim Löschen %1 von deinen Spielständen - + &View A&nsehen - + &Remove Entfe&rnen - + &Select Au&swählen - + &Deselect A&bwählen - + Select &All &Alles auswählen - + &Deselect All Alles a&bwählen @@ -1809,7 +1809,7 @@ Drücke 1 für Standardmodus Spielstand kopieren - + &Export &Exportieren @@ -1903,7 +1903,7 @@ Drücke 1 für Standardmodus Meme - + Snapmatic Title Snapmatic Titel @@ -2019,19 +2019,19 @@ Drücke 1 für Standardmodus Patchen von Snapmatic Eigenschaften fehlgeschlagen wegen I/O Fehler - + New Snapmatic title: Neuer Snapmatic Titel: - + Snapmatic Crew Snapmatic Crew - + New Snapmatic crew: Neue Snapmatic Crew: @@ -2040,66 +2040,66 @@ Drücke 1 für Standardmodus SnapmaticPicture - + PHOTO - %1 FOTO - %1 - + open file %1 Datei öffnen %1 - + header not exists Header nicht existiert - + header is malformed Header fehlerhaft ist - + picture not exists (%1) Bild nicht existiert (%1) - + JSON not exists (%1) JSON nicht existiert (%1) - + title not exists (%1) Titel nicht existiert (%1) - + description not exists (%1) Beschreibung nicht existiert (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error Datei lesen von %1 weil %2 - + JSON is incomplete and malformed JSON ist unvollständig und Fehlerhaft - + JSON is incomplete JSON ist unvollständig - + JSON is malformed JSON ist Fehlerhaft @@ -2159,52 +2159,52 @@ Drücke 1 für Standardmodus Fehlgeschlagen beim Anzeigen von %1 im Spiel von deinen Snapmatic Bildern - + Edi&t Bearbei&ten - + &Export &Exportieren - + Show &In-game &Im Spiel anzeigen - + Hide &In-game &Im Spiel ausblenden - + &View A&nsehen - + &Remove Entfe&rnen - + &Select Au&swählen - + &Deselect A&bwählen - + Select &All Alles &auswählen - + &Deselect All Alles a&bwählen @@ -2347,7 +2347,7 @@ Drücke 1 für Standardmodus - + Select &GTA V Folder... Wähle &GTA V Ordner... @@ -2363,7 +2363,7 @@ Drücke 1 für Standardmodus - + &Close S&chließen @@ -2399,21 +2399,21 @@ Drücke 1 für Standardmodus - - + + Select Profile Profil auswählen - - + + Select GTA V Folder... Wähle GTA V Ordner... - + Open File... Datei öffnen... @@ -2426,25 +2426,25 @@ Drücke 1 für Standardmodus - + &About %1 &Über %1 - - - - + + + + Open File Datei öffnen - + Can't open %1 because of not valid file format Kann nicht %1 öffnen weil Dateiformat nicht gültig ist - + %1 - Messages %1 - Nachrichten @@ -2454,15 +2454,15 @@ Drücke 1 für Standardmodus &Neuladen - - + + Show In-game Im Spiel anzeigen - - + + Hide In-game Im Spiel ausblenden diff --git a/res/gta5sync_en_US.qm b/res/gta5sync_en_US.qm index da80daf..502289e 100644 Binary files a/res/gta5sync_en_US.qm and b/res/gta5sync_en_US.qm differ diff --git a/res/gta5sync_en_US.ts b/res/gta5sync_en_US.ts index d4cf2b3..ddf1da0 100644 --- a/res/gta5sync_en_US.ts +++ b/res/gta5sync_en_US.ts @@ -349,14 +349,14 @@ Pictures and Savegames - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! - + Custom Picture Custom Picture Description in SC, don't use Special Character! @@ -992,31 +992,31 @@ Y: %2 - + Export as &Picture... - + Export as &Snapmatic... - + &Overwrite Image... - + &Edit Properties... - + Open &Map Viewer... @@ -1168,7 +1168,7 @@ Press 1 for Default View - + Open &JSON Editor... @@ -1272,45 +1272,45 @@ Press 1 for Default View - + Enabled pictures: %1 of %2 - + Loading... - + Snapmatic Loader - + <h4>Following Snapmatic Pictures got repaired</h4>%1 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... @@ -1325,219 +1325,219 @@ Press 1 for Default View - + Importable files (%1) - - + + GTA V Export (*.g5e) - - + + Savegames files (SGTA*) - - + + Snapmatic pictures (PGTA*) - + All image files (%1) - - + + All files (**) - - - + + + No valid file is selected - - + + Import file %1 of %2 files - + Import failed with... %1 - - + + Failed to read Snapmatic picture - - + + Failed to read Savegame file - + Can't import %1 because file can't be open - + Can't import %1 because file can't be parsed properly - + Can't import %1 because file format can't be detected - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e - + Failed to import the Snapmatic picture, can't copy the file into profile - + Failed to import the Savegame, can't copy the file into profile - + Failed to import the Savegame, no Savegame slot is left - - + + JPG pictures and GTA Snapmatic - - + + JPG pictures only - - + + GTA Snapmatic only - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: - - - - - + + + + + Export selected... - + Initialising export... Initializing export... - + Export failed with... %1 - - + + No Snapmatic pictures or Savegames files are selected - - - + + + Remove selected - + You really want remove the selected Snapmatic picutres and Savegame files? - - + + Qualify as Avatar - - - - - - + + + + + + No Snapmatic pictures are selected - - - - + + + + Patch selected... - - - - - - - - + + + + + + + + Patch file %1 of %2 files - - - - - - + + + + + + %1 failed with... %2 @@ -1545,76 +1545,76 @@ Press 1 for Default View - + Failed to remove all selected Snapmatic pictures and/or Savegame files - + Prepare Content for Import... - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? - + Qualify %1 failed with... - - + + Change Players... - + Change Players %1 failed with... - - - + + + Change Crew... - + Failed to enter a valid Snapmatic Crew ID - + Change Crew %1 failed with... - - - + + + Change Title... - + Failed to enter a valid Snapmatic title - + Change Title %1 failed with... - + All profile files (*.g5e SGTA* PGTA*) @@ -1700,37 +1700,37 @@ Press 1 for Default View - + &View - + &Export - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All @@ -1980,25 +1980,25 @@ Press 1 for Default View - + Snapmatic Title - + New Snapmatic title: - + Snapmatic Crew - + New Snapmatic crew: @@ -2007,66 +2007,66 @@ Press 1 for Default View SnapmaticPicture - + PHOTO - %1 - + open file %1 - + header not exists - + header is malformed - + picture not exists (%1) - + JSON not exists (%1) - + title not exists (%1) - + description not exists (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error - + JSON is incomplete and malformed - + JSON is incomplete - + JSON is malformed @@ -2126,52 +2126,52 @@ Press 1 for Default View - + Edi&t - + Show &In-game - + Hide &In-game - + &Export - + &View - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All @@ -2255,7 +2255,7 @@ Press 1 for Default View - + &Close @@ -2287,7 +2287,7 @@ Press 1 for Default View - + &About %1 @@ -2343,15 +2343,15 @@ Press 1 for Default View - + Select &GTA V Folder... - - + + Select GTA V Folder... @@ -2392,44 +2392,44 @@ Press 1 for Default View - - + + Select Profile - + Open File... - - - - + + + + Open File - + Can't open %1 because of not valid file format - + %1 - Messages - - + + Show In-game - - + + Hide In-game diff --git a/res/gta5sync_fr.qm b/res/gta5sync_fr.qm index 341e9f1..fad75db 100644 Binary files a/res/gta5sync_fr.qm and b/res/gta5sync_fr.qm differ diff --git a/res/gta5sync_fr.ts b/res/gta5sync_fr.ts index a9e7f9b..79be7fb 100644 --- a/res/gta5sync_fr.ts +++ b/res/gta5sync_fr.ts @@ -359,14 +359,14 @@ et les fichiers de sauvegarde de Grand Theft Auto V - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! Avatar personnalisé - + Custom Picture Custom Picture Description in SC, don't use Special Character! Image personnalisé @@ -1093,31 +1093,31 @@ Y : %2 - + Export as &Picture... Exporter comme &image... - + Export as &Snapmatic... Exporter comme &Snapmatic... - + &Overwrite Image... &Remplacer l'image... - + &Edit Properties... Modifier les &propriétés... - + Open &Map Viewer... Ouvrir la &Visionneuse de Carte... @@ -1186,7 +1186,7 @@ Appuyer sur 1 pour le mode par défaut - + Open &JSON Editor... Ouvrir l'éditeur &JSON... @@ -1290,45 +1290,45 @@ Appuyer sur 1 pour le mode par défaut Copie du fichier %1 sur %2 - + Enabled pictures: %1 of %2 Photos activées : %1 sur %2 - + Loading... Chargement... - + Snapmatic Loader Snapmatic Loader - + <h4>Following Snapmatic Pictures got repaired</h4>%1 <h4>Les Snapmatic suivants ont été répaés</h4>%1 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... Importer... @@ -1343,40 +1343,40 @@ Appuyer sur 1 pour le mode par défaut Importer - - + + Savegames files (SGTA*) Fichiers de sauvegarde GTA (SGTA*) - - + + Snapmatic pictures (PGTA*) Photos Snapmatic (PGTA*) - + All image files (%1) Toutes les images (%1) - - + + All files (**) Tous les fichiers (**) - - + + Import file %1 of %2 files Importation du fichier %1 sur %2 - + Import failed with... %1 @@ -1385,148 +1385,148 @@ Appuyer sur 1 pour le mode par défaut %1 - - - + + + No valid file is selected Fichier invalide - + Importable files (%1) Fichiers importables (%1) - - + + Failed to read Snapmatic picture Impossible d'ouvrir la photo Snapmatic - - + + Failed to read Savegame file Impossible de lire le fichier de sauvegarde - + Can't import %1 because file can't be open Impossible d'importer %1, le fichier ne peut pas être ouvert - + Can't import %1 because file can't be parsed properly Impossible d'importer %1, le fichier ne peut pas être parsé correctement - + Can't import %1 because file format can't be detected Impossible d'importer %1, le format du fichier n'est pas détecté - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Impossible d'importer la photo Snapmatic,nom de fichier incorrect (PGTA*, *.g5e) - + Failed to import the Snapmatic picture, can't copy the file into profile Impossible d'importer la photo Snapmatic, impossible de copier le fichier dans le profil - + Failed to import the Savegame, can't copy the file into profile Impossible d'importer la sauvegarde, impossible de copier le fichier dans le profil - + Failed to import the Savegame, no Savegame slot is left Impossible d'importer la sauvegarde, aucun emplacement libre - - + + JPG pictures and GTA Snapmatic Images JPG et GTA Snapmatic - - + + JPG pictures only Images JPG seulement - - + + GTA Snapmatic only GTA Snapmatic seulement - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1Exporter les photos Snapmatic%2<br><br>Les fichiers JPG permettent d'ouvrir les photos avec une visionneuse d'images<br>Les GTA Snapmatic permettent d'importer les photos dans le jeu<br><br>Exporter comme : - - - - - + + + + + Export selected... Exporter la sélection... - + Initialising export... Initialisation de l'export... - - + + Qualify as Avatar Qualifier comme Avatar - - - - - - + + + + + + No Snapmatic pictures are selected Aucun Snapmatic sélectionné - - - - + + + + Patch selected... Patcher la sélection... - - - - - - - - + + + + + + + + Patch file %1 of %2 files Patch du fichier %1 sur %2 - - - - - - + + + + + + %1 failed with... %2 @@ -1536,76 +1536,76 @@ Appuyer sur 1 pour le mode par défaut %2 - + Failed to remove all selected Snapmatic pictures and/or Savegame files Échec de la supression des Snapmatic et/ou des fichiers de sauvegarde sélectionnés - + Prepare Content for Import... Préparation du contenu pour l'import... - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? Un Snapmatic existe déjà avec le uid %1, voulez-vous assigner à votre import un nouvel uid et timestamp ? - + Qualify %1 failed with... Qualifier - - + + Change Players... Modifier les joueurs... - + Change Players %1 failed with... Modifier les joueurs - - - + + + Change Crew... Modifier le Crew... - + Failed to enter a valid Snapmatic Crew ID Snapmatic Crew ID invalide - + Change Crew %1 failed with... Changer le Crew - - - + + + Change Title... Changer le titre... - + Failed to enter a valid Snapmatic title Titre Snapmatic invalide - + Change Title %1 failed with... Changer le titre - + Export failed with... %1 @@ -1614,31 +1614,31 @@ Appuyer sur 1 pour le mode par défaut %1 - - + + No Snapmatic pictures or Savegames files are selected Aucun fichier de sauvegarde ou photo Snapmatic sélectionné - - - + + + Remove selected Supprimer la sélection - + You really want remove the selected Snapmatic picutres and Savegame files? Supprimer la sélection ? - + All profile files (*.g5e SGTA* PGTA*) Tous les fichiers de profil (*.g5e SGTA* PGTA*) - - + + GTA V Export (*.g5e) GTA V Export (*.g5e) @@ -1732,7 +1732,7 @@ Appuyer sur 1 pour le mode par défaut Supprimer - + &Export &Exporter @@ -1823,32 +1823,32 @@ Appuyer sur 1 pour le mode par défaut Impossible de supprimer %1 - + &View &Voir - + &Remove &Supprimer - + &Select &Sélectionner - + &Deselect &Déselectionner - + Select &All Sélectionner to&ut - + &Deselect All &Déselectionner tout @@ -1904,7 +1904,7 @@ Appuyer sur 1 pour le mode par défaut Meme - + Snapmatic Title Titre Snapmatic @@ -2022,19 +2022,19 @@ Appuyer sur 1 pour le mode par défaut La modification des propriétés Snapmatic a échoué : erreur d'entrée/sortie - + New Snapmatic title: Nouveau titre Snapmatic : - + Snapmatic Crew Crew Snapmatic - + New Snapmatic crew: Nouveau crew Snapmatic : @@ -2043,66 +2043,66 @@ Appuyer sur 1 pour le mode par défaut SnapmaticPicture - + PHOTO - %1 PHOTO - %1 - + open file %1 ouverture du fichier %1 - + header not exists les headers n'existent pas - + header is malformed les headers sont incorrects - + picture not exists (%1) l'image n'existe pas (%1) - + JSON not exists (%1) le JSON n'existe pas (%1) - + title not exists (%1) le titre n'existe pas (%1) - + description not exists (%1) la description n'existe pas (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error lecture du fichier %1 : %2 - + JSON is incomplete and malformed JSON incomplet ou incorrect - + JSON is incomplete JSON incomplet - + JSON is malformed JSON incorrect @@ -2182,52 +2182,52 @@ Appuyer sur 1 pour le mode par défaut %1 n'a pas pu être rendu visible en jeu - + Edi&t Édi&ter - + Show &In-game &Visible en jeu - + Hide &In-game &Invisible en jeu - + &Export &Exporter - + &View &Voir - + &Remove S&upprimer - + &Select &Sélectionner - + &Deselect &Déselectionner - + Select &All Sélectionner &tout - + &Deselect All &Déselectionner tout @@ -2285,7 +2285,7 @@ Appuyer sur 1 pour le mode par défaut - + &Close Fer&mer @@ -2361,15 +2361,15 @@ Appuyer sur 1 pour le mode par défaut - + Select &GTA V Folder... Modifier l'emplacement de &GTA V... - - + + Select GTA V Folder... Modifier l'emplacement de GTA V... @@ -2422,50 +2422,50 @@ Appuyer sur 1 pour le mode par défaut - + &About %1 &À propos de %1 - - + + Select Profile Sélectionner un profil - + Open File... Ouvrir... - - - - + + + + Open File Ouvrir - + Can't open %1 because of not valid file format Impossible d'ouvrir %1, format invalide - + %1 - Messages %1 - Nouvelles - - + + Show In-game Visible en jeu - - + + Hide In-game Invisible en jeu diff --git a/res/gta5sync_ko.qm b/res/gta5sync_ko.qm index 161d79c..77b5d8a 100644 Binary files a/res/gta5sync_ko.qm and b/res/gta5sync_ko.qm differ diff --git a/res/gta5sync_ko.ts b/res/gta5sync_ko.ts index 7049e9c..53166ac 100644 --- a/res/gta5sync_ko.ts +++ b/res/gta5sync_ko.ts @@ -353,7 +353,7 @@ Pictures and Savegames - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! 소셜클럽의 사용자 지정 아바타 설명입니다. 특수 문자를 사용하지 마십시오! @@ -361,7 +361,7 @@ Pictures and Savegames - + Custom Picture Custom Picture Description in SC, don't use Special Character! 소셜클럽의 사용자 지정 그림 설명입니다. 특수 문자를 사용하지 마십시오! @@ -1021,37 +1021,37 @@ Y: %2 - + Export as &Picture... 사진으로 내보내기(&P)... - + Export as &Snapmatic... 스낵매틱으로 내보내기(&S)... - + &Edit Properties... 속성 편집(&E)... - + &Overwrite Image... 이미지 덮어쓰기(&O)... - + Open &Map Viewer... 지도 뷰어 열기(&M)... - + Open &JSON Editor... JSON 편집기 열기(&J)... @@ -1306,23 +1306,23 @@ Press 1 for Default View - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... 가져오기... @@ -1339,90 +1339,90 @@ Press 1 for Default View - + All image files (%1) 모든 이미지 파일 (%1) - - + + All files (**) 모든 파일 (**) - + Can't import %1 because file can't be open 파일을 열 수 없으므로 %1을 가져올 수 없습니다 - + Can't import %1 because file can't be parsed properly 파일을 구문 분석할 수 없으므로 %1을 가져올 수 없습니다 - + Enabled pictures: %1 of %2 활성화된 사진: %2의 %1 - + Loading... 불러오는 중... - + Snapmatic Loader 스냅매틱 로더 - + <h4>Following Snapmatic Pictures got repaired</h4>%1 <h4>다음 스냅매틱 사진을 복구했습니다 </h4>%1 - + Importable files (%1) 가져올 수 있는 파일 (%1) - - + + GTA V Export (*.g5e) GTA V로 내보내기 (*.g5e) - - + + Savegames files (SGTA*) 세이브 파일 (SGTA*) - - + + Snapmatic pictures (PGTA*) 스냅매틱 사진 (PGTA*) - - - + + + No valid file is selected 올바른 파일이 선택되지 않았습니다 - - + + Import file %1 of %2 files %2 파일 중 %1 파일을 가져옵니다 - + Import failed with... %1 @@ -1431,91 +1431,91 @@ Press 1 for Default View %1 - - + + Failed to read Snapmatic picture 스냅매틱 사진을 읽지 못했습니다 - - + + Failed to read Savegame file 세이브 파일을 읽지 못했습니다 - + Can't import %1 because file format can't be detected 파일 형식을 검색할 수 없으므로 %1을 가져올 수 없습니다 - + Prepare Content for Import... 가져올 컨텐츠를 준비합니다... - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e 스냅매틱 사진을 가져오지 못했습니다. 파일이 PGTA로 시작되거나 .g5e로 끝나지 않습니다 - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? uid %1이(가) 있는 스냅매틱 사진이 이미 있습니다. 가져오기를 새 uid 및 타임스탬프를 할당하시겠습니까? - + Failed to import the Snapmatic picture, can't copy the file into profile 스냅매틱 사진을 가져오지 못했습니다. 파일을 프로파일에 복사할 수 없습니다 - + Failed to import the Savegame, can't copy the file into profile 게임 저장 파일을 가져오지 못했습니다. 파일을 프로필에 복사할 수 없습니다 - + Failed to import the Savegame, no Savegame slot is left 게임 저장 파일을 가져오지 못했습니다. 게임 저장 슬롯이 남아 있지 않습니다 - - - - - + + + + + Export selected... 내보내기를 선택했습니다... - - + + JPG pictures and GTA Snapmatic JPG 사진 및 GTA 스냅매틱 - - + + JPG pictures only JPG 사진만 - - + + GTA Snapmatic only GTA 스냅매틱만 - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1 스냅 사진 내보내기를 수행합니다%2 <br><br>JPG 사진을 사용하면 이미지 뷰어 로 사진을 열 수 있습니다<br>GTA 스냅매틱을 사용하면 다음과 같이 사진을 게임으로 가져올 수 있습니다 - + Initialising export... 내보내기를 초기화하는 중... - + Export failed with... %1 @@ -1524,45 +1524,45 @@ Press 1 for Default View %1 - - + + No Snapmatic pictures or Savegames files are selected 스냅매틱 사진 또는 세이브 파일이 선택되지 않았습니다 - - - + + + Remove selected 선택한 항목 삭제 - + You really want remove the selected Snapmatic picutres and Savegame files? 선택한 스냅매틱 사진 및 세이브 파일을 삭제하시겠습니까? - + Failed to remove all selected Snapmatic pictures and/or Savegame files 선택한 모든 스냅매틱 사진 및 세이브 파일을 삭제하지 못했습니다 - - - - - - + + + + + + No Snapmatic pictures are selected 스냅매틱 사진이 선택되지 않았습니다 - - - - - - + + + + + + %1 failed with... %2 @@ -1573,91 +1573,91 @@ Press 1 for Default View %2 - - + + Qualify as Avatar 아바타 자격 부여 - - - - + + + + Patch selected... 패치가 선택됨... - - - - - - - - + + + + + + + + Patch file %1 of %2 files %2 파일의 %1 패치 파일입니다 - + Qualify %1 failed with... %1이(가) 실패한 경우... 자격 부여 - - + + Change Players... 플레이어 변경... - + Change Players %1 failed with... %1이(가) 실패한 경우... 플레이어 변경 - - - + + + Change Crew... 조직 변경... - + Failed to enter a valid Snapmatic Crew ID 올바른 스냅매틱 조직 아이디를 입력하지 못했습니다 - + Change Crew %1 failed with... %1이(가) 실패한 경우... 조직 변경 - - - + + + Change Title... 제목 변경... - + Failed to enter a valid Snapmatic title 올바른 스냅매틱 제목을 입력하지 못했습니다 - + Change Title %1 failed with... %1이(가) 실패한 경우... 제목 변경 - + All profile files (*.g5e SGTA* PGTA*) 모든 프로필 파일 (*.g5e SGTA* PGTA*) @@ -1751,37 +1751,37 @@ Press 1 for Default View 삭제 - + &View 보기(&V) - + &Export 내보내기(&E) - + &Remove 삭제(&R) - + &Select 선택(&S) - + &Deselect 선택 해제(&D) - + Select &All 모두 선택(&A) - + &Deselect All 모두 선택 해제(&D) @@ -1986,25 +1986,25 @@ Press 1 for Default View JSON 오류로 인해 스냅매틱 속성을 패치하지 못했습니다 - + Snapmatic Crew 조직 스냅매틱 - + New Snapmatic crew: 새로운 조직 스냅매틱: - + Snapmatic Title 스냅매틱 제목 - + New Snapmatic title: 새로운 스냅매틱 제목: @@ -2065,64 +2065,64 @@ Press 1 for Default View SnapmaticPicture - + JSON is incomplete and malformed JSON이 불안정하고 형식이 잘못되었습니다 - + JSON is incomplete JSON이 불안정합니다 - + JSON is malformed 잘못된 JSON 형식 - + PHOTO - %1 사진 - %1 - + open file %1 파일 열기 %1 - + header not exists 헤더가 존재하지 않습니다 - + header is malformed 헤더의 형식이 잘못되었습니다 - + picture not exists (%1) 사진이 존재하지 않습니다. (%1) - + JSON not exists (%1) JSON이 존재하지 않습니다. (%1) - + title not exists (%1) 제목이 존재하지 않습니다. (%1) - + description not exists (%1) 설명이 존재하지 않습니다. (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error %2의 예: JSON이 잘못된 형식입니다 @@ -2184,52 +2184,52 @@ Press 1 for Default View 삭제 - + Edi&t 편집(&T) - + Show &In-game 인게임에서 보이기(&I) - + Hide &In-game 인게임에서 숨기기(&I) - + &Export 내보내기(&E) - + &View 보기(&V) - + &Remove 삭제(&R) - + &Select 선택(&S) - + &Deselect 선택 해제(&D) - + Select &All 모두 선택(&A) - + &Deselect All 모두 선택 해제(&D) @@ -2314,7 +2314,7 @@ Press 1 for Default View - + &Close 닫기(&C) @@ -2351,7 +2351,7 @@ Press 1 for Default View - + &About %1 %1 정보(&A) @@ -2407,15 +2407,15 @@ Press 1 for Default View - + Select &GTA V Folder... GTA V 폴더 선택(&G)... - - + + Select GTA V Folder... GTA V 폴더 선택... @@ -2450,46 +2450,46 @@ Press 1 for Default View 플레이어 변경(&P)... - - + + Show In-game 인게임 보이기 - - + + Hide In-game 인게임 숨기기 - - + + Select Profile 프로필 선택 - + Open File... 파일 열기... - - - - + + + + Open File 파일 열기 - + Can't open %1 because of not valid file format 올바른 파일 형식이 아니므로 %1을 열 수 없습니다 - + %1 - Messages %1 - 뉴스 diff --git a/res/gta5sync_ru.qm b/res/gta5sync_ru.qm index 92b5bdf..a78d0f0 100644 Binary files a/res/gta5sync_ru.qm and b/res/gta5sync_ru.qm differ diff --git a/res/gta5sync_ru.ts b/res/gta5sync_ru.ts index c5a7e79..dec45db 100644 --- a/res/gta5sync_ru.ts +++ b/res/gta5sync_ru.ts @@ -367,14 +367,14 @@ Pictures and Savegames - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! Свой Аватар - + Custom Picture Custom Picture Description in SC, don't use Special Character! Своя Картинка @@ -1024,31 +1024,31 @@ Y: %2 - + Export as &Picture... Экспортировать как &картинку... - + Export as &Snapmatic... Экспортировать как &Snapmatic... - + &Overwrite Image... &Перезаписать картинку... - + &Edit Properties... &Изменить свойства... - + Open &Map Viewer... Открыть &карту... @@ -1197,7 +1197,7 @@ Press 1 for Default View - + Open &JSON Editor... Открыть &редактор JSON... @@ -1294,17 +1294,17 @@ Press 1 for Default View &Закрыть - + Loading... Загрузка... - + Snapmatic Loader Загрузчик Snapmatic - + <h4>Following Snapmatic Pictures got repaired</h4>%1 Change wording if the %1 is not a multiline beginning at new line @@ -1313,23 +1313,23 @@ Press 1 for Default View - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... Импортировать... @@ -1344,33 +1344,33 @@ Press 1 for Default View Импортировать - - + + Savegames files (SGTA*) Файлы сохранения (SGTA*) - - + + Snapmatic pictures (PGTA*) Картинка Snapmatic (PGTA*) - - + + All files (**) Все файлы (**) - - + + Import file %1 of %2 files Импортируются файлы %1 из %2 - + Import failed with... %1 @@ -1379,169 +1379,169 @@ Press 1 for Default View %1 - - + + Failed to read Snapmatic picture Не удалось загрузить картинку Snapmatic - - + + Failed to read Savegame file Не удалось загрузить файл сохранения - - - + + + No valid file is selected Выбранный файл неверен - + Enabled pictures: %1 of %2 Включенные картинки: %1 из %2 - + Importable files (%1) Файлы для импорта (%1) - + All image files (%1) Все файлы изображений (%1) - + Can't import %1 because file can't be open Не удалось открыть %1, файл не может быть открыт - + Can't import %1 because file can't be parsed properly Не получилось импортировать %1, файл не может быть правильно обработан - + Can't import %1 because file format can't be detected Не получилось импортировать %1, не удалось определить формат файла - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Не удалось импортировать картинку Snapmatic, название не начинается с PGTA или не заканчивается с .g5e - + Failed to import the Snapmatic picture, can't copy the file into profile Не удалось импортировать картинку Snapmatic, не получилось скопировать файл в профиль - + Failed to import the Savegame, can't copy the file into profile Не удалось импортировать сохранение, не получилось скопировать файл в профиль - + Failed to import the Savegame, no Savegame slot is left Не удалось импортировать сохранение, нет пустых ячеек под сохранения - - + + JPG pictures and GTA Snapmatic Картинки JPG и GTA Snapmatic - - + + JPG pictures only Только картинки JPG - - + + GTA Snapmatic only Только GTA Snapmatic - + Initialising export... Подготовка к экспорту... - - + + No Snapmatic pictures or Savegames files are selected Не выделены ни один Snapmatic или сохранение - - - + + + Remove selected Снять выделение - + You really want remove the selected Snapmatic picutres and Savegame files? Точно ли хочешь удалить выбранные картинки Snapmatic и файлы сохранений? - + Prepare Content for Import... Подготовка данных к импорту... - - + + Qualify as Avatar Пометить как Аватар - - - - - - + + + + + + No Snapmatic pictures are selected Не выделена ни одна картинка Snapmatic - - - - + + + + Patch selected... Пропатчить выделенные... - - - - - - - - + + + + + + + + Patch file %1 of %2 files Изменяется файл %1 из %2 - - - - - - + + + + + + %1 failed with... %2 @@ -1551,86 +1551,86 @@ Press 1 for Default View %2 - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? Можно использовать слово "приписать" - + Failed to remove all selected Snapmatic pictures and/or Savegame files Не удалось удалить все выделенные картинки Snapmatic и/или сохранения - + Qualify %1 failed with... Помечание - - + + Change Players... Изменить игроков... - + Change Players %1 failed with... Измение игроков - - - + + + Change Crew... Изменить банду... - + Failed to enter a valid Snapmatic Crew ID Введённый идентификатор банды не верен - + Change Crew %1 failed with... Изменение банды - - - + + + Change Title... Изменить заголовок... - + Failed to enter a valid Snapmatic title Введённый заголовок не верен - + Change Title %1 failed with... Изменение заголовка - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1Эскпортировать картинки Snapmatic%2<br><br>Картинки JPG можно открыть любым просмотрщиком<br>Картинки формата GTA Snapmatic можно снова импортировать в игру<br><br>Экспортировать как: - - - - - + + + + + Export selected... Экпортировать выделенное... - + Export failed with... %1 @@ -1646,13 +1646,13 @@ Press 1 for Default View Экспортируется файл %1 из %2 - + All profile files (*.g5e SGTA* PGTA*) Все файлы профиля (*.g5e SGTA* PGTA*) - - + + GTA V Export (*.g5e) GTA V Export (*.g5e) @@ -1789,32 +1789,32 @@ Press 1 for Default View Не удалось удалить сохранение %1 - + &View &Просмотр - + &Remove &Удалить - + &Select &Выбрать - + &Deselect Сн&ять выбор - + Select &All В&ыбрать все - + &Deselect All Снять выбо&р со всех @@ -1824,7 +1824,7 @@ Press 1 for Default View Копировать сохранение - + &Export &Экспортировать @@ -1928,7 +1928,7 @@ Press 1 for Default View Meme - + Snapmatic Title Заголовок Snapmatic @@ -2034,19 +2034,19 @@ Press 1 for Default View Не удалось измененить свойства Snapmatic из-за проблемы ввода/вывода - + New Snapmatic title: Новый заголовок Snapmatic: - + Snapmatic Crew Банда на Snapmatic - + New Snapmatic crew: Новая банда на Snapmatic: @@ -2055,66 +2055,66 @@ Press 1 for Default View SnapmaticPicture - + PHOTO - %1 ФОТО - %1 - + open file %1 Открыть файл %1 - + header not exists Отсутствует шапка (header) - + header is malformed Шапка (header) повреждена - + picture not exists (%1) Картинки не существует (%1) - + JSON not exists (%1) JSON не существует (%1) - + title not exists (%1) Заголовок отсутствует (%1) - + description not exists (%1) Описание отсутствует (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error Чтение из файла %1 из-за %2 - + JSON is incomplete and malformed JSON не полный и повреждён - + JSON is incomplete JSON частично отсутствует - + JSON is malformed JSON повреждён @@ -2184,52 +2184,52 @@ Press 1 for Default View Не удалось показать %1 в списке картинок Snapmatic в игре - + Edi&t &Правка - + Show &In-game Показывать в &игре - + Hide &In-game Ск&рыть в игре - + &Export &Экспорт - + &View По&казать - + &Remove У&далить - + &Select &Выделить - + &Deselect Сн&ять выделение - + Select &All В&ыбрать все - + &Deselect All Снять выбо&р со всех @@ -2337,7 +2337,7 @@ Press 1 for Default View - + Select &GTA V Folder... Выбрать &папку GTA V... @@ -2373,7 +2373,7 @@ Press 1 for Default View - + &Close &Закрыть @@ -2414,16 +2414,16 @@ Press 1 for Default View - - + + Select Profile Выбор профиля - - + + Select GTA V Folder... Выбрать папку GTA V... @@ -2436,30 +2436,30 @@ Press 1 for Default View - + &About %1 &О программе %1 - + Open File... Открыть файл... - - - - + + + + Open File Открыть файл - + Can't open %1 because of not valid file format Не удалось открыть %1 из-за неверного формата файла - + %1 - Messages %1 - Новости @@ -2469,15 +2469,15 @@ Press 1 for Default View Пере&загрузить - - + + Show In-game Показывать в игре - - + + Hide In-game Скрыть в игре diff --git a/res/gta5sync_uk.qm b/res/gta5sync_uk.qm index 8026200..a4c2fb6 100644 Binary files a/res/gta5sync_uk.qm and b/res/gta5sync_uk.qm differ diff --git a/res/gta5sync_uk.ts b/res/gta5sync_uk.ts index 0cf68fa..091be8c 100644 --- a/res/gta5sync_uk.ts +++ b/res/gta5sync_uk.ts @@ -356,14 +356,14 @@ Pictures and Savegames - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! Користувацький Аватар - + Custom Picture Custom Picture Description in SC, don't use Special Character! Користувацьке Зображення @@ -1011,37 +1011,37 @@ Y: %2 - + Export as &Picture... Експортувати як &зображення... - + Export as &Snapmatic... Експортувати як &Snapmatic... - + &Edit Properties... &Змінити властивості... - + &Overwrite Image... &Перезаписати зображення... - + Open &Map Viewer... Відкрити &карту... - + Open &JSON Editor... Відкрити редактор &JSON... @@ -1296,23 +1296,23 @@ Press 1 for Default View - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... Імпортування... @@ -1329,90 +1329,90 @@ Press 1 for Default View - + All image files (%1) Файли зображень (%1) - - + + All files (**) Усі файли (**) - + Can't import %1 because file can't be open Неможливо імпортувати %1, оскільки файл не може бути відкритий - + Can't import %1 because file can't be parsed properly Неможливо імпортувати %1, оскільки файл неможливо розібрати правильно - + Enabled pictures: %1 of %2 Увімкнено фотографії:%1 з%2 - + Loading... Завантаження... - + Snapmatic Loader Snapmatic Loader - + <h4>Following Snapmatic Pictures got repaired</h4>%1 <h4>Наступні Snapmatic зображення були відновлені</h4>%1 - + Importable files (%1) Імпортуються файли (%1) - - + + GTA V Export (*.g5e) GTA V Export (*.g5e) - - + + Savegames files (SGTA*) Файли збереження гри (SGTA*) - - + + Snapmatic pictures (PGTA*) Snapmatic зображення (PGTA*) - - - + + + No valid file is selected Вибрані недійсні файли - - + + Import file %1 of %2 files Імпортується файл %1 з %2 файлів - + Import failed with... %1 @@ -1421,81 +1421,81 @@ Press 1 for Default View %1 - - + + Failed to read Snapmatic picture Не вдалося прочитати Snapmatic картинку - - + + Failed to read Savegame file Не вдалося прочитати файл збереження гри - + Can't import %1 because file format can't be detected Неможливо імпортувати%1, оскільки формат файлу не може бути виявлений - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Не вдалося імпортувати зображення Snapmatic, файл не починається з PGTA або закінчується .g5e - + Failed to import the Snapmatic picture, can't copy the file into profile Не вдалося імпортувати зображення Snapmatic, не можна скопіювати файл у профіль - + Failed to import the Savegame, can't copy the file into profile Не вдалося імпортувати Сейв, не можна скопіювати файл у профіль - + Failed to import the Savegame, no Savegame slot is left Не вдалося імпортувати Сейв, немає вільного слота - - - - - + + + + + Export selected... Експорт обраних... - - + + JPG pictures and GTA Snapmatic JPG картинки і GTA Snapmatic - - + + JPG pictures only Тільки JPG картинки - - + + GTA Snapmatic only Тільки GTA Snapmatic - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1 Експортувати Snapmatic фотографії %2 <br><br> Фотографії JPG дозволяють відкривати зображення за допомогою засобу перегляду зображень<br>GTA Snapmatic дає змогу імпортувати зображення в гру<br><br>Експортувати як: - + Initialising export... Ініціалізація експорту... - + Export failed with... %1 @@ -1504,45 +1504,45 @@ Press 1 for Default View %1 - - + + No Snapmatic pictures or Savegames files are selected Не вибрано жодного Snapmatic зображення або файлу збереження - - - + + + Remove selected Видалити вибрані - + You really want remove the selected Snapmatic picutres and Savegame files? Ви дійсно хочете видалити вибрані Snapmatic фотографії та файли збереження гри? - + Failed to remove all selected Snapmatic pictures and/or Savegame files Не вдалося видалити всі обрані Snapmatic фотографії та/або Сейви - - - - - - + + + + + + No Snapmatic pictures are selected Не вибрано жодного Snapmatic зображення - - - - - - + + + + + + %1 failed with... %2 @@ -1552,97 +1552,97 @@ Press 1 for Default View %2 - + Prepare Content for Import... Підготувати контент для імпорту ... - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? Snapmatic зображення з uid %1 вже існує, ви хочете призначити для імпорту новий uid та мітку часу? - - + + Qualify as Avatar Позначити як Аватар - - - - + + + + Patch selected... Вибір патчу... - - - - - - - - + + + + + + + + Patch file %1 of %2 files Патч файлу %1 з %2 файлів - + Qualify %1 failed with... Якість - - + + Change Players... Зміна гравців... - + Change Players %1 failed with... Змінити гравців - - - + + + Change Crew... Зміна банди... - + Failed to enter a valid Snapmatic Crew ID Не вдалося ввести дійсний ID Банди Snapmatic - + Change Crew %1 failed with... Змінити банду - - - + + + Change Title... Зміна назви... - + Failed to enter a valid Snapmatic title Не вдалося ввести дійсний заголовок Snapmatic - + Change Title %1 failed with... Змінити назву - + All profile files (*.g5e SGTA* PGTA*) Усі файли зображень (*.g5e SGTA* PGTA*) @@ -1736,37 +1736,37 @@ Press 1 for Default View Видалити - + &View &Перегляд - + &Export &Експорт - + &Remove &Видалення - + &Select &Виділення - + &Deselect &Зняти виділення - + Select &All Вибрати &усі - + &Deselect All &Зняти виділення усіх @@ -1971,25 +1971,25 @@ Press 1 for Default View Змінити властивості Snapmatic не вдалося через JSON Помилку - + Snapmatic Crew Snapmatic банда - + New Snapmatic crew: Нова Snapmatic банда: - + Snapmatic Title Snapmatic назва - + New Snapmatic title: Новий Snapmatic заголовок: @@ -2046,64 +2046,64 @@ Press 1 for Default View SnapmaticPicture - + JSON is incomplete and malformed JSON неповний та неправильний - + JSON is incomplete JSON неповний - + JSON is malformed JSON неправильний - + PHOTO - %1 ФОТО - %1 - + open file %1 відкрити файл%1 - + header not exists заголовок не існує - + header is malformed заголовок неправильний - + picture not exists (%1) зображення не існує (%1) - + JSON not exists (%1) JSON не існує (%1) - + title not exists (%1) заголовок не існує (%1) - + description not exists (%1) опис не існує (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error читання файлу %1 тому що %2 @@ -2164,52 +2164,52 @@ Press 1 for Default View Видалити - + Edi&t Редагува&ти - + Show &In-game Показати &у грі - + Hide &In-game Сховати &у грі - + &Export &Експортувати - + &View &Переглянути - + &Remove &Видалити - + &Select &Виділення - + &Deselect &Зняти виділення - + Select &All Вибрати &усі - + &Deselect All &Зняти виділення усіх @@ -2294,7 +2294,7 @@ Press 1 for Default View - + &Close &Закрити @@ -2331,7 +2331,7 @@ Press 1 for Default View - + &About %1 &Про %1 @@ -2387,15 +2387,15 @@ Press 1 for Default View - + Select &GTA V Folder... Вибрати &GTA V теку... - - + + Select GTA V Folder... Вибрати GTA V теку... @@ -2430,46 +2430,46 @@ Press 1 for Default View Змінити &гравців... - - + + Show In-game Показати у грі - - + + Hide In-game Сховати у грі - - + + Select Profile Вибрати профіль - + Open File... Відкрити файл... - - - - + + + + Open File Відкрити файл - + Can't open %1 because of not valid file format Неможливо відкрити %1 через невідомий формат файлу - + %1 - Messages %1 - Новини diff --git a/res/gta5sync_zh_TW.qm b/res/gta5sync_zh_TW.qm index bfc1b23..eb93072 100644 Binary files a/res/gta5sync_zh_TW.qm and b/res/gta5sync_zh_TW.qm differ diff --git a/res/gta5sync_zh_TW.ts b/res/gta5sync_zh_TW.ts index 699c74d..2f0a58f 100644 --- a/res/gta5sync_zh_TW.ts +++ b/res/gta5sync_zh_TW.ts @@ -352,14 +352,14 @@ Pictures and Savegames - + Custom Avatar Custom Avatar Description in SC, don't use Special Character! 自訂大頭貼 - + Custom Picture Custom Picture Description in SC, don't use Special Character! 自訂圖片 @@ -1005,37 +1005,37 @@ Y: %2 - + Export as &Picture... 匯出成圖片(&P)... - + Export as &Snapmatic... 匯出成 Snapmatic(&S)... - + &Edit Properties... 編輯屬性(&E) ... - + &Overwrite Image... 修改圖片(&O)... - + Open &Map Viewer... 開啟地圖檢視器(&M)... - + Open &JSON Editor... 開啟 JSON 編輯器(&J)... @@ -1290,23 +1290,23 @@ Press 1 for Default View - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Import... 匯入... @@ -1323,216 +1323,216 @@ Press 1 for Default View - + All image files (%1) 所有圖片 (%1) - - + + All files (**) 所有檔案 (**) - + Can't import %1 because file can't be open 無法匯入 %1,因為檔案無法開啟 - + Can't import %1 because file can't be parsed properly 無法匯入 %1,因為檔案無法正確解析 - + Enabled pictures: %1 of %2 開啟圖片 %1 共 %2 - + Loading... 載入中... - + Snapmatic Loader Snapmatic 載入器 - + <h4>Following Snapmatic Pictures got repaired</h4>%1 <h4>下列的 Snapmatic 圖片已被更新</h4>%1 - + Importable files (%1) 可匯入的檔案 (%1) - - + + GTA V Export (*.g5e) GTA V Export (*.g5e) - - + + Savegames files (SGTA*) 遊戲存檔 (SGTA*) - - + + Snapmatic pictures (PGTA*) Snapmatic 圖片 (PGTA*) - - - + + + No valid file is selected 沒有選擇有效的檔案 - - + + Import file %1 of %2 files 匯入檔案 %1 共 %2 個 - + Import failed with... %1 %1 匯入失敗 - - + + Failed to read Snapmatic picture 無法讀取 Snapmatic 圖片 - - + + Failed to read Savegame file 無法讀取遊戲存檔 - + Can't import %1 because file format can't be detected 無法匯入 %1,因為無法檢測該檔案格式 - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e 匯入 Snapmatic 圖片失敗,檔案不是 PGTA 開頭或附檔名不是 .g5e - + Failed to import the Snapmatic picture, can't copy the file into profile 匯入 Snapmatic 圖片失敗,無法將該檔案複製到設定檔中 - + Failed to import the Savegame, can't copy the file into profile 匯入遊戲存檔失敗,無法將該檔案複製到設定檔中 - + Failed to import the Savegame, no Savegame slot is left 匯入遊戲存檔失敗,沒有遊戲存檔欄位 - - - - - + + + + + Export selected... 匯出所選... - - + + JPG pictures and GTA Snapmatic JPG 圖片和 GTA Snapmatic - - + + JPG pictures only 只有 JPG 圖片 - - + + GTA Snapmatic only 只有 GTA Snapmatic - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1 匯出 Snapmatic 圖片 %2<br><br>JPG 圖片可使用圖片檢視器開啟<br>GTA Snapmatic 可以匯入到遊戲中<br><br>匯出成: - + Initialising export... 初始化... - + Export failed with... %1 %1 匯出失敗 - - + + No Snapmatic pictures or Savegames files are selected 未選擇 Snapmatic 圖片或遊戲存檔 - - - + + + Remove selected 移除所選 - + You really want remove the selected Snapmatic picutres and Savegame files? 你想移除所選的 Snapmatic 圖片/存檔嗎? - + Failed to remove all selected Snapmatic pictures and/or Savegame files 無法移除所選擇的 Snapmatic 圖片/遊戲存檔 - - - - - - + + + + + + No Snapmatic pictures are selected 未選擇 Snapmatic 圖片 - - - - - - + + + + + + %1 failed with... %2 @@ -1542,97 +1542,97 @@ Press 1 for Default View %2 - + Prepare Content for Import... 準備匯入內容... - + A Snapmatic picture already exists with the uid %1, you want assign your import a new uid and timestamp? 已有與 uid %1 相同的 Snapmatic 圖片,你想要匯入新的 uid 和時間戳嗎? - - + + Qualify as Avatar 合格大頭貼 - - - - + + + + Patch selected... 修改所選... - - - - - - - - + + + + + + + + Patch file %1 of %2 files 修改檔案 %1 共 %2 個檔案 - + Qualify %1 failed with... 合格 - - + + Change Players... 更改玩家... - + Change Players %1 failed with... 更改玩家 - - - + + + Change Crew... 更改幫會... - + Failed to enter a valid Snapmatic Crew ID 輸入了無效的幫會 ID - + Change Crew %1 failed with... 更改幫會 - - - + + + Change Title... 更改標題... - + Failed to enter a valid Snapmatic title 輸入了無效的標題 - + Change Title %1 failed with... 更改標題 - + All profile files (*.g5e SGTA* PGTA*) 所有設定檔檔案 (*.g5e SGTA* PGTA*) @@ -1726,37 +1726,37 @@ Press 1 for Default View 刪除 - + &View 檢視(&V) - + &Export 匯出(&E) - + &Remove 移除(&R) - + &Select 選擇(&S) - + &Deselect 取消選擇(&D) - + Select &All 選擇全部(&A) - + &Deselect All 取消選擇全部(&D) @@ -1961,25 +1961,25 @@ Press 1 for Default View JSON 錯誤,未能更新 Snapmatic 屬性 - + Snapmatic Crew 幫會 - + New Snapmatic crew: 輸入新的幫會: - + Snapmatic Title 標題 - + New Snapmatic title: 輸入新的標題: @@ -2036,64 +2036,64 @@ Press 1 for Default View SnapmaticPicture - + JSON is incomplete and malformed JSON 不完整和異常 - + JSON is incomplete JSON 不完整 - + JSON is malformed JSON 異常 - + PHOTO - %1 照片 - %1 - + open file %1 開啟檔案 - %1 - + header not exists 標頭不存在 - + header is malformed 標頭異常 - + picture not exists (%1) 圖片不存在 (%1) - + JSON not exists (%1) JSON 不存在 (%1) - + title not exists (%1) 標題不存在 (%1) - + description not exists (%1) 描述不存在 (%1) - + reading file %1 because of %2 Example for %2: JSON is malformed error 讀取檔案 %1 失敗,因為 %2 @@ -2154,52 +2154,52 @@ Press 1 for Default View 刪除 - + Edi&t 編輯(&E) - + Show &In-game 在遊戲中顯示(&I) - + Hide &In-game 在遊戲中隱藏(&I) - + &Export 匯出(&E) - + &View 檢視(&V) - + &Remove 移除(&R) - + &Select 選擇(&S) - + &Deselect 取消選擇(&D) - + Select &All 選擇全部(&A) - + &Deselect All 取消選擇全部(&D) @@ -2283,7 +2283,7 @@ Press 1 for Default View - + &Close 關閉(&C) @@ -2320,7 +2320,7 @@ Press 1 for Default View - + &About %1 關於 %1(&A) @@ -2376,15 +2376,15 @@ Press 1 for Default View - + Select &GTA V Folder... 選擇 GTA V 資料夾(&G)... - - + + Select GTA V Folder... 選擇 GTA V 資料夾... @@ -2419,46 +2419,46 @@ Press 1 for Default View 更改玩家(&P)... - - + + Show In-game 在遊戲中顯示 - - + + Hide In-game 在遊戲中隱藏 - - + + Select Profile 選擇設定檔 - + Open File... 開啟檔案... - - - - + + + + Open File 開啟檔案 - + Can't open %1 because of not valid file format 格式無效,無法開啟 %1 - + %1 - Messages %1 - 新聞