From ecb616a739d04dace54f9c6afd04c6ed34aa5479 Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Fri, 15 Oct 2021 10:35:49 +0300 Subject: Fix dependencies example exception Dependencies example creates a local repository. The example was failing in Windows because QFile was not able to rename the file when creating a local repository as it was open by Lib7zArchive. Task-number: QTIFW-2362 Change-Id: I7d118707c0d770e67b5a71167b9818fbcccc599f Reviewed-by: Arttu Tarkiainen --- src/libs/installer/createlocalrepositoryoperation.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/libs/installer/createlocalrepositoryoperation.cpp b/src/libs/installer/createlocalrepositoryoperation.cpp index a40838178..576e4fa3d 100644 --- a/src/libs/installer/createlocalrepositoryoperation.cpp +++ b/src/libs/installer/createlocalrepositoryoperation.cpp @@ -129,6 +129,7 @@ static QString createArchive(const QString repoPath, const QString &sourceDir, c throw Error(CreateLocalRepositoryOperation::tr("Cannot create archive \"%1\": %2") .arg(QDir::toNativeSeparators(archive.fileName()), archiveFile.errorString())); } + archiveFile.close(); removeFiles(sourceDir, helper); // cleanup the files we compressed if (!archive.rename(sourceDir + fileName)) { throw Error(CreateLocalRepositoryOperation::tr("Cannot move file \"%1\" to \"%2\": %3") -- cgit v1.2.3 From f8bebde7599a12becffac6c6dbfa58f0d584bc01 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Mon, 18 Oct 2021 09:57:38 +0000 Subject: Revert "Show messages from lcPackageInfo logging category regardless of verbosity" This reverts commit fae6c9901645d6ae6acdeaf843e542385318a1d8. Reason for revert: updateinfo plugin also sets QT_LOGGING_RULES=*=false, meaning the printing is still suppressed. Change-Id: I5f14d471221a32c58d028be5f06a199422dca7d4 Reviewed-by: Katja Marttila --- src/libs/installer/loggingutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/libs/installer/loggingutils.cpp b/src/libs/installer/loggingutils.cpp index 6e7bff44a..45f7aab1b 100644 --- a/src/libs/installer/loggingutils.cpp +++ b/src/libs/installer/loggingutils.cpp @@ -160,7 +160,7 @@ void LoggingHandler::messageHandler(QtMsgType type, const QMessageLogContext &co if (VerboseWriter *log = VerboseWriter::instance()) log->appendLine(ba); - if (type != QtDebugMsg || isVerbose() || context.category == lcPackageInfo().categoryName()) + if (type != QtDebugMsg || isVerbose()) std::cout << qPrintable(ba) << std::endl; if (type == QtFatalMsg) { -- cgit v1.2.3 From 4066fbebcabbdf591c2fc525343f8f78486457d2 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Mon, 18 Oct 2021 17:28:49 +0300 Subject: Print essential component information with std::cout Do not use our own message handler for printing XML-formatted component information (from 'list', 'search', 'check-updates') that is expected to be included in output regardless of the current verbosity level or logging rules. Higher verbosity can still add more information to be included in output. Also: - Modify auto-tests to pass and check the output correctly. - Remove now orphaned 'ifw.package.info' logging category. - Rename 'LoggingHandler::printComponentInformation()' to 'printUpdateInformation()' to better match the intended purpose. Task-number: QTIFW-2349 Change-Id: Id1a868f8f824c606825cd6168974a7e3845383e6 Reviewed-by: Katja Marttila --- src/libs/installer/globals.cpp | 7 ------- src/libs/installer/globals.h | 1 - src/libs/installer/loggingutils.cpp | 15 ++++++--------- src/libs/installer/loggingutils.h | 2 +- src/sdk/commandlineinterface.cpp | 2 +- src/sdk/sdkapp.h | 9 +++------ 6 files changed, 11 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/libs/installer/globals.cpp b/src/libs/installer/globals.cpp index 0da4bc3b6..adf1d2f6e 100644 --- a/src/libs/installer/globals.cpp +++ b/src/libs/installer/globals.cpp @@ -33,7 +33,6 @@ const char IFW_SERVER[] = "ifw.server"; const char IFW_INSTALLER_INSTALLLOG[] = "ifw.installer.installlog"; const char IFW_DEVELOPER_BUILD[] = "ifw.developer.build"; -const char IFW_PACKAGE_INFO[] = "ifw.package.info"; // Internal-only, hidden in --help text const char IFW_PROGRESS_INDICATOR[] = "ifw.progress.indicator"; @@ -61,16 +60,10 @@ namespace QInstaller \internal */ -/*! - \fn QInstaller::lcPackageInfo() - \internal -*/ - Q_LOGGING_CATEGORY(lcServer, IFW_SERVER) Q_LOGGING_CATEGORY(lcInstallerInstallLog, IFW_INSTALLER_INSTALLLOG) Q_LOGGING_CATEGORY(lcProgressIndicator, IFW_PROGRESS_INDICATOR) Q_LOGGING_CATEGORY(lcDeveloperBuild, IFW_DEVELOPER_BUILD) -Q_LOGGING_CATEGORY(lcPackageInfo, IFW_PACKAGE_INFO) /*! Returns available logging categories. diff --git a/src/libs/installer/globals.h b/src/libs/installer/globals.h index 5053f6d9f..b22331e2c 100644 --- a/src/libs/installer/globals.h +++ b/src/libs/installer/globals.h @@ -40,7 +40,6 @@ INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcInstallerInstallLog) INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcProgressIndicator) INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcDeveloperBuild) -INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageInfo) QStringList INSTALLER_EXPORT loggingCategories(); diff --git a/src/libs/installer/loggingutils.cpp b/src/libs/installer/loggingutils.cpp index 45f7aab1b..a2b561c53 100644 --- a/src/libs/installer/loggingutils.cpp +++ b/src/libs/installer/loggingutils.cpp @@ -145,10 +145,7 @@ void LoggingHandler::messageHandler(QtMsgType type, const QMessageLogContext &co static Uptime uptime; - QString ba; - if (context.category != lcPackageInfo().categoryName()) { - ba = QLatin1Char('[') + QString::number(uptime.elapsed()) + QStringLiteral("] "); - } + QString ba = QLatin1Char('[') + QString::number(uptime.elapsed()) + QStringLiteral("] "); ba += trimAndPrepend(type, msg); if (type != QtDebugMsg && context.file) { @@ -251,9 +248,9 @@ bool LoggingHandler::outputRedirected() const } /*! - Prints basic information about \a components. + Prints update information from \a components. */ -void LoggingHandler::printComponentInfo(const QList components) const +void LoggingHandler::printUpdateInformation(const QList components) const { QDomDocument doc; QDomElement root = doc.createElement(QLatin1String("updates")); @@ -267,7 +264,7 @@ void LoggingHandler::printComponentInfo(const QList components) con update.setAttribute(QLatin1String("id"), component->value(scName)); root.appendChild(update); } - qCDebug(lcPackageInfo) << qPrintable(doc.toString(4)); + std::cout << qPrintable(doc.toString(4)); } /*! @@ -297,7 +294,7 @@ void LoggingHandler::printLocalPackageInformation(const QList components) const; + void printUpdateInformation(const QList components) const; void printLocalPackageInformation(const QList &packages) const; void printPackageInformation(const PackagesList &matchedPackages, const LocalPackagesHash &installedPackages) const; diff --git a/src/sdk/commandlineinterface.cpp b/src/sdk/commandlineinterface.cpp index a63b2a5bf..6b674364c 100644 --- a/src/sdk/commandlineinterface.cpp +++ b/src/sdk/commandlineinterface.cpp @@ -108,7 +108,7 @@ int CommandLineInterface::checkUpdates() qCWarning(QInstaller::lcInstallerInstallLog) << "There are currently no updates available."; return EXIT_SUCCESS; } - QInstaller::LoggingHandler::instance().printComponentInfo(components); + QInstaller::LoggingHandler::instance().printUpdateInformation(components); return EXIT_SUCCESS; } diff --git a/src/sdk/sdkapp.h b/src/sdk/sdkapp.h index 60eca8103..0c09897d7 100644 --- a/src/sdk/sdkapp.h +++ b/src/sdk/sdkapp.h @@ -149,18 +149,15 @@ public: loggingRules = QLatin1String("ifw.* = false\n" "ifw.installer.* = true\n" "ifw.server = true\n" - "ifw.progress.indicator = true\n" - "ifw.package.* = true\n"); + "ifw.progress.indicator = true\n"); } else { // enable all except detailed package information and developer specific logging loggingRules = QLatin1String("ifw.* = true\n" - "ifw.developer.build = false\n" - "ifw.package.* = true\n"); + "ifw.developer.build = false\n"); } if (QInstaller::LoggingHandler::instance().verboseLevel() == QInstaller::LoggingHandler::Detailed) { - loggingRules += QLatin1String("\nifw.developer.build = true\n" - "ifw.package.* = true\n"); + loggingRules += QLatin1String("\nifw.developer.build = true\n"); } QLoggingCategory::setFilterRules(loggingRules); qCDebug(QInstaller::lcInstallerInstallLog).noquote() << "Arguments:" << -- cgit v1.2.3 From 9cf92b4cd273be55c056253b8e4a3a57e13195a8 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Mon, 25 Oct 2021 15:28:09 +0300 Subject: Add support for seeking files handled with libarchive This fixes losing executable bits of files in Zip archives when extracted. Zip archives store file metadata in two ways, partial metadata per-entry and full metadata at the end of archive. IFW's read implementation previously did only streaming without support for seeking archives, which is required to obtain full metadata - meaning the partial metadata was used instead by libarchive's Zip reader. The extracted entries between the two metadata types are not consistent. This change also enables usage of archive formats that cannot be accurately handled with a streaming model, like 7zip which needs to read key data from the end of the file before reading file data from the beginning. Task-number: QTIFW-2372 Change-Id: Ie4ed33040fc52de073546e46d9da726816f47a81 Reviewed-by: Katja Marttila --- src/libs/installer/libarchivearchive.cpp | 116 ++++++++++++++++++++++++-- src/libs/installer/libarchivearchive.h | 11 +++ src/libs/installer/libarchivewrapper_p.cpp | 47 +++++++++++ src/libs/installer/libarchivewrapper_p.h | 3 + src/libs/installer/protocol.h | 2 + src/libs/installer/remoteserverconnection.cpp | 4 + src/libs/installer/remoteserverconnection_p.h | 10 +++ 7 files changed, 188 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/libs/installer/libarchivearchive.cpp b/src/libs/installer/libarchivearchive.cpp index ad5609490..0d2619c7d 100644 --- a/src/libs/installer/libarchivearchive.cpp +++ b/src/libs/installer/libarchivearchive.cpp @@ -32,6 +32,8 @@ #include "errors.h" #include "globals.h" +#include + #include #include #include @@ -93,7 +95,11 @@ void ExtractWorker::extract(const QString &dirPath, const quint64 totalFiles) foreach (const QString &directory, createdDirs) emit currentEntryChanged(directory); - int status = archive_read_open(reader.get(), this, nullptr, readCallback, nullptr); + archive_read_set_read_callback(reader.get(), readCallback); + archive_read_set_callback_data(reader.get(), this); + archive_read_set_seek_callback(reader.get(), seekCallback); + + int status = archive_read_open1(reader.get()); if (status != ARCHIVE_OK) { m_status = Failure; emit finished(QLatin1String(archive_error_string(reader.get()))); @@ -142,6 +148,12 @@ void ExtractWorker::addDataBlock(const QByteArray buffer) emit dataReadyForRead(); } +void ExtractWorker::onFilePositionChanged(qint64 pos) +{ + m_lastPos = pos; + emit seekReady(); +} + void ExtractWorker::cancel() { m_status = Canceled; @@ -177,6 +189,26 @@ ssize_t ExtractWorker::readCallback(archive *reader, void *caller, const void ** return buffer->size(); } +la_int64_t ExtractWorker::seekCallback(archive *reader, void *caller, la_int64_t offset, int whence) +{ + Q_UNUSED(reader) + + ExtractWorker *obj; + if (!(obj = static_cast(caller))) + return ARCHIVE_FATAL; + + emit obj->seekRequested(static_cast(offset), whence); + + { + QEventLoop loop; + QTimer::singleShot(30000, &loop, &QEventLoop::quit); + connect(obj, &ExtractWorker::seekReady, &loop, &QEventLoop::quit); + loop.exec(); + } + + return static_cast(obj->m_lastPos); +} + bool ExtractWorker::writeEntry(archive *reader, archive *writer, archive_entry *entry) { int status; @@ -234,6 +266,13 @@ bool ExtractWorker::writeEntry(archive *reader, archive *writer, archive_entry * Emitted when the worker object requires more data to continue extracting. */ +/*! + \fn QInstaller::LibArchiveArchive::seekRequested(qint64 offset, int whence) + + Emitted when the worker object requires a seek to \a offset to continue extracting. + The \a whence value defines the starting position for \a offset. +*/ + /*! \fn QInstaller::LibArchiveArchive::workerFinished() @@ -266,6 +305,12 @@ bool ExtractWorker::writeEntry(archive *reader, archive *writer, archive_entry * Emitted when the worker object is about to cancel extracting. */ +/*! + \fn QInstaller::LibArchiveArchive::workerAboutToSetFilePosition(qint64 pos) + + Emitted when the worker object is about to set new file position \a pos. +*/ + /*! Constructs an archive object representing an archive file specified by \a filename with \a parent as the parent object. @@ -377,7 +422,7 @@ bool LibArchiveArchive::extract(const QString &dirPath, const quint64 totalFiles foreach (const QString &directory, createdDirs) emit currentEntryChanged(directory); - int status = archive_read_open(reader.get(), m_data, nullptr, readCallback, nullptr); + int status = archiveReadOpenWithCallbacks(reader.get()); if (status != ARCHIVE_OK) throw Error(QLatin1String(archive_error_string(reader.get()))); @@ -496,7 +541,7 @@ QVector LibArchiveArchive::list() QVector entries; try { - int status = archive_read_open(reader.get(), m_data, nullptr, readCallback, nullptr); + int status = archiveReadOpenWithCallbacks(reader.get()); if (status != ARCHIVE_OK) throw Error(QLatin1String(archive_error_string(reader.get()))); @@ -537,7 +582,7 @@ bool LibArchiveArchive::isSupported() configureReader(reader.get()); try { - const int status = archive_read_open(reader.get(), m_data, nullptr, readCallback, nullptr); + const int status = archiveReadOpenWithCallbacks(reader.get()); if (status != ARCHIVE_OK) throw Error(QLatin1String(archive_error_string(reader.get()))); } catch (const Error &e) { @@ -574,6 +619,14 @@ void LibArchiveArchive::workerSetDataAtEnd() emit workerAboutToSetDataAtEnd(); } +/*! + Signals the worker object that the client file position changed to \a pos. +*/ +void LibArchiveArchive::workerSetFilePosition(qint64 pos) +{ + emit workerAboutToSetFilePosition(pos); +} + /*! Cancels the extract in progress for the worker object. */ @@ -672,9 +725,11 @@ void LibArchiveArchive::initExtractWorker() connect(this, &LibArchiveArchive::workerAboutToExtract, &m_worker, &ExtractWorker::extract); connect(this, &LibArchiveArchive::workerAboutToAddDataBlock, &m_worker, &ExtractWorker::addDataBlock); connect(this, &LibArchiveArchive::workerAboutToSetDataAtEnd, &m_worker, &ExtractWorker::dataAtEnd); + connect(this, &LibArchiveArchive::workerAboutToSetFilePosition, &m_worker, &ExtractWorker::onFilePositionChanged); connect(this, &LibArchiveArchive::workerAboutToCancel, &m_worker, &ExtractWorker::cancel); connect(&m_worker, &ExtractWorker::dataBlockRequested, this, &LibArchiveArchive::dataBlockRequested); + connect(&m_worker, &ExtractWorker::seekRequested, this, &LibArchiveArchive::seekRequested); connect(&m_worker, &ExtractWorker::finished, this, &LibArchiveArchive::onWorkerFinished); connect(&m_worker, &ExtractWorker::currentEntryChanged, this, &LibArchiveArchive::currentEntryChanged); @@ -683,6 +738,20 @@ void LibArchiveArchive::initExtractWorker() m_workerThread.start(); } +/*! + \internal + + Sets default callbacks for archive \a reader and opens for reading. +*/ +int LibArchiveArchive::archiveReadOpenWithCallbacks(archive *reader) +{ + archive_read_set_read_callback(reader, readCallback); + archive_read_set_callback_data(reader, m_data); + archive_read_set_seek_callback(reader, seekCallback); + + return archive_read_open1(reader); +} + /*! Writes the current \a entry header, then pulls data from the archive \a reader and writes it to the \a writer handle. @@ -766,6 +835,43 @@ ssize_t LibArchiveArchive::readCallback(archive *reader, void *archiveData, cons return readData(&data->file, data->buffer.data(), data->buffer.size()); } +/*! + \internal + + Seeks to specified \a offset in the file device in \a archiveData and returns the position. + Possible \a whence values are \c SEEK_SET, \c SEEK_CUR, and \c SEEK_END. Returns + \c ARCHIVE_FATAL if the seek fails. +*/ +la_int64_t LibArchiveArchive::seekCallback(archive *reader, void *archiveData, la_int64_t offset, int whence) +{ + Q_UNUSED(reader) + + ArchiveData *data; + if (!(data = static_cast(archiveData))) + return ARCHIVE_FATAL; + + if (!data->file.isOpen() || data->file.isSequential()) + return ARCHIVE_FATAL; + + switch (whence) { + case SEEK_SET: // moves file pointer position to the beginning of the file + if (!data->file.seek(offset)) + return ARCHIVE_FATAL; + break; + case SEEK_CUR: // moves file pointer position to given location + if (!data->file.seek(data->file.pos() + offset)) + return ARCHIVE_FATAL; + break; + case SEEK_END: // moves file pointer position to the end of file + if (!data->file.seek(data->file.size() + offset)) + return ARCHIVE_FATAL; + break; + default: + return ARCHIVE_FATAL; + } + return data->file.pos(); +} + /*! Returns the \a path to a file or directory, without the Win32 namespace prefix. On Unix platforms, the \a path is returned unaltered. @@ -794,7 +900,7 @@ quint64 LibArchiveArchive::totalFiles() configureReader(reader.get()); try { - int status = archive_read_open(reader.get(), m_data, nullptr, readCallback, nullptr); + int status = archiveReadOpenWithCallbacks(reader.get()); if (status != ARCHIVE_OK) throw Error(QLatin1String(archive_error_string(reader.get()))); diff --git a/src/libs/installer/libarchivearchive.h b/src/libs/installer/libarchivearchive.h index e0281e655..796069ed1 100644 --- a/src/libs/installer/libarchivearchive.h +++ b/src/libs/installer/libarchivearchive.h @@ -64,12 +64,15 @@ public: public Q_SLOTS: void extract(const QString &dirPath, const quint64 totalFiles); void addDataBlock(const QByteArray buffer); + void onFilePositionChanged(qint64 pos); void cancel(); Q_SIGNALS: void dataBlockRequested(); void dataAtEnd(); void dataReadyForRead(); + void seekRequested(qint64 offset, int whence); + void seekReady(); void finished(const QString &errorString = QString()); void currentEntryChanged(const QString &filename); @@ -77,10 +80,12 @@ Q_SIGNALS: private: static ssize_t readCallback(archive *reader, void *caller, const void **buff); + static la_int64_t seekCallback(archive *reader, void *caller, la_int64_t offset, int whence); bool writeEntry(archive *reader, archive *writer, archive_entry *entry); private: QByteArray m_buffer; + qint64 m_lastPos = 0; Status m_status; }; @@ -107,16 +112,19 @@ public: void workerExtract(const QString &dirPath, const quint64 totalFiles); void workerAddDataBlock(const QByteArray buffer); void workerSetDataAtEnd(); + void workerSetFilePosition(qint64 pos); void workerCancel(); ExtractWorker::Status workerStatus() const; Q_SIGNALS: void dataBlockRequested(); + void seekRequested(qint64 offset, int whence); void workerFinished(); void workerAboutToExtract(const QString &dirPath, const quint64 totalFiles); void workerAboutToAddDataBlock(const QByteArray buffer); void workerAboutToSetDataAtEnd(); + void workerAboutToSetFilePosition(qint64 pos); void workerAboutToCancel(); public Q_SLOTS: @@ -133,11 +141,14 @@ private: void initExtractWorker(); + int archiveReadOpenWithCallbacks(archive *reader); bool writeEntry(archive *reader, archive *writer, archive_entry *entry); static qint64 readData(QFile *file, char *data, qint64 maxSize); static ssize_t readCallback(archive *reader, void *archiveData, const void **buff); + static la_int64_t seekCallback(archive *reader, void *archiveData, la_int64_t offset, int whence); + static QString pathWithoutNamespace(const QString &path); quint64 totalFiles(); diff --git a/src/libs/installer/libarchivewrapper_p.cpp b/src/libs/installer/libarchivewrapper_p.cpp index 5509812cf..942e948e8 100644 --- a/src/libs/installer/libarchivewrapper_p.cpp +++ b/src/libs/installer/libarchivewrapper_p.cpp @@ -247,6 +247,10 @@ void LibArchiveWrapperPrivate::processSignals() emit completedChanged(completed, total); } else if (name == QLatin1String(Protocol::AbstractArchiveSignalDataBlockRequested)) { emit dataBlockRequested(); + } else if (name == QLatin1String(Protocol::AbstractArchiveSignalSeekRequested)) { + const qint64 offset = receivedSignals.takeFirst().value(); + const int whence = receivedSignals.takeFirst().value(); + emit seekRequested(offset, whence); } else if (name == QLatin1String(Protocol::AbstractArchiveSignalWorkerFinished)) { emit remoteWorkerFinished(); } @@ -293,6 +297,35 @@ void LibArchiveWrapperPrivate::onDataBlockRequested() addDataBlock(*buff); } +/*! + Seeks to specified \a offset in the underlying file device. Possible \a whence + values are \c SEEK_SET, \c SEEK_CUR, and \c SEEK_END. +*/ +void LibArchiveWrapperPrivate::onSeekRequested(qint64 offset, int whence) +{ + QFile *const file = &m_archive.m_data->file; + if (!file->isOpen() || file->isSequential()) { + qCWarning(QInstaller::lcInstallerInstallLog) << file->errorString(); + setClientFilePosition(ARCHIVE_FATAL); + return; + } + bool success = false; + switch (whence) { + case SEEK_SET: // moves file pointer position to the beginning of the file + success = file->seek(offset); + break; + case SEEK_CUR: // moves file pointer position to given location + success = file->seek(file->pos() + offset); + break; + case SEEK_END: // moves file pointer position to the end of file + success = file->seek(file->size() + offset); + break; + default: + break; + } + setClientFilePosition(success ? file->pos() : ARCHIVE_FATAL); +} + /*! Starts the timer to process server-side signals and connects handler signals for the matching signals of the wrapper object. @@ -310,6 +343,8 @@ void LibArchiveWrapperPrivate::init() QObject::connect(this, &LibArchiveWrapperPrivate::dataBlockRequested, this, &LibArchiveWrapperPrivate::onDataBlockRequested); + QObject::connect(this, &LibArchiveWrapperPrivate::seekRequested, + this, &LibArchiveWrapperPrivate::onSeekRequested); } /*! @@ -337,6 +372,18 @@ void LibArchiveWrapperPrivate::setClientDataAtEnd() } } +/*! + Calls a remote method to set new file position \a pos. +*/ +void LibArchiveWrapperPrivate::setClientFilePosition(qint64 pos) +{ + if (connectToServer()) { + m_lock.lockForWrite(); + callRemoteMethod(QLatin1String(Protocol::AbstractArchiveSetFilePosition), pos, dummy); + m_lock.unlock(); + } +} + /*! Calls a remote method to retrieve and return the status of the extract worker on a server process. diff --git a/src/libs/installer/libarchivewrapper_p.h b/src/libs/installer/libarchivewrapper_p.h index ea8409da0..722c91f17 100644 --- a/src/libs/installer/libarchivewrapper_p.h +++ b/src/libs/installer/libarchivewrapper_p.h @@ -66,6 +66,7 @@ Q_SIGNALS: void currentEntryChanged(const QString &filename); void completedChanged(const quint64 completed, const quint64 total); void dataBlockRequested(); + void seekRequested(qint64 offset, int whence); void remoteWorkerFinished(); public Q_SLOTS: @@ -74,12 +75,14 @@ public Q_SLOTS: private Q_SLOTS: void processSignals(); void onDataBlockRequested(); + void onSeekRequested(qint64 offset, int whence); private: void init(); void addDataBlock(const QByteArray &buffer); void setClientDataAtEnd(); + void setClientFilePosition(qint64 pos); ExtractWorker::Status workerStatus() const; private: diff --git a/src/libs/installer/protocol.h b/src/libs/installer/protocol.h index c7eb9a308..65241e00b 100644 --- a/src/libs/installer/protocol.h +++ b/src/libs/installer/protocol.h @@ -177,6 +177,7 @@ const char AbstractArchiveIsSupported[] = "AbstractArchive::isSupported"; const char AbstractArchiveSetCompressionLevel[] = "AbstractArchive::setCompressionLevel"; const char AbstractArchiveAddDataBlock[] = "AbstractArchive::addDataBlock"; const char AbstractArchiveSetClientDataAtEnd[] = "AbstractArchive::setClientDataAtEnd"; +const char AbstractArchiveSetFilePosition[] = "AbstractArchive::setFilePosition"; const char AbstractArchiveWorkerStatus[] = "AbstractArchive::workerStatus"; const char AbstractArchiveCancel[] = "AbstractArchive::cancel"; @@ -184,6 +185,7 @@ const char GetAbstractArchiveSignals[] = "GetAbstractArchiveSignals"; const char AbstractArchiveSignalCurrentEntryChanged[] = "AbstractArchive::currentEntryChanged"; const char AbstractArchiveSignalCompletedChanged[] = "AbstractArchive::completedChanged"; const char AbstractArchiveSignalDataBlockRequested[] = "AbstractArchive::dataBlockRequested"; +const char AbstractArchiveSignalSeekRequested[] = "AbstractArchive::seekRequested"; const char AbstractArchiveSignalWorkerFinished[] = "AbstractArchive::workerFinished"; } // namespace Protocol diff --git a/src/libs/installer/remoteserverconnection.cpp b/src/libs/installer/remoteserverconnection.cpp index 5d72f834d..9e141ea48 100644 --- a/src/libs/installer/remoteserverconnection.cpp +++ b/src/libs/installer/remoteserverconnection.cpp @@ -596,6 +596,10 @@ void RemoteServerConnection::handleArchive(QIODevice *socket, const QString &com archive->workerAddDataBlock(buff); } else if (command == QLatin1String(Protocol::AbstractArchiveSetClientDataAtEnd)) { archive->workerSetDataAtEnd(); + } else if (command == QLatin1String(Protocol::AbstractArchiveSetFilePosition)) { + qint64 pos; + data >> pos; + archive->workerSetFilePosition(pos); } else if (command == QLatin1String(Protocol::AbstractArchiveWorkerStatus)) { sendData(socket, static_cast(archive->workerStatus())); } else if (command == QLatin1String(Protocol::AbstractArchiveCancel)) { diff --git a/src/libs/installer/remoteserverconnection_p.h b/src/libs/installer/remoteserverconnection_p.h index dc6d794b6..977a64711 100644 --- a/src/libs/installer/remoteserverconnection_p.h +++ b/src/libs/installer/remoteserverconnection_p.h @@ -143,6 +143,8 @@ private: this, &AbstractArchiveSignalReceiver::onCompletedChanged); connect(archive, &LibArchiveArchive::dataBlockRequested, this, &AbstractArchiveSignalReceiver::onDataBlockRequested); + connect(archive, &LibArchiveArchive::seekRequested, + this, &AbstractArchiveSignalReceiver::onSeekRequested); connect(archive, &LibArchiveArchive::workerFinished, this, &AbstractArchiveSignalReceiver::onWorkerFinished); } @@ -169,6 +171,14 @@ private Q_SLOTS: m_receivedSignals.append(QLatin1String(Protocol::AbstractArchiveSignalDataBlockRequested)); } + void onSeekRequested(qint64 offset, int whence) + { + QMutexLocker _(&m_lock); + m_receivedSignals.append(QLatin1String(Protocol::AbstractArchiveSignalSeekRequested)); + m_receivedSignals.append(offset); + m_receivedSignals.append(whence); + } + void onWorkerFinished() { QMutexLocker _(&m_lock); -- cgit v1.2.3 From 6cfd80664a8db1549db61bc090eba7d40d6c8360 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Tue, 26 Oct 2021 12:50:05 +0300 Subject: Fix qdoc warnings introduced by the archive handling changes Change-Id: I47d24c72317bed594b22b234be75d0359f2e2b98 Reviewed-by: Katja Marttila Reviewed-by: Leena Miettinen --- src/libs/installer/abstractarchive.cpp | 2 +- src/libs/installer/lib7z_facade.cpp | 18 ++++++++++++------ src/libs/installer/libarchivewrapper.cpp | 13 ------------- src/libs/installer/libarchivewrapper_p.cpp | 4 ++-- 4 files changed, 15 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/libs/installer/abstractarchive.cpp b/src/libs/installer/abstractarchive.cpp index dd9b8e625..f2b4300c4 100644 --- a/src/libs/installer/abstractarchive.cpp +++ b/src/libs/installer/abstractarchive.cpp @@ -65,7 +65,7 @@ namespace QInstaller { */ /*! - \fn QInstaller::AbstractArchive::completedChanged(quint64 completed, quint64 total) + \fn QInstaller::AbstractArchive::completedChanged(const quint64 completed, const quint64 total) The ratio of \a completed entries from \a total changed. Subclasses should emit this whenever the progress changes. diff --git a/src/libs/installer/lib7z_facade.cpp b/src/libs/installer/lib7z_facade.cpp index 17176d7b0..6d1b6a57d 100644 --- a/src/libs/installer/lib7z_facade.cpp +++ b/src/libs/installer/lib7z_facade.cpp @@ -188,12 +188,6 @@ namespace Lib7z { Prints string \a s. */ -/*! - \fn bool Lib7z::operator==(const File &lhs, const File &rhs); - - Returns \c true if \a lhs and \a rhs are equal; otherwise returns \c false. -*/ - // -- 7z init codecs, archives std::once_flag gOnceFlag; @@ -769,6 +763,18 @@ STDMETHODIMP ExtractCallback::SetOperationResult(Int32 /*resultEOperationResult* File is a tmp file. */ +/*! + \typedef Lib7z::Compression + + Synonym for QInstaller::CompressionLevel +*/ + +/*! + \typedef Lib7z::File + + Synonym for QInstaller::ArchiveEntry +*/ + /*! \namespace Lib7z \inmodule QtInstallerFramework diff --git a/src/libs/installer/libarchivewrapper.cpp b/src/libs/installer/libarchivewrapper.cpp index c259678ca..9fbbeb889 100644 --- a/src/libs/installer/libarchivewrapper.cpp +++ b/src/libs/installer/libarchivewrapper.cpp @@ -44,19 +44,6 @@ namespace QInstaller { where the object was created. */ -/*! - \fn QInstaller::LibArchiveWrapper::currentEntryChanged(const QString &filename) - - Current entry changed to \a filename. Emitted when the entry to process is changed. -*/ - -/*! - \fn QInstaller::LibArchiveWrapper::completedChanged(quint64 completed, quint64 total) - - The ratio of \a completed entries from \a total changed. - Emitted when the progress changes. -*/ - /*! Constructs an archive object representing an archive file specified by \a filename with \a parent as the parent object. diff --git a/src/libs/installer/libarchivewrapper_p.cpp b/src/libs/installer/libarchivewrapper_p.cpp index 942e948e8..75bbddbe8 100644 --- a/src/libs/installer/libarchivewrapper_p.cpp +++ b/src/libs/installer/libarchivewrapper_p.cpp @@ -41,13 +41,13 @@ namespace QInstaller { */ /*! - \fn QInstaller::ArchiveWrapper::dataBlockRequested() + \fn QInstaller::LibArchiveWrapperPrivate::dataBlockRequested() Emitted when the server process has requested another data block. */ /*! - \fn QInstaller::ArchiveWrapper::remoteWorkerFinished() + \fn QInstaller::LibArchiveWrapperPrivate::remoteWorkerFinished() Emitted when the server process has finished extracting an archive. */ -- cgit v1.2.3 From 8bd9037a6be6dbea7940ac54b4aba9ec3df4b732 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Wed, 27 Oct 2021 13:39:52 +0300 Subject: Fix symlink handling when packaging Zip archives archive_write_header() will write the complete symlink to the archive, the client application should not try to write any data for symlinks or if archive_entry_size() is zero. The tar.* archives were not affected by this. Task-number: QTIFW-2382 Change-Id: I6a5e62ef4c7e650ad806f183556e39ac8ae8cdc3 Reviewed-by: Katja Marttila --- src/libs/installer/libarchivearchive.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/libs/installer/libarchivearchive.cpp b/src/libs/installer/libarchivearchive.cpp index 0d2619c7d..4147214a8 100644 --- a/src/libs/installer/libarchivearchive.cpp +++ b/src/libs/installer/libarchivearchive.cpp @@ -500,7 +500,7 @@ bool LibArchiveArchive::create(const QStringList &data) if (status < ARCHIVE_OK) throw Error(QLatin1String(archive_error_string(writer.get()))); - if (fileOrDir.isDir()) + if (fileOrDir.isDir() || fileOrDir.isSymLink() || archive_entry_size(entry.get()) == 0) continue; // nothing to copy QFile file(pathWithoutNamespace(QLatin1String(archive_entry_sourcepath(entry.get())))); -- cgit v1.2.3 From 002b2e15d05a1a6784595855408c331531f03746 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Wed, 27 Oct 2021 15:42:14 +0300 Subject: LibArchiveWrapper: use local zero-timer for processing server signals Now that the server process may request file seeks in addition to reads for archive formats supporting them, the interval which we process the requests will have a big impact on the extracting speed. Also shrink the read buffer as its size isn't as significant for the performance after this change. Task-number: QTIFW-2384 Change-Id: Iaf296833c6ff1acfc666a6e82f661e1a40c77b61 Reviewed-by: Katja Marttila --- src/libs/installer/libarchivewrapper_p.cpp | 15 +++++++-------- src/libs/installer/libarchivewrapper_p.h | 1 - 2 files changed, 7 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/libs/installer/libarchivewrapper_p.cpp b/src/libs/installer/libarchivewrapper_p.cpp index 75bbddbe8..30f81554a 100644 --- a/src/libs/installer/libarchivewrapper_p.cpp +++ b/src/libs/installer/libarchivewrapper_p.cpp @@ -77,7 +77,6 @@ LibArchiveWrapperPrivate::LibArchiveWrapperPrivate() */ LibArchiveWrapperPrivate::~LibArchiveWrapperPrivate() { - m_timer.stop(); } /*! @@ -140,6 +139,10 @@ QString LibArchiveWrapperPrivate::errorString() const bool LibArchiveWrapperPrivate::extract(const QString &dirPath, const quint64 totalFiles) { if (connectToServer()) { + QTimer timer; + connect(&timer, &QTimer::timeout, this, &LibArchiveWrapperPrivate::processSignals); + timer.start(); + m_lock.lockForWrite(); callRemoteMethod(QLatin1String(Protocol::AbstractArchiveExtract), dirPath, totalFiles); m_lock.unlock(); @@ -148,6 +151,7 @@ bool LibArchiveWrapperPrivate::extract(const QString &dirPath, const quint64 tot connect(this, &LibArchiveWrapperPrivate::remoteWorkerFinished, &loop, &QEventLoop::quit); loop.exec(); } + timer.stop(); return (workerStatus() == ExtractWorker::Success); } return m_archive.extract(dirPath, totalFiles); @@ -262,7 +266,7 @@ void LibArchiveWrapperPrivate::processSignals() */ void LibArchiveWrapperPrivate::onDataBlockRequested() { - constexpr quint64 blockSize = 10 * 1024 * 1024; // 10MB + constexpr quint64 blockSize = 1024 * 1024; // 1MB QFile *const file = &m_archive.m_data->file; if (!file->isOpen() || file->isSequential()) { @@ -327,15 +331,10 @@ void LibArchiveWrapperPrivate::onSeekRequested(qint64 offset, int whence) } /*! - Starts the timer to process server-side signals and connects handler - signals for the matching signals of the wrapper object. + Connects handler signals for the matching signals of the wrapper object. */ void LibArchiveWrapperPrivate::init() { - m_timer.start(250); - QObject::connect(&m_timer, &QTimer::timeout, - this, &LibArchiveWrapperPrivate::processSignals); - QObject::connect(&m_archive, &LibArchiveArchive::currentEntryChanged, this, &LibArchiveWrapperPrivate::currentEntryChanged); QObject::connect(&m_archive, &LibArchiveArchive::completedChanged, diff --git a/src/libs/installer/libarchivewrapper_p.h b/src/libs/installer/libarchivewrapper_p.h index 722c91f17..4277cd4f9 100644 --- a/src/libs/installer/libarchivewrapper_p.h +++ b/src/libs/installer/libarchivewrapper_p.h @@ -86,7 +86,6 @@ private: ExtractWorker::Status workerStatus() const; private: - QTimer m_timer; mutable QReadWriteLock m_lock; LibArchiveArchive m_archive; -- cgit v1.2.3 From 6cd1ff494d4d7aadc12204789407679aa065b4a6 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Thu, 28 Oct 2021 12:32:54 +0300 Subject: Fix creating archives containing Windows shortcuts On Windows, QFileInfo::isSymLink() returns true for *.lnk files, which unlike symlinks contain data - when creating an archive the writing was incorrectly skipped. Also add test case for creating and extracting archives containing either symlinks or shortcuts. Change-Id: I3ebbd28e889ffa17ece7378c3812244a55df20d5 Reviewed-by: Qt CI Bot Reviewed-by: Katja Marttila --- src/libs/installer/libarchivearchive.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/libs/installer/libarchivearchive.cpp b/src/libs/installer/libarchivearchive.cpp index 4147214a8..46200560b 100644 --- a/src/libs/installer/libarchivearchive.cpp +++ b/src/libs/installer/libarchivearchive.cpp @@ -500,7 +500,7 @@ bool LibArchiveArchive::create(const QStringList &data) if (status < ARCHIVE_OK) throw Error(QLatin1String(archive_error_string(writer.get()))); - if (fileOrDir.isDir() || fileOrDir.isSymLink() || archive_entry_size(entry.get()) == 0) + if (fileOrDir.isDir() || archive_entry_size(entry.get()) == 0) continue; // nothing to copy QFile file(pathWithoutNamespace(QLatin1String(archive_entry_sourcepath(entry.get())))); -- cgit v1.2.3 From d02dcbd47530ce7415668ba35a2f378bf12aef15 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Tue, 2 Nov 2021 17:12:05 +0200 Subject: Libarchive: Fix extracting hard links pointing to files in archive Since we already adjust the output path for archive entries, libarchive would fail with the error string "Hard-link target '...' does not exist" for hard links referring to extracted files. Fix by also adjusting the hard link target paths. Task-number: QTIFW-2403 Change-Id: I8f78117c5b0707a70c76433ca1c1483ea49b432b Reviewed-by: Katja Marttila --- src/libs/installer/libarchivearchive.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/libs/installer/libarchivearchive.cpp b/src/libs/installer/libarchivearchive.cpp index 46200560b..d3a79bd40 100644 --- a/src/libs/installer/libarchivearchive.cpp +++ b/src/libs/installer/libarchivearchive.cpp @@ -123,6 +123,12 @@ void ExtractWorker::extract(const QString &dirPath, const quint64 totalFiles) const QString outputPath = dirPath + QDir::separator() + QString::fromLocal8Bit(current); archive_entry_set_pathname(entry, outputPath.toLocal8Bit()); + const char *hardlink = archive_entry_hardlink(entry); + if (hardlink) { + const QString hardLinkPath = dirPath + QDir::separator() + QString::fromLocal8Bit(hardlink); + archive_entry_set_hardlink(entry, hardLinkPath.toLocal8Bit()); + } + emit currentEntryChanged(outputPath); if (!writeEntry(reader.get(), writer.get(), entry)) return; @@ -440,6 +446,12 @@ bool LibArchiveArchive::extract(const QString &dirPath, const quint64 totalFiles const QString outputPath = dirPath + QDir::separator() + QString::fromLocal8Bit(current); archive_entry_set_pathname(entry, outputPath.toLocal8Bit()); + const char *hardlink = archive_entry_hardlink(entry); + if (hardlink) { + const QString hardLinkPath = dirPath + QDir::separator() + QString::fromLocal8Bit(hardlink); + archive_entry_set_hardlink(entry, hardLinkPath.toLocal8Bit()); + } + emit currentEntryChanged(outputPath); if (!writeEntry(reader.get(), writer.get(), entry)) throw Error(errorString()); // appropriate error string set in writeEntry() -- cgit v1.2.3 From b0baed0655b7e32b3a1845af0f0494af258f371f Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Fri, 5 Nov 2021 12:53:54 +0000 Subject: Revert "Add Korean translation" This reverts commit 1e053058bbee09c21a132909901446694ed4d95e. Reason for revert: Remove .ts file for now, until the quality of translation is verified. Change-Id: I729b6c237ebe1b6638b27a072a2abcd11fe1394e Reviewed-by: Katja Marttila --- src/sdk/translations/ifw_ko.ts | 2771 ---------------------------------------- 1 file changed, 2771 deletions(-) delete mode 100644 src/sdk/translations/ifw_ko.ts (limited to 'src') diff --git a/src/sdk/translations/ifw_ko.ts b/src/sdk/translations/ifw_ko.ts deleted file mode 100644 index a2db492de..000000000 --- a/src/sdk/translations/ifw_ko.ts +++ /dev/null @@ -1,2771 +0,0 @@ - - - - - QInstaller::ProxyCredentialsDialog - - Dialog - 다이얼로그 - - - The proxy %1 requires a username and password. - 프록시 1%에 사용자 이름과 비밀번호가 필요합니다. - - - Username: - 사용자 이름: - - - Username - 사용자 이름 - - - Password: - 비밀번호: - - - Password - 비밀번호 - - - Proxy Credentials - 프록시 자격 증명 - - - - QInstaller::ServerAuthenticationDialog - - Server Requires Authentication - 서버 인증이 필요함 - - - You need to supply a username and password to access this site. - 이 사이트에 접근하려면 사용자 이름과 비밀번호가 필요합니다. - - - Username: - 사용자 이름: - - - Password: - 비밀번호: - - - %1 at %2 - %2의 %1 - - - - Dialog - - Http authentication required - HTTP 인증 필요 - - - You need to supply a Username and Password to access this site. - 이 사이트에 접근하려면 사용자 이름과 비밀번호가 필요합니다. - - - Username: - 사용자 이름: - - - Password: - 비밀번호: - - - %1 at %2 - %2의 %1 - - - - SettingsDialog - - Settings - 설정 - - - Network - 네트워크 - - - No proxy - 프록시 없음 - - - System proxy settings - 시스템 프록시 설정 - - - Manual proxy configuration - 수동 프록시 구성 - - - HTTP proxy: - HTTP 프록시: - - - Port: - 포트: - - - FTP proxy: - FTP 프록시: - - - Repositories - 리포지토리 - - - Add Username and Password for authentication if needed. - 필요하면 인증을 위한 사용자 이름과 비밀번호를 추가하십시오. - - - Use temporary repositories only - 임시 리포지토리만 사용 - - - Add - 추가 - - - Remove - 제거 - - - Test - 테스트 - - - Select All - 모두 선택 - - - Deselect All - 모두 선택 해제 - - - Show Passwords - 비밀번호 표시 - - - Check this to use repository during fetch. - 가져오는 중에 리포지토리를 사용하려면 확인하십시오. - - - Add the username to authenticate on the server. - 서버를 인증하려면 사용자 이름을 추가하십시오. - - - Add the password to authenticate on the server. - 서버를 인증하려면 비밀번호를 추가하십시오. - - - The server's URL that contains a valid repository. - 유효한 리포지토리가 포함되어 있는 서버 URL입니다. - - - An error occurred while testing this repository. - 이 리포지토리를 테스트하는 중에 오류가 발생했습니다. - - - The repository was tested successfully. - 리포지토리를 성공적으로 테스트했습니다. - - - Do you want to disable the repository? - 이 리포지토리를 비활성화하시겠습니까? - - - Do you want to enable the repository? - 이 리포지토리를 활성화하시겠습니까? - - - Hide Passwords - 비밀번호 숨기기 - - - Use - 사용 - - - Username - 사용자 이름 - - - Password - 비밀번호 - - - Repository - 리포지토리 - - - Default repositories - 기본 리포지토리 - - - Temporary repositories - 임시 리포지토리 - - - User defined repositories - 사용자 정의 리포지토리 - - - - QInstaller - - Invalid content in "%1". - "%1"에 올바르지 않은 내용이 있음 - - - No marker found, stopped after %1. - 마커를 찾을 수 없습니다. %1 이후에 중지되었습니다. - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Read failed after %1 bytes: %2 - %1바이트 이후 읽을 수 없음: %2 - - - Copy failed: %1 - 복사할 수 없음: %1 - - - Write failed after %1 bytes: %2 - %1바이트 이후 쓸 수 없음: %2 - - - bytes - 바이트 - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - PB - PB - - - EB - EB - - - ZB - ZB - - - YB - YB - - - Cannot remove file "%1": %2 - "1%" 파일을 제거할 수 없음: %2 - - - Cannot remove directory "%1": %2 - "1%" 디렉토리를 제거할 수 없음: %2 - - - Cannot create directory "%1". - "1%" 디렉토리를 생성할 수 없습니다. - - - Cannot copy file from "%1" to "%2": %3 - "%1"에서 "%2"에 파일을 복사할 수 없음: %3 - - - Cannot move file from "%1" to "%2": %3 - "%1"에서 "%2"에 파일을 이동할 수 없음: %3 - - - Cannot create directory "%1": %2 - "%1" 디렉토리를 생성할 수 없음: %2 - - - Cannot open temporary file: %1 - 임시 파일을 열 수 없음: %1 - - - Cannot open temporary file for template %1: %2 - %1 템플릿에 대한 임시 파일을 열 수 없음: %2 - - - Cannot copy file "%1" to "%2": %3 - "%1"에서 "%2"에 파일을 복사할 수 없음: %3 - - - Cannot copy file "%1" to "%2". - "%1"에서 "%2"에 파일을 복사할 수 없음: - - - The specified module could not be found. - 지정된 모듈을 찾을 수 없습니다. - - - - QObject - - Error acquiring admin rights - 관리자 권한 획득 중에 오류 발생 - - - Another %1 instance is already running. Wait until it finishes, close it, or restart your system. - 다른 %1 인스턴스가 이미 실행 중입니다. 완료될 때까지 기다린 다음 닫거나 시스템을 다시 시작하십시오. - - - Cannot start installer binary as updater. - 설치 관리자 바이너리를 업데이터로서 시작할 수 없습니다. - - - Cannot start installer binary as package manager. - 설치 관리자 바이너리를 패키지 관리자로서 시작할 수 없습니다. - - - Cannot start installer binary as uninstaller. - 설치 관리자 바이너리를 설치 제거 관리자로서 시작할 수 없습니다. - - - Empty repository list for option 'addRepository'. - 옵션 'addRepository'에 대한 리포지토리 목록이 비어있습니다. - - - Empty repository list for option 'addTempRepository'. - 옵션 'addTempRepository'에 대한 리포지토리 목록이 비어있습니다. - - - Empty repository list for option 'setTempRepository'. - 옵션 'setTempRepository'에 대한 리포지토리 목록이 비어있습니다. - - - Empty repository list for option 'installCompressedRepository'. - 옵션 'installCompressedRepository'에 대한 리포지토리 목록이 비어있습니다. - - - The file %1 does not exist. - %1 파일이 없습니다. - - - Arguments missing for option %1 - 옵션 %1에 대한 인수가 누락되었습니다. - - - Invalid button value %1 - 올바르지 않은 버튼 값 %1 - - - Incorrect arguments for %1 - %1에 대해 올바르지 않은 인수 - - - Please make sure that the current user has read access to file "%1" or try running %2 as an administrator. - 현재 사용자가 &quot;%1&quot; 파일에 대한 접근 권한이 있는지 확인하거나 관리자 권한으로 %2 파일을 실행해 보십시오. - - - - BinaryLayout - - Cannot seek to %1 to read the embedded meta data count. - %1을(를) 찾아서 내장된 메타데이터 개수를 읽을 수 없습니다. - - - Cannot seek to %1 to read the resource collection segment. - %1을(를) 찾아서 리소스 컬렉션 세그먼트를 읽을 수 없습니다. - - - Unexpected mismatch of meta resources. Read %1, expected: %2. - 메타 리소스에 예상과 다르게 일치하지 않는 사항이 있습니다. 읽음: %1, 예상: %2. - - - - BinaryContent - - Cannot seek to %1 to read the operation data. - %1을(를) 찾아서 작업 데이터를 읽을 수 없습니다. - - - Cannot seek to %1 to read the resource collection block. - %1을(를) 찾아서 리소스 컬렉션 블록을 읽을 수 없습니다. - - - Cannot open meta resource %1. - 메타 소스(%1)를 열 수 없습니다. - - - - QInstaller::Resource - - Cannot open resource %1 for reading. - 리소스(%1)를 읽기 위해 열 수 없습니다. - - - Read failed after %1 bytes: %2 - %1바이트 이후 읽을 수 없음: %2 - - - Write failed after %1 bytes: %2 - %1바이트 이후 쓸 수 없음: %2 - - - - ResourceCollectionManager - - Cannot open resource %1: %2 - 리소스(%1)를 열 수 없음: %2 - - - - QInstaller::Component - - Components cannot have children in updater mode. - 업데이터 모드에서는 구성요소에 하위 요소가 있으면 안 됩니다. - - - Cannot open the requested UI file "%1": %2 - 요청된 UI 파일("%1")을 열 수 없음: %2 - - - Cannot load the requested UI file "%1": %2 - 요청된 UI 파일("%1")을 로드할 수 없음: %2 - - - Cannot open the requested license file "%1": %2 - 요청된 라이선스 파일("%1")을 열 수 없음: %2 - - - Error - 오류 - - - Error: Operation %1 does not exist. - 오류: %1 작업이 없습니다. - - - Cannot resolve isDefault in %1 - %1의 isDefault를 해결할 수 없습니다. - - - Update Info: - 업데이트 정보: - - - There was an error loading the selected component. This component cannot be installed. - 선택한 구성요소를 로드하는 중에 오류가 발생했습니다. 이 구성요소를 설치할 수 없습니다. - - - - QInstaller::ComponentModel - - Component is marked for installation. - 구성요소가 설치를 위해 표시되었습니다. - - - Component is marked for uninstallation. - 구성요소가 설치 제거를 위해 표시되었습니다. - - - Component is installed. - 구성요소가 설치되었습니다. - - - Component is not installed. - 구성요소가 설치되지 않았습니다. - - - Component Name - 구성요소 이름 - - - Action - 조치 - - - Installed Version - 설치된 버전 - - - New Version - 새 버전 - - - Release Date - 출시일 - - - Size - 크기 - - - - QInstaller::ComponentSelectionPage - - Alt+A - Select default components - Alt+A - - - Def&ault - 기본(&A): - - - Select default components in the tree view. - 트리 보기에서 기본 구성요소를 선택합니다. - - - Alt+R - Reset to already installed components - Alt+R - - - &Reset - 재설정(&R) - - - Reset all components to their original selection state in the tree view. - 트리 보기에서 모든 구성요소를 원래 선택된 상태로 재설정합니다. - - - Alt+S - Select all components - Alt+S - - - &Select All - 모두 선택(&S) - - - Select all components in the tree view. - 트리 보기에서 모든 구성요소를 선택합니다. - - - Alt+D - Deselect all components - Alt+D - - - &Deselect All - 모두 선택 해제(&D) - - - Deselect all components in the tree view. - 트리 보기에서 모든 구성요소를 선택 해제합니다. - - - &Browse QBSP files - QBSP 파일 탐색(&B) - - - Select a Qt Board Support Package file to install additional content that is not directly available from the online repositories. - QBSP(Qt Board Support Package) 파일을 선택하여 온라인 리포지토리에서 직접 사용할 수 없는 추가 콘텐츠를 설치합니다. - - - Filter the enabled repository categories - 활성화된 리포지토리 범주를 필터링합니다. - - - This component will occupy approximately %1 on your hard disk drive. - 이 구성요소는 하드디스크 드라이브의 약 %1 정도를 차지합니다. - - - Open File - 파일 열기 - - - Select Components - 구성요소 선택 - - - Please select the components you want to update. - 업데이트하려는 구성요소를 선택하십시오. - - - Please select the components you want to install. - 설치하려는 구성요소를 선택하십시오. - - - Please select the components you want to uninstall. - 설치 제거하려는 구성요소를 선택하십시오. - - - Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated. - 설치할 구성요소를 선택하십시오. 설치 제거할 설치된 구성요소를 선택 해제하십시오. 이미 설치된 모든 구성요소는 업데이트되지 않습니다. - - - Mandatory components need to be updated first before you can select other components to update. - 필수 구성요소를 먼저 업데이트해야 다른 구성요소를 업데이트하기 위해 선택할 수 있습니다. - - - - QInstaller::ComponentSelectionPagePrivate - - Filter - 필터 - - - Component Information - 구성요소 정보 - - - Error - 오류 - - - - QInstaller::ConsumeOutputOperation - - <to be saved installer key name> <executable> [argument1] [argument2] [...] - <저장할 설치 관리자 키 이름> <실행 가능> [argument1] [argument2] [...] - - - Needed installer object in %1 operation is empty. - "%1" 작업에 필요한 설치 개체가 비어 있습니다. - - - Cannot save the output of "%1" to an empty installer key value. - 빈 설치 관리자 키 값에 "%1"의 출력을 저장할 수 없습니다. - - - File "%1" does not exist or is not an executable binary. - "%1" 파일이 없거나 실행 가능한 바이너리가 아닙니다. - - - Running "%1" resulted in a crash. - "%1" 실행 중에 충돌이 발생했습니다. - - - - QInstaller::CopyDirectoryOperation - - <source> <target> ["forceOverwrite"] - <소스> <대상> ["forceOverwrite"] - - - Invalid argument in %1: Third argument needs to be forceOverwrite, if specified. - %1에 유효하지 않은 인수: 지정될 경우 세 번째 인수는 forceOverwrite해야 합니다. - - - Invalid argument in %1: Directory "%2" is invalid. - %1에 유효하지 않은 인수: "%2" 디렉토리가 유효하지 않습니다. - - - Cannot create directory "%1". - "1%" 디렉토리를 생성할 수 없습니다. - - - Failed to overwrite "%1". - "%1"을(를) 덮어쓸 수 없습니다. - - - Cannot copy file "%1" to "%2": %3 - "%1"에서 "%2"에 파일을 복사할 수 없음: %3 - - - Cannot remove file "%1". - "1%" 파일을 제거할 수 없음: - - - - QInstaller::CopyFileTask - - Invalid task item count. - 작업 아이템 개수가 유효하지 않습니다. - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Writing to file "%1" failed: %2 - "%1" 파일에 쓰기 실패: %2 - - - - QInstaller::CreateDesktopEntryOperation - - Cannot backup file "%1": %2 - "%1" 파일을 백업할 수 없음: %2 - - - Failed to overwrite file "%1". - "%1"을(를) 덮어쓸 수 없습니다. - - - Cannot write desktop entry to "%1". - "%1"에 데스크톱 항목을 쓸 수 없습니다. - - - - QInstaller::CreateLinkOperation - - Cannot create link from "%1" to "%2". - "%1"에서 "%2"에 대한 링크를 생성할 수 없습니다. - - - Cannot remove link from "%1" to "%2". - "%1"에서 "%2"에 대한 링크를 제거할 수 없습니다. - - - - QInstaller::CreateLocalRepositoryOperation - - Cannot set permissions for file "%1". - 파일 "%1"에 대한 권한을 설정할 수 없습니다. - - - Cannot remove file "%1": %2 - "1%" 파일을 제거할 수 없음: %2 - - - Cannot move file "%1" to "%2": %3 - 파일 "%1"을(를) "%2"(으)로 옮길 수 없습니다. %3 - - - Installer at "%1" needs to be an offline one. - "%1"의 설치 관리자는 오프라인용이어야 합니다. - - - Cannot create path "%1". - "%1" 경로를 생성할 수 없습니다. - - - Cannot remove directory "%1". - "1%" 디렉토리를 제거할 수 없습니다. - - - Cannot open file "%1" for reading. - "%1" 파일을 읽기 위해 열 수 없습니다. - - - Cannot read file "%1": %2 - "%1" 파일을 열 수 없음: %2 - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot create target directory: "%1". - 대상 디렉토리를 생성할 수 없음: "%1". - - - Unknown exception caught: %1. - 알 수 없는 예외 발생: %1. - - - Removing file "%1". - "%1" 파일을 제거합니다. - - - Cannot remove file "%1". - "1%" 파일을 제거할 수 없음: - - - Cannot remove directory "%1": %2 - "1%" 디렉토리를 제거할 수 없음: %2 - - - Cannot create archive "%1": %2 - "%1" 아카이브를 생성할 수 없음: %2 - - - - QInstaller::CreateShortcutOperation - - <target> <link location> [target arguments] ["workingDirectory=..."] ["iconPath=..."] ["iconId=..."] ["description=..."] - <대상> <링크 위치> [대상 인수] ["workingDirectory=..."] ["iconPath=..."] ["iconId=..."] ["description=..."] - - - Cannot create directory "%1": %2 - "%1" 디렉토리를 생성할 수 없음: %2 - - - Failed to overwrite "%1": %2 - "%1"을(를) 덮어쓸 수 없음: %2 - - - Cannot create link "%1": %2 - "%1" 링크를 생성할 수 없음: %2 - - - - QInstaller::DownloadArchivesJob - - Canceled - 취소됨 - - - Downloading hash signature failed. - 해시 서명을 다운로드하지 못했습니다. - - - Download Error - 다운로드 오류 - - - Hash verification while downloading failed. This is a temporary error, please retry. - 다운로드 중에 해시를 검증하지 못했습니다. 일시적인 오류이니 다시 시도하십시오. - - - Cannot verify Hash - 해시를 검증할 수 없음 - - - Cannot download archive %1: %2 - %1 아카이브를 다운로드할 수 없음: %2 - - - Cannot fetch archives: %1 -Error while loading %2 - 아카이브를 가져올 수 없음: %1 -%2 로드 중 오류 발생 - - - Downloading archive "%1" for component %2. - 구성요소 %2용 아카이브 "%1" 다운로드 중입니다. - - - Scheme %1 not supported (URL: %2). - %1 스킴을 지원하지 않습니다(URL: %2). - - - Cannot find component for %1. - %1용 구성요소를 찾을 수 없습니다. - - - %1 of %2 - %1/%2 - - - %1 downloaded. - %1 다운로드가 완료되었습니다. - - - %n day(s), - - %n일, - - - - %n hour(s), - - %n시간, - - - - %n minute(s) - - %n분 - - - - %n second(s) - - %n초 - - - - - %1%2%3%4 remaining. - - 남은 시간: %1%2%3%4 - - - - unknown time remaining. - - 남은 시간: 알 수 없음 - - - Archive: - - - - Total: - - - - - QInstaller::Downloader - - Target file "%1" already exists but is not a file. - 대상 파일("%1")이 이미 있지만 파일이 아닙니다. - - - Cannot open file "%1" for writing: %2 - %2 is a sentence describing the error - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - File "%1" not open for writing: %2 - %2 is a sentence describing the error. - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Writing to file "%1" failed: %2 - %2 is a sentence describing the error. - "%1" 파일에 쓰기 실패: %2 - - - Redirect loop detected for "%1". - "%1"에 대한 리디렉션 루프가 감지되었습니다. - - - Network error while downloading '%1': %2. - "%1" 다운로드 중에 네트워크 오류 발생: %2. - - - Unknown network error while downloading "%1". - %1 is a sentence describing the error - "%1" 다운로드 중에 네트워크 오류 발생: - - - Network transfers canceled. - 네트워크 전송이 취소되었습니다. - - - Pause and resume not supported by network transfers. - 네트워크 전송은 일시 중지하거나 다시 시작할 수 없습니다. - - - Invalid source URL "%1": %2 - %2 is a sentence describing the error - 유효하지 않은 소스 URL "%1": %2 - - - - AuthenticationRequiredException - - %1 at %2 - %2의 %1 - - - Proxy requires authentication. - 프록시는 인증이 필요합니다. - - - - QInstaller::ElevatedExecuteOperation - - Cannot start detached: "%1" - 분리된 항목을 시작할 수 없음: "%1" - - - Cannot start: "%1": %2 - 시작할 수 없음: "%1": %2 - - - Program crashed: "%1" - 프로그램이 충돌함: "%1" - - - Execution failed (Unexpected exit code: %1): "%2" - 실행하지 못함(예상치 못한 종료 코드: %1): "%2" - - - - UpdateOperation - - Cannot write to registry path %1. - 레지스트리 경로(%1)를 쓸 수 없습니다. - - - Registry path %1 is not writable. - 레지스트리 경로(%1)를 쓸 수 없습니다. - - - exactly %1 - 정확히 %1 - - - at least %1 - 최소 %1 - - - not more than %1 - %1 이하 - - - %1 or %2 - %1 또는 %2 - - - %1 to %2 - %1~%2 - - - Invalid arguments in %1: %n arguments given, %2 arguments expected. - - %1에 유효하지 않은 인수: %n개의 인수 입력, %2개의 인수 필요. - - - - Invalid arguments in %1: %n arguments given, %2 arguments expected in the form: %3. - - %1에 유효하지 않은 인수: %n개의 인수 입력, 양식에 %2개의 인수 필요: %3. - - - - Renaming file "%1" to "%2" failed: %3 - 파일 명을 "%1"에서 "%2"(으)로 변경하늦 중에 오류 발생: %3 - - - - QInstaller::ExtractArchiveOperation - - Extracting "%1" - "%1" 추출 중 - - - - QInstaller::FakeStopProcessForUpdateOperation - - Cannot get package manager core. - 패키지 관리자 코어를 가져올 수 없습니다. - - - This process should be stopped before continuing: %1 - 계속하기 전에 중지해야 하는 프로세스: %1 - - - These processes should be stopped before continuing: %1 - 계속하기 전에 중지해야 하는 프로세스: %1 - - - - QInstaller::GlobalSettingsOperation - - Settings are not writable. - 설정을 쓸 수 없습니다. - - - Failed to write settings. - 설정을 쓰지 못했습니다. - - - - InstallerCalculator - - Components added as automatic dependencies: - 구성요소가 자동 종속성으로 추가됨: - - - Components added as dependency for "%1": - 구성요소가 "%1"용 자동 종속성으로 추가됨: - - - Components that have resolved dependencies: - 종속성을 해결한 구성요소: - - - Selected components without dependencies: - 종속성 없이 선택된 구성요소: - - - Recursion detected, component "%1" already added with reason: "%2" - 회귀가 감지됨. 구성요소("%1")가 다음 사유로 이미 추가됨: "%2" - - - Cannot find missing dependency "%1" for "%2". - "%2"에 대한 누락된 종속성 "%1"을(를) 찾을 수 없습니다. - - - - QInstaller::InstallIconsOperation - - <source path> [vendor prefix] - <소스 경로> [벤더 접두사] - - - Invalid Argument: source directory must not be empty. - 유효하지 않은 인수: 소스 디렉토리를 입력해야 합니다. - - - Cannot backup file "%1": %2 - "%1" 파일을 백업할 수 없음: %2 - - - Failed to overwrite "%1": %2 - "%1"을(를) 덮어쓸 수 없음: %2 - - - Failed to copy file "%1": %2 - "%1" 파일을 복사할 수 없음: %2 - - - Cannot create directory "%1": %2 - "%1" 디렉토리를 생성할 수 없음: %2 - - - - Lib7z - - Internal code: %1 - 내부 코드: %1 - - - Not enough memory - 메모리 부족 - - - Error: %1 - 오류: %1 - - - Cannot retrieve property %1 for item %2. - 항목 %2에 대한 %1 속성을 검색할 수 없습니다. - - - Property %1 for item %2 not of type VT_FILETIME but %3. - 항목 %2에 대한 %1 속성은 VT_FILETIME 유형이 아니라 %3입니다. - - - Cannot convert UTC file time to system time. - UTC 파일 시간을 시스템 시간으로 변환할 수 없습니다. - - - Cannot load codecs. - 코덱을 로드할 수 없습니다. - - - Cannot open archive "%1". - "%1" 아카이브를 열 수 없습니다. - - - Cannot retrieve number of items in archive. - 아카이브의 항목 개수를 검색할 수 없습니다. - - - Cannot retrieve path of archive item "%1". - 아카이브 항목 "%1"의 경로를 검색할 수 없습니다. - - - Unknown exception caught (%1). - 알 수 없는 예외가 발생했습니다(%1). - - - Cannot create temporary file: %1 - 임시 파일을 생성할 수 없음: %1 - - - Unsupported archive type. - 아카이브 유형이 지원되지 않습니다. - - - Cannot create archive "%1" - "%1" 아카이브를 생성할 수 없음 - - - Cannot create archive "%1": %2 - "%1" 아카이브를 생성할 수 없음: %2 - - - Cannot remove old archive "%1": %2 - 이전 아카이브 "%1" 제거 불가: %2 - - - Cannot rename temporary archive "%1" to "%2": %3 - 임시 아카이브 "%1"의 이름을 "%2"(으)로 변경할 수 없음: %3 - - - Unknown exception caught (%1) - 알 수 없는 예외 발생(%1) - - - - DirectoryGuard - - Path "%1" exists but is not a directory. - "%1" 경로가 존재하지만 디렉토리가 아닙니다. - - - Cannot create directory "%1". - "1%" 디렉토리를 생성할 수 없습니다. - - - - ExtractCallbackImpl - - Cannot retrieve path of archive item %1. - 아카이브 항목 "%1"의 경로를 검색할 수 없습니다. - - - Cannot remove already existing symlink %1. - 이미 존재하는 symlink %1을(를) 제거할 수 없습니다. - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Cannot create symlink at "%1". Another one is already existing. - "%1"에서 symlink를 생성할 수 없습니다. 다른 symlink가 이미 있습니다. - - - Cannot read symlink target from file "%1". - 파일 "%1"에서 symlink 대상을 읽을 수 없습니다. - - - Cannot create symlink at %1: %2 - "%1"에서 symlink를 생성할 수 없음: %2 - - - - QInstaller::LicenseOperation - - No license files found to copy. - 복사할 라이선스 파일을 찾을 수 없습니다. - - - Needed installer object in %1 operation is empty. - "%1" 작업에 필요한 설치 개체가 비어 있습니다. - - - Can not write license file "%1". - "%1" 라이선스 파일을 쓸 수 없습니다. - - - No license files found to delete. - 삭제할 라이선스 파일을 찾을 수 없습니다. - - - - QInstaller::LineReplaceOperation - - Invalid argument in %1: Empty search argument is not supported. - %1에 유효하지 않은 인수: 빈 인수는 지원되지 않습니다. - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - - QInstaller::MetadataJob - - Missing package manager core engine. - 패키지 관리자 코어 엔진이 누락되었습니다. - - - Preparing meta information download... - 메타 정보 다운로드 준비 중... - - - Unpacking compressed repositories. This may take a while... - 압축된 리포지토리의 압축을 해제합니다. 약간의 시간이 걸릴 수 있습니다... - - - Metadata download canceled. - 메타데이터 다운로드가 취소되었습니다. - - - Unknown exception during extracting. - 추출 중에 알 수 없는 예외가 발생했습니다. - - - Missing proxy credentials. - 프록시 자격 증명이 누락되었습니다. - - - Authentication failed. - 인증하지 못했습니다. - - - Unknown exception during download. - 다운로드 중에 알 수 없는 예외가 발생했습니다. - - - Failure to fetch repositories. - 리포지토리를 가져올 수 없습니다. - - - Extracting meta information... - 메타 정보 추출 중... - - - Checksum mismatch detected for "%1". - "%1"에 대한 체크섬 불일치가 감지되었습니다. - - - Retrieving meta information from remote repository... %1/%2 - 원격 리포지토리에서 메타 정보 검색 중... %1/%2 - - - Retrieving meta information from remote repository... - 원격 리포지토리에서 메타 정보 검색 중... - - - Error while extracting archive "%1": %2 - 아카이브 "%1" 추출 중에 오류 발생: %2 - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - - QInstaller::FileTaskObserver - - %1 of %2 - %1/%2 - - - %1 received. - %1을(를) 받았습니다. - - - (%1/sec) - (%1/초) - - - %n day(s), - - %n일, - - - - %n hour(s), - - %n시간, - - - - %n minute(s) - - %n분 - - - - %n second(s) - - %n초 - - - - - %1%2%3%4 remaining. - - 남은 시간: %1%2%3%4 - - - - unknown time remaining. - - 남은 시간: 알 수 없음 - - - - QInstaller::PackageManagerCore - - Error writing Maintenance Tool - 유지 보수 도구를 쓰는 중에 오류 발생 - - - -Downloading packages... - -패키지 다운로드 중... - - - Installation canceled by user. - 사용자가 설치를 취소했습니다. - - - All downloads finished. - 모든 다운로드가 완료되었습니다. - - - Canceling the Installer - 설치 관리자 취소 중 - - - Authentication Error - 인증 오류 - - - Some components could not be removed completely because administrative rights could not be acquired: %1. - 관리 권한을 획득하지 못해 일부 구성요소를 완전히 제거하지 못했습니다. %1. - - - Unknown error. - 알 수 없는 오류입니다. - - - Some components could not be removed completely because an unknown error happened. - 알 수 없는 오류가 발생해 일부 구성요소를 완전히 제거하지 못했습니다. - - - User input is required but the output device is not associated with a terminal. - 사용자 입력이 필요하지만 출력 기기가 터미널과 연결되지 않았습니다. - - - Error - 오류 - - - The directory you selected already exists and contains an installation. Choose a different target for installation. - 선택한 디렉토리가 이미 존재하며 설치 항목도 포함되어 있습니다. 설치하려면 다른 디렉토리를 선택하십시오. - - - Warning - 경고 - - - You have selected an existing, non-empty directory for installation. -Note that it will be completely wiped on uninstallation of this application. -It is not advisable to install into this directory as installation might fail. -Do you want to continue? - 파일이 이미 있는 기존 디렉토리를 설치 디렉토리로 선택하셨습니다. -이 애플리케이션을 제거할 때 디렉토리가 완전히 삭제되오니 유의하십시오. -설치가 실패할 수 있으므로 이 디렉토리에 설치하는 것은 권장하지 않습니다. -계속하시겠습니까? - - - You have selected an existing file or symlink, please choose a different target for installation. - 기존 파일 또는 symlink를 선택하셨습니다. 설치할 다른 대상을 선택하십시오. - - - The installation path cannot be empty, please specify a valid directory. - 설치 경로가 비어 있으면 안 됩니다. 유효한 디렉토리를 선택하십시오. - - - The installation path cannot be relative, please specify an absolute path. - 상대적인 경로를 설치 경로로 지정하면 안 됩니다. 절대 경로를 지정하십시오. - - - The path or installation directory contains non ASCII characters. This is currently not supported! Please choose a different path or installation directory. - 설치 경로 또는 디렉토리에 ASCII 문자가 아닌 문자가 포함되어 있습니다. 현재 이는 지원되지 않습니다! 다른 설치 경로나 디렉토리를 선택하십시오. - - - As the install directory is completely deleted, installing in %1 is forbidden. - 설치 경로가 완전히 삭제되었으므로 %1에 설치할 수 없습니다. - - - The path you have entered is too long, please make sure to specify a valid path. - 입력하신 경로가 너무 깁니다. 유효한 경로를 지정하십시오. - - - The path you have entered is not valid, please make sure to specify a valid target. - 입력하신 경로가 유효하지 않습니다. 유효한 경로를 지정하십시오. - - - The path you have entered is not valid, please make sure to specify a valid drive. - 입력하신 경로가 유효하지 않습니다. 유효한 드라이브를 지정하십시오. - - - The installation path must not end with '.', please specify a valid directory. - 설치 경로가 '.' 문자로 끝나면 안 됩니다. 유효한 디렉토리를 지정하십시오. - - - The installation path must not contain "%1", please specify a valid directory. - 설치 경로에 "%1" 문자가 포함되면 안 됩니다. 유효한 디렉토리를 지정하십시오. - - - Application not running in Package Manager mode. - 패키지 관리자 모드에서 애플리케이션이 실행되지 않고 있습니다. - - - No installed packages found. - 설치된 패키지를 찾을 수 없습니다. - - - Cannot register component! Component with identifier %1 already exists. - 구성요소를 등록할 수 없습니다! %1 식별자가 있는 구성 요소가 이미 존재합니다. - - - Application running in Uninstaller mode. - 애플리케이션이 설치 제거 관리자 모드로 실행 중입니다. - - - There is an important update available, please run the updater first. - 중요한 업데이트가 있습니다. 업데이터를 먼저 실행하십시오. - - - Cannot resolve all dependencies. - 모든 종속성을 해결할 수 없습니다. - - - Components about to be removed. - 구성요소가 제거됩니다. - - - Cannot install %1. Component not found. - - %1을(를) 설치할 수 없습니다. 구성요소를 찾을 수 없습니다. - - - - Cannot install component %1. Component is installed only as automatic dependency to %2. - - %1 구성요소를 설치할 수 없습니다. %2에 대한 자동 종속성으로만 구성요소가 설치됩니다. - - - - Cannot install component %1. Component is not checkable, meaning you have to select one of the subcomponents. - - %1 구성요소를 설치할 수 없습니다. 구성요소를 확인할 수 없어 하위 구성요소 중 하나를 설치해야 합니다. - - - - Component %1 already installed - - %1 구성요소가 이미 설치됨 - - - - Cannot install %1. Component is a descendant of a virtual component %2. - - %1을(를) 설치할 수 없습니다. 구성요소가 가상 구성요소 %2의 하위 항목입니다. - - - - Cannot install %1. Component is virtual. - - %1을(를) 설치할 수 없습니다. 가상 구성요소입니다. - - - - Running processes found. - 실행 중인 프로세스를 찾았습니다. - - - Cannot elevate access rights while running from command line. Please restart the application as administrator. - 명령줄에서 실행할 때 접근 원한을 상승시킬 수 없습니다. 관리자로서 애플리케이션을 재시작하십시오. - - - Error while elevating access rights. - 접근 권한을 상승시키는 중에 오류가 발생했습니다. - - - Not enough disk space to store temporary files and the installation. %1 are available, while the minimum required is %2. - 디스크 공간이 부족하여 임시 파일과 설치 파일을 저장할 수 없습니다. %1은(는) 사용 가능하지만 최소한 %2이(가) 필요합니다. - - - Not enough disk space to store all selected components! %1 are available, while the minimum required is %2. - 디스크 공간이 부족하여 선택한 구성요소를 모두 저장할 수 없습니다! %1은(는) 사용 가능하지만 최소한 %2이(가) 필요합니다. - - - Not enough disk space to store temporary files! %1 are available, while the minimum required is %2. - 디스크 공간이 부족하여 임시 파일을 저장할 수 없습니다! %1은(는) 사용 가능하지만 최소한 %2이(가) 필요합니다. - - - The volume you selected for installation seems to have sufficient space for installation, but there will be less than 1% of the volume's space available afterwards. - 설치를 위해 선택한 볼륨은 설치 공간이 충분한 것으로 보이지만, 설치 후에 남은 공간이 볼륨 공간의 %1 미만일 것으로 예상됩니다. - - - The volume you selected for installation seems to have sufficient space for installation, but there will be less than 100 MB available afterwards. - 설치를 위해 선택한 볼륨은 설치 공간이 충분한 것으로 보이지만, 설치 후에 남은 공간이 100MB 미만일 것으로 예상됩니다. - - - The estimated installer size %1 would exceed the supported executable size limit of %2. The application may not be able to run. - 예상 설치 크기(%1)가 지원되는 실행 가능한 크기 제한(%2)을 초과할 것으로 예상됩니다. 애플리케이션 실행이 불가능할 수 있습니다. - - - Installation will use %1 of disk space. - 설치 관리자가 디스크 공간의 %1을(를) 사용할 것입니다. - - - Invalid - 유효하지 않음 - - - - QInstaller::PackageManagerCorePrivate - - Unresolved dependencies - 해결되지 않은 종속성 - - - Error - 오류 - - - Access error - 접근 오류 - - - Format error - 형식 오류 - - - Cannot write installer configuration to %1: %2 - 설치 관리자 구성을 %1에 쓸 수 없음: %2 - - - Stop Processes - 프로세스 중지 - - - These processes should be stopped to continue: - -%1 - 계속하기 전에 중지해야 하는 프로세스: - -%1 - - - Installation canceled by user - 사용자가 설치를 취소함 - - - Retry count exceeded - 재시도 횟수 초과 - - - Writing maintenance tool. - 유지 보수 도구를 쓰는 중입니다. - - - Failed to seek in file %1: %2 - %1 파일에서 찾지 못함: %2 - - - Maintenance tool is not a bundle - 유지 보수 도구가 번들이 아님 - - - Cannot remove data file "%1": %2 - "1%" 데이터 파일을 제거할 수 없음 %2 - - - Cannot write maintenance tool data to %1: %2 - %1에 유지 보수 도구 데이터를 쓸 수 없음: %2 - - - Cannot write maintenance tool to "%1": %2 - %1에 유지 보수 도구를 쓸 수 없음: %2 - - - Cannot remove temporary data file "%1": %2 - 임시 디렉토리 "%1" 제거가 불가능합니다. %2 - - - Cannot write maintenance tool binary data to %1: %2 - %1에 유지 보수 도구 바이너리 데이터를 쓸 수 없음: %2 - - - Writing offline base binary. - 오프라인 기본 바이너리를 쓰는 중입니다. - - - Cannot remove file "%1": %2 - "1%" 파일을 제거할 수 없음: %2 - - - Cannot create directory "%1". - "1%" 디렉토리를 생성할 수 없습니다. - - - Cannot write offline binary to "%1": %2 - "%1"에 오프라인 바이너리를 쓸 수 없습니다. %2 - - - Cannot remove temporary file "%1": %2 - 임시 디렉토리 "%1" 제거가 불가능합니다. %2 - - - Variable 'TargetDir' not set. - 변수 'TargetDir'이 설정되지 않았습니다. - - - Preparing the installation... - 설치 준비 중... - - - It is not possible to install from network location - 네트워크 위치에서 설치할 수 없습니다. - - - Creating local repository - 로컬 리포지토리 생성 중 - - - Creating Maintenance Tool - 유지 보수 도구 생성 중 - - - -Installation finished! - -설치가 완료되었습니다! - - - -Installation aborted! - -설치가 중단되었습니다! - - - It is not possible to run that operation from a network location - 네트워크 위치에서 이 작업을 실행할 수 없습니다. - - - Removing deselected components... - 선택 취소한 구성요소 제거 중... - - - -Update finished! - -업데이트가 완료되었습니다! - - - -Update aborted! - -업데이트가 중단되었습니다! - - - Removal completed successfully. - 성공적으로 설치 제거했습니다. - - - Removal aborted. - 설치 제거가 중단되었습니다. - - - Cannot create target directory for installer. - 설치 관리자에 사용할 대상 디렉토리를 생성할 수 없습니다. - - - Preparing offline generation... - 오프라인 생성 준비 중... - - - Preparing installer configuration... - 설치 관리자 구성 요소 준비 중... - - - Creating the installer... - 설치 관리자 생성 중... - - - Failed to create offline installer. %1 - 오프라인 설치 관리자를 생성할 수 없습니다. %1 - - - Cannot remove temporary directory "%1". - 임시 디렉토리 "%1" 제거에 실패했습니다. - - - Offline generation completed successfully. - 성공적으로 오프라인 생성을 완료했습니다. - - - Offline generation aborted! - 오프라인 생성이 중단되었습니다! - - - -Installing component %1 - -구성요소 %1 설치 중 - - - Installer Error - 설치 관리자 오류 - - - Error during installation process (%1): -%2 - 설치 프로세스 중 오류 발생(%1): -%2 - - - Done - 완료 - - - Cannot prepare removal - 설치 제거를 준비할 수 없음 - - - Cannot start removal - 설치 제거를 시작할 수 없음 - - - Error during removal process: -%1 - 설치 해제 프로세스 중에 오류 발생: -%1 - - - Unknown error - 알 수 없는 오류 - - - Cannot retrieve remote tree %1. - 원격 트리 %1을(를) 검색할 수 없습니다. - - - Failure to read packages from %1. - %1에서 패키지를 읽을 수 없습니다. - - - Cannot retrieve meta information: %1 - 메타 정보를 검색할 수 없음: %1 - - - Cannot add temporary update source information. - 임시 업데이트 소스 정보를 추가할 수 없습니다. - - - Cannot find any update source information. - 어떠한 업데이트 소스 정보도 추가할 수 없습니다. - - - Dependency cycle between components "%1" and "%2" detected. - 구성요소 "%1" 및 "%2" 간의 종속성 사이클이 감지되었습니다. - - - - QInstaller::PackageManagerGui - - %1 Setup - %1 설정 - - - Maintain %1 - %1 유지 - - - Do you want to cancel the installation process? - 설치 프로세스를 취소하시겠습니까? - - - Do you want to cancel the removal process? - 설치 제거 프로세스를 취소하시겠습니까? - - - Do you want to quit the installer application? - 설치 관리자 애플리케이션을 종료하시겠습니까? - - - Do you want to quit the uninstaller application? - 설치 제거 관리자 애플리케이션을 종료하시겠습니까? - - - Do you want to quit the maintenance application? - 유지 보수 애플리케이션을 종료하시겠습니까? - - - %1 Question - %1 질문 - - - Settings - 설정 - - - Specify proxy settings and configure repositories for add-on components. - 애드온 구성요소를 위한 프록시 설정과 구성 리포지토리를 지정하십시오. - - - Error - 오류 - - - It is not possible to install from network location. -Please copy the installer to a local drive - 네트워크 위치에서 설치할 수 없습니다. -설치 관리자를 로컬 드라이브에 복사하십시오. - - - - QInstaller::IntroductionPage - - Setup - %1 - 설정 - %1 - - - Welcome to the %1 Setup Wizard. - %1 설정 마법사에 오신 것을 환영합니다. - - - &Add or remove components - 구성요소 추가 또는 제거(&A) - - - &Update components - 구성요소 업데이트(&U) - - - &Remove all components - 모든 구성요소 제거(&R) - - - Retrieving information from remote installation sources... - 원격 설치 소스에서 정보 검색 중... - - - At least one valid and enabled repository required for this action to succeed. - 이 작업을 성공적으로 수행하려면 최소 1개의 유효하고 활성화된 리포지토리가 필요합니다. - - - No updates available. - 사용 가능한 업데이트가 없습니다. - - - Only local package management available. - 로컬 패키지 관리만 가능합니다. - - - &Quit - 종료(&Q) - - - There is an important update available. Please select '%1' first - - - - - QInstaller::LicenseAgreementPage - - License Agreement - 라이선스 계약 - - - Alt+A - Agree license - Alt+A - - - Please read the following license agreement. You must accept the terms contained in this agreement before continuing with the installation. - 다음 라이선스 계약을 읽으십시오. 설치를 계속하려면 이 계약 조항에 동의하셔야 합니다. - - - I accept the license. - 라이선스 조항에 동의합니다. - - - Please read the following license agreements. You must accept the terms contained in these agreements before continuing with the installation. - 다음 라이선스 계약을 읽으십시오. 설치를 계속하려면 이 계약 조항에 동의하셔야 합니다. - - - I accept the licenses. - 이 라이선스에 동의합니다. - - - - QInstaller::TargetDirectoryPage - - Installation Folder - 설치 폴더 - - - Please specify the directory where %1 will be installed. - %1이(가) 설치될 디렉토리를 지정하십시오. - - - Alt+R - Browse file system to choose a file - Alt+R - - - B&rowse... - 탐색(&R)... - - - Browse file system to choose the installation directory. - 파일 시스템을 탐색하여 설치 디렉토리를 선택합니다. - - - Select Installation Folder - 설치 폴더 선택 - - - - QInstaller::StartMenuDirectoryPage - - Start Menu shortcuts - 메뉴 바로 가기 시작 - - - Select the Start Menu in which you would like to create the program's shortcuts. You can also enter a name to create a new directory. - 프로그램 바로 가기를 생성하려는 시작 메뉴를 선택합니다. 이름을 직접 입력하여 새 디렉토리를 생성할 수도 있습니다. - - - - QInstaller::ReadyForInstallationPage - - U&ninstall - 설치 제거(&N) - - - Ready to Uninstall - 설치 제거 준비 완료 - - - Setup is now ready to begin removing %1 from your computer.<br><font color="red">The program directory %2 will be deleted completely</font>, including all content in that directory! - 컴퓨터에 %1 제거를 시작할 준비가 되었습니다.<br><font color="red">%2 프로그램 디렉토리는 모두 삭제되며</font>, 해당 디렉토리에 포함된 모든 콘텐츠도 삭제됩니다! - - - U&pdate - 업데이트(&P) - - - Ready to Update Packages - 패키지 업데이트 준비 완료 - - - Setup is now ready to begin updating your installation. - 이제 설치 업데이트를 시작할 준비가 되었습니다. - - - &Install - 설치(&I) - - - Ready to Install - 설치 준비 완료 - - - Setup is now ready to begin installing %1 on your computer. - 컴퓨터에 %1 설치를 시작할 준비가 되었습니다. - - - Ready to Update - 업데이트 준비 완료 - - - - QInstaller::PerformInstallationPage - - U&ninstall - 설치 제거(&N) - - - Uninstalling %1 - %1 설치 제거 - - - &Update - 업데이트(&U) - - - Updating components of %1 - %1의 구성요소 업데이트 중 - - - &Install - 설치(&I) - - - Installing %1 - %1 설치 중 - - - Installing - 설치 중 - - - Updating - 업데이트 중 - - - Uninstalling - 설치 제거 중 - - - - QInstaller::FinishedPage - - Completing the %1 Wizard - %1 마법사 완료 중 - - - Finished - 완료됨 - - - Click %1 to exit the %2 Wizard. - %2 마법사를 종료하려면 %1을(를) 클릭하십시오. - - - Restart - 다시 시작 - - - Run %1 now. - 지금 %1을(를) 실행하십시오. - - - The %1 Wizard failed. - %1 마법사가 실패했습니다. - - - - QInstaller::RestartPage - - Completing the %1 Setup Wizard - %1 설정 마법사 완료 중 - - - - QInstaller::PerformInstallationForm - - &Show Details - 상세 정보 표시(&S) - - - &Hide Details - 상세 정보 숨기기(&H) - - - - QInstaller::RegisterFileTypeOperation - - Registering file types is only supported on Windows. - 등록하려는 파일 유형이 Windows에서만 지원됩니다. - - - Register File Type: Invalid arguments - 등록 파일 유형: 유효하지 않은 인수 - - - - RemoteClient - - Cannot get authorization. - 권한 부여를 받을 수 없습니다. - - - Cannot get authorization that is needed for continuing the installation. - Either abort the installation or use the fallback solution by running - -%1 - -as a user with the appropriate rights and then clicking OK. - 설치를 계속하기 위해 필요한 권한 부여를 받을 수 없습니다. - 설치를 중단하거나 임시 해결책으로 적절한 권한이 있는 사용자로 - -%1을(를) - -실행한 다음 ‘확인’을 클릭하십시오. - - - Cannot get authorization that is needed for continuing the installation. - -Please start the setup program as a user with the appropriate rights, -or accept the elevation of access rights if being asked. - 설치를 계속하기 위해 필요한 권한 부여를 받을 수 없습니다. - -적절한 권한이 있는 사용자로서 설정 프로그램을 시작하십시오. -또는 요청 시 접근 권한 상승을 수락하십시오. - - - - QInstaller::RemoteObject - - Cannot read all data after sending command: %1. Bytes expected: %2, Bytes received: %3. Error: %4 - 다음 명령 전송 후 모든 데이터를 읽을 수 없음: %1. 예상된 바이트: %2, 수신한 바이트: %3. 오류: %4 - - - - QInstaller::ReplaceOperation - - Current search argument calling "%1" with empty search argument is not supported. - 빈 검색 인수로 "%1"을(를) 호출하는 검색 인수는 지원되지 않습니다. - - - Current mode argument calling "%1" with arguments "%2" is not supported. Please use string or regex. - "%2" 인수로 "%1"을(를) 호출하는 현재 모드는 지원되지 않습니다. 문자열이나 regex를 사용하십시오. - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - - QInstaller::QFileDialogProxy - - User input is required but the output device is not associated with a terminal. - 사용자 입력이 필요하지만 출력 기기가 터미널과 연결되지 않았습니다. - - - - QInstaller::ScriptEngine - - Cannot open script file at %1: %2 - %1에서 스크립트 파일을 열 수 없음: %2 - - - Exception while loading the component script "%1": %2 - 구성요소 스크립트 "%1" 로드 중에 예외 발생: %2 - - - Unknown error. - 알 수 없는 오류입니다. - - - on line number: - 온라인 번호: - - - - QInstaller::SelfRestartOperation - - Installer object needed in operation %1 is empty. - "%1" 작업에 필요한 설치 개체가 비어 있습니다. - - - Self Restart: Only valid within updater or package manager mode. - 자가 재시작: 업데이터 또는 패키지 관리자 모드에서만 사용 가능합니다. - - - Self Restart: Invalid arguments - 자가 재시작: 유효하지 않은 인수 - - - - Settings - - Cannot open settings file %1 for reading: %2 - 설정 파일 "%1"을(를) 읽기 위해 열 수 없음: %2 - - - Select Categories - 범주 선택 - - - - QInstaller::SettingsOperation - - Missing argument(s) "%1" calling %2 with arguments "%3". - "%3" 인수가 있는 %2를 호출하는 "%1" 인수가 누락되었습니다. - - - Current method argument calling "%1" with arguments "%2" is not supported. Please use set, remove, add_array_value, or remove_array_value. - "%2" 인수로 "%1"을(를) 호출하는 현재 모드는 지원되지 않습니다. set, remove, add_array_value or remove_array_value를 사용하십시오. - - - - QInstaller::SimpleMoveFileOperation - - None of the arguments can be empty: source "%1", target "%2". - 인수는 모두 입력해야 합니다: 소스 "%1", 대상 "%2". - - - Cannot move file from "%1" to "%2", because the target path exists and is not removable. - 대상 파일이 존재하며 제거할 수 없으므로 "%1"에서 "%2"에 파일을 옮길 수 없습니다. - - - Cannot move file "%1" to "%2": %3 - 파일 "%1"을(를) "%2"(으)로 옮길 수 없습니다. %3 - - - Moving file "%1" to "%2". - 파일 "%1"을(를) "%2"으(로) 옮깁니다. - - - - QInstaller::TestRepository - - Missing package manager core engine. - 패키지 관리자 코어 엔진이 누락되었습니다. - - - Empty repository URL. - 리포지토리 URL이 비었습니다. - - - Download canceled. - 다운로드가 취소되었습니다. - - - Timeout while testing repository "%1". - "%1" 리포지토리를 테스트하는 중에 시간이 초과되었습니다. - - - Cannot parse Updates.xml: %1 - Updates.xml을 파싱할 수 없습니다. %1 - - - Cannot open Updates.xml for reading: %1 - Updates.xml 파일을 읽기 위해 열 수 없습니다. %1 - - - Authentication failed. - 인증하지 못했습니다. - - - Unknown error while testing repository "%1". - "%1" 리포지토리를 테스트하는 중에 알 수 없는 오류가 발생했습니다. - - - - KDUpdater::FileDownloader - - Download finished. - 다운로드가 완료되었습니다. - - - Cryptographic hashes do not match. - 암호화된 해시가 일치하지 않습니다. - - - Download canceled. - 다운로드가 취소되었습니다. - - - %1 of %2 - %1/%2 - - - %1 downloaded. - %1 다운로드가 완료되었습니다. - - - (%1/sec) - (%1/초) - - - %n day(s), - - %n일, - - - - %n hour(s), - - %n시간, - - - - %n minute(s) - - %n분 - - - - %n second(s) - - %n초 - - - - - %1%2%3%4 remaining. - - 남은 시간: %1%2%3%4 - - - - unknown time remaining. - - 남은 시간: 알 수 없음 - - - - KDUpdater::LocalFileDownloader - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Writing to file "%1" failed: %2 - "%1" 파일에 쓰기 실패: %2 - - - - KDUpdater::ResourceFileDownloader - - Cannot read resource file "%1": %2 - "%1" 리소스 파일을 읽을 수 없음: %2 - - - - KDUpdater::HttpDownloader - - Cannot download %1. Writing to file "%2" failed: %3 - %1을(를) 다운로드할 수 없습니다. "%2" 파일에 쓰기 실패: %3 - - - Cannot download %1. Cannot create file "%2": %3 - %1을(를) 다운로드할 수 없습니다. "%2" 파일을 생성할 수 없음: %3 - - - %1 at %2 - %2의 %1 - - - Authentication request canceled. - 인증 요청이 취소되었습니다. - - - Secure Connection Failed - 보안 연결 실패 - - - There was an error during connection to: %1. - 다음에 연결 중 오류 발생: %1. - - - This could be a problem with the server's configuration, or it could be someone trying to impersonate the server. - 서버 구성에 문제가 있거나 타인이 서버를 가장하는 것으로 보입니다. - - - If you have connected to this server successfully in the past or trust this server, the error may be temporary and you can try again. - 이전에 이 서버에 성공적으로 연결한 적이 있거나 이 서버를 신뢰하는 경우에는 일시적인 오류일 수 있으며, 다시 시도할 수 있습니다. - - - Try again - 다시 시도하기 - - - - Job - - Canceled - 취소됨 - - - - LocalPackageHub - - %1 contains invalid content: %2 - %1에 올바르지 않은 콘텐츠가 포함됨: %2 - - - The file %1 does not exist. - %1 파일이 없습니다. - - - Cannot open %1. - %1을(를) 열 수 없습니다. - - - Parse error in %1 at %2, %3: %4 - %2의 %1에서 파싱 오류 발생, %3: %4 - - - Root element %1 unexpected, should be 'Packages'. - %1 루트 요소는 예상하지 못했습니다. 'Packages'여야 합니다. - - - - LockFile - - Cannot create lock file "%1": %2 - "%1" 파일 잠금을 생성할 수 없음: %2 - - - Cannot write PID to lock file "%1": %2 - "%1" 파일을 잠그기 위해 PID를 쓸 수 없음: %2 - - - Cannot obtain the lock for file "%1": %2 - "%1" 파일을 위한 잠금을 수행할 수 없음: %2 - - - Cannot release the lock for file "%1": %2 - "%1" 파일을 위한 잠금을 해제할 수 없음: %2 - - - - KDUpdater::Task - - %1 started - %1 시작됨 - - - %1 cannot be stopped - %1을(를) 중지할 수 없음 - - - Cannot stop task %1 - %1 작업을 중지할 수 없음 - - - %1 cannot be paused - %1을(를) 일시 중지할 수 없음 - - - Cannot pause task %1 - %1 작업을 일시 중지할 수 없음 - - - Cannot resume task %1 - %1 작업을 다시 시작할 수 없음 - - - %1 done - %1 완료 - - - - KDUpdater::UpdateFinder - - Cannot access the package information of this application. - 이 애플리케이션의 패키지 정보에 액세스할 수 없습니다. - - - No package sources set for this application. - 이 애플리케이션에 설정된 패키지 소스가 없습니다. - - - %n update(s) found. - - %n개의 업데이트를 찾았습니다. - - - - Downloading Updates.xml from update sources. - 업데이트 소스에서 Updates.xml을 다운로드합니다. - - - Cannot download package source %1 from "%2". - "%2"에서 패키지 소스(%1)를 다운로드할 수 없습니다. - - - Updates.xml file(s) downloaded from update sources. - 업데이트 소스에서 Updates.xml 파일이 다운로드되었습니다. - - - Computing applicable updates. - 적용 가능한 업데이트를 계산합니다. - - - Application updates computed. - 적용 가능한 업데이트를 계산했습니다. - - - - KDUpdater::CopyOperation - - Cannot backup file "%1". - "%1" 파일을 백업할 수 없습니다. - - - Cannot copy a non-existent file: %1 - 존재하지 않는 파일을 복사할 수 없음: %1 - - - Cannot remove file "%1": %2 - "1%" 파일을 제거할 수 없음: %2 - - - Cannot copy file "%1" to "%2": %3 - "%1"에서 "%2"에 파일을 복사할 수 없음: %3 - - - Cannot delete file "%1": %2 - "%1" 파일을 삭제할 수 없음: %2 - - - Cannot restore backup file into "%1": %2 - "%1"의 백업 파일을 복원할 수 없음: %2 - - - - KDUpdater::MoveOperation - - Cannot backup file "%1". - "%1" 파일을 백업할 수 없습니다. - - - Cannot remove file "%1": %2 - "1%" 파일을 제거할 수 없음: %2 - - - Cannot copy file "%1" to "%2": %3 - "%1"에서 "%2"에 파일을 복사할 수 없음: %3 - - - Cannot remove file "%1". - "1%" 파일을 제거할 수 없음: - - - Cannot restore backup file for "%1": %2 - "%1"의 백업 파일을 복원할 수 없음: %2 - - - - KDUpdater::DeleteOperation - - Cannot create backup of file "%1": %2 - "%1" 파일의 백업을 생성할 수 없음: %2 - - - Cannot restore backup file for "%1": %2 - "%1"의 백업 파일을 복원할 수 없음: %2 - - - - KDUpdater::MkdirOperation - - Cannot create directory "%1": %2 - "%1" 디렉토리를 생성할 수 없음: %2 - - - Unknown error. - 알 수 없는 오류입니다. - - - Cannot remove directory "%1": %2 - "1%" 디렉토리를 제거할 수 없음: %2 - - - - KDUpdater::RmdirOperation - - Cannot remove directory "%1": %2 - "1%" 디렉토리를 제거할 수 없음: %2 - - - The directory does not exist. - 이 디렉토리가 존재하지 않습니다. - - - Cannot recreate directory "%1": %2 - "1%" 디렉토리를 다시 생성할 수 없습니다. %2 - - - - KDUpdater::AppendFileOperation - - Cannot backup file "%1": %2 - "%1" 파일을 백업할 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Cannot find backup file for "%1". - "%1"의 백업 파일을 찾을 수 없음: - - - Cannot restore backup file for "%1". - "%1"의 백업 파일을 복원할 수 없음: - - - Cannot restore backup file for "%1": %2 - "%1"의 백업 파일을 복원할 수 없음: %2 - - - - KDUpdater::PrependFileOperation - - Cannot backup file "%1": %2 - "%1" 파일을 백업할 수 없음: %2 - - - Cannot open file "%1" for reading: %2 - "%1" 파일을 읽기 위해 열 수 없음: %2 - - - Cannot open file "%1" for writing: %2 - "%1" 파일을 쓰기 위해 열 수 없음: %2 - - - Cannot find backup file for "%1". - "%1"의 백업 파일을 찾을 수 없음: - - - Cannot restore backup file for "%1". - "%1"의 백업 파일을 복원할 수 없음: - - - Cannot restore backup file for "%1": %2 - "%1"의 백업 파일을 복원할 수 없음: %2 - - - - KDUpdater::UpdatesInfoData - - Updates.xml contains invalid content: %1 - Updates.xml 파일에 올바르지 않은 콘텐츠가 포함됨: %1 - - - Cannot read "%1" - "%1"을(를) 읽을 수 없음 - - - Parse error in %1 at %2, %3: %4 - %2의 %1에서 파싱 오류 발생, %3: %4 - - - Root element %1 unexpected, should be "Updates". - %1 루트 요소는 예상하지 못했습니다. 'Updates'여야 합니다. - - - ApplicationName element is missing. - ApplicationName 요소가 누락되었습니다. - - - ApplicationVersion element is missing. - ApplicationVersion 요소가 누락되었습니다. - - - PackageUpdate element without Name - PackageUpdate 요소에 Name이 없음 - - - PackageUpdate element without Version - PackageUpdate 요소에 Version이 없음 - - - PackageUpdate element without ReleaseDate - PackageUpdate 요소에 ReleaseDate가 없음 - - - - InstallerBase - - Unable to start installer - 설치 관리자를 시작할 수 없음 - - - - QInstaller::ExtractArchiveOperation::Worker - - Could not create handler object for archive "%1": "%2". - - - - Cannot open archive "%1" for reading: %2 - "%1" 아카이브를 읽기 위해 열 수 없음: %2 - - - Error while reading contents of archive "%1": %2 - - - - Cannot prepare for file "%1" - - - - Extract for archive "%1" canceled. - - - - Error while extracting archive "%1": %2 - 아카이브 "%1" 추출 중에 오류 발생: %2 - - - -- cgit v1.2.3