summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/config/config.xml6
-rw-r--r--dist/packages/org.qtproject.ifw.binaries/meta/package.xml4
-rw-r--r--dist/packages/org.qtproject.ifw/meta/package.xml4
-rw-r--r--doc/operations.qdoc12
-rw-r--r--doc/scripting.qdoc6
-rw-r--r--installerfw.pri6
-rw-r--r--src/libs/installer/packagemanagercoredata.cpp6
-rw-r--r--src/libs/installer/replaceoperation.cpp38
-rw-r--r--src/sdk/sdk.pro20
-rw-r--r--src/sdk/translations/ifw_pt_BR.ts2498
-rw-r--r--tests/auto/installer/installer.pro3
-rw-r--r--tests/auto/installer/replaceoperation/replaceoperation.pro6
-rw-r--r--tests/auto/installer/replaceoperation/tst_replaceoperation.cpp184
13 files changed, 2773 insertions, 20 deletions
diff --git a/dist/config/config.xml b/dist/config/config.xml
index 03be2f09f..1bd1bbe6e 100644
--- a/dist/config/config.xml
+++ b/dist/config/config.xml
@@ -1,13 +1,13 @@
<?xml version="1.0"?>
<Installer>
<Name>Qt Installer Framework</Name>
- <Title>Qt Installer Framework 3.1.2</Title>
- <Version>3.1.2</Version>
+ <Title>Qt Installer Framework 3.2.0</Title>
+ <Version>3.2.0</Version>
<Publisher>Qt Project</Publisher>
<ProductUrl>http://qt-project.org</ProductUrl>
<Watermark>watermark.png</Watermark>
<MaintenanceToolName>Uninstaller</MaintenanceToolName>
<!-- Tweaked for windows in installscript.qs -->
- <TargetDir>@HomeDir@/Qt/QtIFW-3.1.2</TargetDir>
+ <TargetDir>@HomeDir@/Qt/QtIFW-3.2.0</TargetDir>
</Installer>
diff --git a/dist/packages/org.qtproject.ifw.binaries/meta/package.xml b/dist/packages/org.qtproject.ifw.binaries/meta/package.xml
index c446455ef..fd5b37e20 100644
--- a/dist/packages/org.qtproject.ifw.binaries/meta/package.xml
+++ b/dist/packages/org.qtproject.ifw.binaries/meta/package.xml
@@ -2,7 +2,7 @@
<Package>
<DisplayName>Qt Installer Framework Binaries</DisplayName>
<Description>Installs the binaries, examples and help files.</Description>
- <Version>3.1.2</Version>
- <ReleaseDate>2019-06-18</ReleaseDate>
+ <Version>3.2.0</Version>
+ <ReleaseDate>2019-08-23</ReleaseDate>
<Default>True</Default>
</Package>
diff --git a/dist/packages/org.qtproject.ifw/meta/package.xml b/dist/packages/org.qtproject.ifw/meta/package.xml
index fb2b383e2..f810f6286 100644
--- a/dist/packages/org.qtproject.ifw/meta/package.xml
+++ b/dist/packages/org.qtproject.ifw/meta/package.xml
@@ -2,8 +2,8 @@
<Package>
<DisplayName>Qt Installer Framework</DisplayName>
<Description>Installs the Qt Installer Framework.</Description>
- <Version>3.1.2</Version>
- <ReleaseDate>2019-06-18</ReleaseDate>
+ <Version>3.2.0</Version>
+ <ReleaseDate>2019-08-23</ReleaseDate>
<Licenses>
<License name="The Qt Company GPL Exception 1.0" file="LICENSE.GPL3-EXCEPT" />
<License name="Third Party Code Licenses" file="3RDPARTY" />
diff --git a/doc/operations.qdoc b/doc/operations.qdoc
index 98906ab9c..a5346f20a 100644
--- a/doc/operations.qdoc
+++ b/doc/operations.qdoc
@@ -90,8 +90,16 @@
is treated as ASCII text.
\row
\li Replace
- \li "Replace" \c file \c search \ replace
- \li Opens \c file to find \c search string and replaces that with the \c replace string.
+ \li "Replace" \c file \c search \c replace \c mode
+ \li Opens \c file to find \c search string and replaces that with the \c replace string,
+ using \c mode that can be either \c string or \c regex. For regular expressions
+ containing capturing groups, occurrences of \c \1, \c \2, ..., in \c replace are
+ replaced with the string captured by the corresponding capturing group.
+
+ Note that testing the operation using \c devtool does not support commas inside the
+ \c search pattern as they are used as argument separators. When using \c regex mode you
+ should also ensure the \c search pattern adheres to \c QRegularExpression class
+ documentation, particularly to the escaping rules for characters.
\row
\li LineReplace
\li "LineReplace" \c file \c search \c replace
diff --git a/doc/scripting.qdoc b/doc/scripting.qdoc
index 20004e9b7..68a139c47 100644
--- a/doc/scripting.qdoc
+++ b/doc/scripting.qdoc
@@ -270,6 +270,12 @@
See also the table that lists examples of \l {Applications-directory-on-Windows}
{applications directories on Windows}.
\row
+ \li ApplicationsDirUser
+ \li Applications directory for user-specific programs. This is useful on macOS,
+ on other platforms it is the same as \c ApplicationsDir.
+
+ For example, \c {$HOME/Applications} on macOS.
+ \row
\li ApplicationsDirX86
\li Applications Directory for 32 bit programs. This is useful on Windows,
on other platforms it is the same as \c ApplicationsDir.
diff --git a/installerfw.pri b/installerfw.pri
index e15c7c411..cd1227aec 100644
--- a/installerfw.pri
+++ b/installerfw.pri
@@ -3,9 +3,9 @@
}
IFW_PRI_INCLUDED = 1
-IFW_VERSION_STR = 3.1.2
-IFW_VERSION = 0x030102
-IFW_VERSION_WIN32 = 3,1,2,0
+IFW_VERSION_STR = 3.2.0
+IFW_VERSION = 0x030200
+IFW_VERSION_WIN32 = 3,2,0,0
IFW_VERSION_STR_WIN32 = $$IFW_VERSION_STR\0
diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp
index e9af30d17..599352fb9 100644
--- a/src/libs/installer/packagemanagercoredata.cpp
+++ b/src/libs/installer/packagemanagercoredata.cpp
@@ -115,6 +115,12 @@ void PackageManagerCoreData::setDynamicPredefinedVariables()
#endif
m_variables.insert(QLatin1String("ApplicationsDir"), dir);
+ QString dirUser = dir;
+#ifdef Q_OS_MACOS
+ dirUser = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).value(0);
+#endif
+ m_variables.insert(QLatin1String("ApplicationsDirUser"), dirUser);
+
QString dirX86 = dir;
QString dirX64 = dir;
#ifdef Q_OS_WIN
diff --git a/src/libs/installer/replaceoperation.cpp b/src/libs/installer/replaceoperation.cpp
index 8cc1e0315..692bba715 100644
--- a/src/libs/installer/replaceoperation.cpp
+++ b/src/libs/installer/replaceoperation.cpp
@@ -31,6 +31,7 @@
#include <QtCore/QDir>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
+#include <QtCore/QRegularExpression>
using namespace QInstaller;
@@ -46,17 +47,45 @@ void ReplaceOperation::backup()
bool ReplaceOperation::performOperation()
{
+ static const QLatin1String stringMode("string");
+ static const QLatin1String regexMode("regex");
+
// Arguments:
// 1. filename
// 2. Source-String
// 3. Replace-String
- if (!checkArgumentCount(3))
+ // 4. mode=string|regex
+
+ // Calling with three arguments defaults to string search,
+ // this provides backward compatibility with the old syntax.
+ if (!checkArgumentCount(3, 4))
return false;
const QStringList args = arguments();
const QString fileName = args.at(0);
const QString before = args.at(1);
const QString after = args.at(2);
+ QString mode = args.value(3);
+
+ if (mode.isEmpty())
+ mode = stringMode;
+
+ if (before.isEmpty()) {
+ setError(InvalidArguments);
+ setErrorString(tr("Current search argument calling \"%1\" with "
+ "empty search argument is not supported.").arg(name()));
+
+ return false;
+ }
+
+ if (!(mode == stringMode || mode == regexMode)) {
+ setError(InvalidArguments);
+ setErrorString(tr("Current mode argument calling \"%1\" with "
+ "arguments \"%2\" is not supported. Please use string or regex.")
+ .arg(name(), arguments().join(QLatin1String("; "))));
+
+ return false;
+ }
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
@@ -78,7 +107,12 @@ bool ReplaceOperation::performOperation()
}
stream.setDevice(&file);
- stream << replacedFileContent.replace(before, after);
+ if (mode == regexMode) {
+ QRegularExpression regex(before);
+ stream << replacedFileContent.replace(regex, after);
+ } else if (mode == stringMode) {
+ stream << replacedFileContent.replace(before, after);
+ }
file.close();
return true;
diff --git a/src/sdk/sdk.pro b/src/sdk/sdk.pro
index 08f890cec..653f641bb 100644
--- a/src/sdk/sdk.pro
+++ b/src/sdk/sdk.pro
@@ -1,5 +1,5 @@
TEMPLATE = app
-INCLUDEPATH += . ..
+INCLUDEPATH += . ..
TARGET = installerbase
include(../../installerfw.pri)
@@ -40,17 +40,27 @@ exists($$LRELEASE) {
" <qresource prefix=\"/\">"
for (file, IB_TRANSLATIONS) {
lang = $$replace(file, .*_([^/]*)\\.ts, \\1)
+ qlang = $${lang}
qfile = $$[QT_INSTALL_TRANSLATIONS]/qtbase_$${lang}.qm
!exists($$qfile) {
- qfile = $$[QT_INSTALL_TRANSLATIONS]/qt_$${lang}.qm
+ qfile = $$[QT_INSTALL_TRANSLATIONS]/qt_$${qlang}.qm
!exists($$qfile) {
- warning("No Qt translation for '$$lang'; skipping.")
- next()
+ # get 'pt' from 'pt_BR', for example, to find 'qt_pt.qm' file
+ qlang ~= s/_.*//
+ qfile = $$[QT_INSTALL_TRANSLATIONS]/qtbase_$${lang}.qm
+ !exists($$qfile) {
+ qfile = $$[QT_INSTALL_TRANSLATIONS]/qt_$${qlang}.qm
+ !exists($$qfile) {
+ warning("No Qt translation for '$$lang'; skipping.")
+ next()
+ }
+ }
}
}
+
qrc_cont += \
" <file>translations/ifw_$${lang}.qm</file>" \
- " <file alias=\"translations/qt_$${lang}.qm\">$$qfile</file>"
+ " <file alias=\"translations/qt_$${qlang}.qm\">$$qfile</file>"
ACTIVE_IB_TRANSLATIONS += $$file
RESOURCE_DEPS += $$qfile translations/ifw_$${lang}.qm
}
diff --git a/src/sdk/translations/ifw_pt_BR.ts b/src/sdk/translations/ifw_pt_BR.ts
new file mode 100644
index 000000000..2cf9d25f0
--- /dev/null
+++ b/src/sdk/translations/ifw_pt_BR.ts
@@ -0,0 +1,2498 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pt">
+<context>
+ <name>QInstaller::ProxyCredentialsDialog</name>
+ <message>
+ <source>Dialog</source>
+ <translation>Diálogo</translation>
+ </message>
+ <message>
+ <source>The proxy %1 requires a username and password.</source>
+ <translation>O proxy %1 requer um nome de usuário e senha.</translation>
+ </message>
+ <message>
+ <source>Username:</source>
+ <translation>Nome de usuário:</translation>
+ </message>
+ <message>
+ <source>Username</source>
+ <translation>Nome de usuário</translation>
+ </message>
+ <message>
+ <source>Password:</source>
+ <translation>Senha:</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation>Senha</translation>
+ </message>
+ <message>
+ <source>Proxy Credentials</source>
+ <translation>Credenciais do proxy</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ServerAuthenticationDialog</name>
+ <message>
+ <source>Server Requires Authentication</source>
+ <translation>Servidor Requer Autenticação</translation>
+ </message>
+ <message>
+ <source>You need to supply a username and password to access this site.</source>
+ <translation>Você precisa fornecer um nome de usuário e senha para acessar este site.</translation>
+ </message>
+ <message>
+ <source>Username:</source>
+ <translation>Nome de usuário:</translation>
+ </message>
+ <message>
+ <source>Password:</source>
+ <translation>Senha:</translation>
+ </message>
+ <message>
+ <source>%1 at %2</source>
+ <translation>%1 em %2</translation>
+ </message>
+</context>
+<context>
+ <name>Dialog</name>
+ <message>
+ <source>Http authentication required</source>
+ <translation>Autenticação HTTP necessária</translation>
+ </message>
+ <message>
+ <source>You need to supply a Username and Password to access this site.</source>
+ <translation>Você precisa fornecer um nome de usuário e senha para acessar este site.</translation>
+ </message>
+ <message>
+ <source>Username:</source>
+ <translation>Nome de usuário:</translation>
+ </message>
+ <message>
+ <source>Password:</source>
+ <translation>Senha:</translation>
+ </message>
+ <message>
+ <source>%1 at %2</source>
+ <translation>%1 em %2</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <source>Settings</source>
+ <translation>Configurações</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Rede</translation>
+ </message>
+ <message>
+ <source>No proxy</source>
+ <translation>Sem proxy</translation>
+ </message>
+ <message>
+ <source>System proxy settings</source>
+ <translation>Configurações de proxy do sistema</translation>
+ </message>
+ <message>
+ <source>Manual proxy configuration</source>
+ <translation>Configuração manual de proxy</translation>
+ </message>
+ <message>
+ <source>HTTP proxy:</source>
+ <translation>Proxy HTTP:</translation>
+ </message>
+ <message>
+ <source>Port:</source>
+ <translation>Porta:</translation>
+ </message>
+ <message>
+ <source>FTP proxy:</source>
+ <translation>Proxy FTP:</translation>
+ </message>
+ <message>
+ <source>Repositories</source>
+ <translation>Repositórios</translation>
+ </message>
+ <message>
+ <source>Add Username and Password for authentication if needed.</source>
+ <translation>Adicione nome de usuário e senha para autenticação, se necessário.</translation>
+ </message>
+ <message>
+ <source>Use temporary repositories only</source>
+ <translation>Usar apenas repositórios temporários</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Adicionar</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Remover</translation>
+ </message>
+ <message>
+ <source>Test</source>
+ <translation>Testar</translation>
+ </message>
+ <message>
+ <source>Show Passwords</source>
+ <translation>Mostrar Senhas</translation>
+ </message>
+ <message>
+ <source>Check this to use repository during fetch.</source>
+ <translation>Marque isso para usar o repositório durante a busca.</translation>
+ </message>
+ <message>
+ <source>Add the username to authenticate on the server.</source>
+ <translation>Adicione o nome de usuário para autenticar no servidor.</translation>
+ </message>
+ <message>
+ <source>Add the password to authenticate on the server.</source>
+ <translation>Adicione a senha para autenticar no servidor.</translation>
+ </message>
+ <message>
+ <source>The servers URL that contains a valid repository.</source>
+ <translation>URL dos servidores que contém um repositório válido.</translation>
+ </message>
+ <message>
+ <source>An error occurred while testing this repository.</source>
+ <translation>Ocorreu um erro durante o teste deste repositório.</translation>
+ </message>
+ <message>
+ <source>The repository was tested successfully.</source>
+ <translation>O repositório foi testado com sucesso.</translation>
+ </message>
+ <message>
+ <source>Do you want to disable the repository?</source>
+ <translation>Você deseja desabilitar o repositório?</translation>
+ </message>
+ <message>
+ <source>Do you want to enable the repository?</source>
+ <translation>Você deseja habilitar o repositório?</translation>
+ </message>
+ <message>
+ <source>Hide Passwords</source>
+ <translation>Ocultar Senhas</translation>
+ </message>
+ <message>
+ <source>Use</source>
+ <translation>Usar</translation>
+ </message>
+ <message>
+ <source>Username</source>
+ <translation>Nome de usuário</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation>Senha</translation>
+ </message>
+ <message>
+ <source>Repository</source>
+ <translation>Repositório</translation>
+ </message>
+ <message>
+ <source>Default repositories</source>
+ <translation>Repositórios padrão</translation>
+ </message>
+ <message>
+ <source>Temporary repositories</source>
+ <translation>Repositórios temporários</translation>
+ </message>
+ <message>
+ <source>User defined repositories</source>
+ <translation>Repositórios definidos pelo usuário</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Selecionar Todos</translation>
+ </message>
+ <message>
+ <source>Deselect All</source>
+ <translation>Desmarcar Todos</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Authorization required</source>
+ <translation>Autorização necessária</translation>
+ </message>
+ <message>
+ <source>Enter your password to authorize for sudo:</source>
+ <translation>Digite sua senha para autorizar para o sudo:</translation>
+ </message>
+ <message>
+ <source>Error acquiring admin rights</source>
+ <translation>Erro ao adquirir privilégios de administrador</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller</name>
+ <message>
+ <source>No marker found, stopped after %1.</source>
+ <translation>Nenhum marcador encontrado, interrompido após %1.</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Read failed after %1 bytes: %2</source>
+ <translation>Falha na leitura após %1 bytes: %2</translation>
+ </message>
+ <message>
+ <source>Copy failed: %1</source>
+ <translation>Cópia falhou: %1</translation>
+ </message>
+ <message>
+ <source>Write failed after %1 bytes: %2</source>
+ <translation>Falha na gravação após %1 bytes: %2</translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>KiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>MiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>GiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>TiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>PiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>EiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>ZiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>YiB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot remove directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o diretório &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;.</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot copy file from &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível copiar o arquivo de &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Cannot move file from &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível mover o arquivo de &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open temporary file: %1</source>
+ <translation>Não é possível abrir o arquivo temporário: %1</translation>
+ </message>
+ <message>
+ <source>Cannot open temporary file for template %1: %2</source>
+ <translation>Não é possível abrir o arquivo temporário para o modelo %1: %2</translation>
+ </message>
+ <message>
+ <source>Corrupt installation</source>
+ <translation type="vanished">Instalação corrompida</translation>
+ </message>
+ <message>
+ <source>Your installation seems to be corrupted. Please consider re-installing from scratch.</source>
+ <translation type="vanished">Sua instalação parece estar corrompida. Por favor, considere reinstalar a partir do zero.</translation>
+ </message>
+ <message>
+ <source>The specified module could not be found.</source>
+ <translation>O módulo especificado não pôde ser encontrado.</translation>
+ </message>
+</context>
+<context>
+ <name>BinaryLayout</name>
+ <message>
+ <source>Cannot seek to %1 to read the embedded meta data count.</source>
+ <translation>Não é possível avançar até %1 para ler o contador de metadados.</translation>
+ </message>
+ <message>
+ <source>Cannot seek to %1 to read the resource collection segment.</source>
+ <translation>Não é possível avançar até %1 para ler o segmento da coletânea de recursos.</translation>
+ </message>
+ <message>
+ <source>Unexpected mismatch of meta resources. Read %1, expected: %2.</source>
+ <translation>Incompatibilidade inesperada de meta recursos. Lidos %1, esperava: %2.</translation>
+ </message>
+</context>
+<context>
+ <name>BinaryContent</name>
+ <message>
+ <source>Cannot seek to %1 to read the operation data.</source>
+ <translation>Não é possível avançar até %1 para ler os dados da operação.</translation>
+ </message>
+ <message>
+ <source>Cannot seek to %1 to read the resource collection block.</source>
+ <translation>Não é possível avançar até %1 para ler o bloco do conjunto de recursos.</translation>
+ </message>
+ <message>
+ <source>Cannot open meta resource %1.</source>
+ <translation>Não é possível abrir o meta recurso %1.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::Resource</name>
+ <message>
+ <source>Cannot open resource %1 for reading.</source>
+ <translation>Não é possível abrir o recurso %1 para leitura.</translation>
+ </message>
+ <message>
+ <source>Read failed after %1 bytes: %2</source>
+ <translation>Falha na leitura após %1 bytes: %2</translation>
+ </message>
+ <message>
+ <source>Write failed after %1 bytes: %2</source>
+ <translation>Falha na gravação após %1 bytes: %2</translation>
+ </message>
+</context>
+<context>
+ <name>ResourceCollectionManager</name>
+ <message>
+ <source>Cannot open resource %1: %2</source>
+ <translation>Não é possível abrir o recurso %1: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::Component</name>
+ <message>
+ <source>Components cannot have children in updater mode.</source>
+ <translation>Componentes não podem ter filhos no modo de atualização.</translation>
+ </message>
+ <message>
+ <source>Cannot open the requested UI file &quot;%1&quot;: %2</source>
+ <translation>Não é possível abrir o arquivo da interface do usuário solicitado &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot load the requested UI file &quot;%1&quot;: %2</source>
+ <translation>Não é possível carregar o arquivo da interface do usuário solicitado &quot;%1&quot;:%2</translation>
+ </message>
+ <message>
+ <source>Cannot open the requested license file &quot;%1&quot;: %2</source>
+ <translation>Não é possível abrir o arquivo de licença solicitado &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <source>Error: Operation %1 does not exist.</source>
+ <translation>Erro: A operação %1 não existe.</translation>
+ </message>
+ <message>
+ <source>Cannot resolve isDefault in %1</source>
+ <translation>Não é possível resolver o isDefault em %1</translation>
+ </message>
+ <message>
+ <source>There was an error loading the selected component. This component can not be installed.</source>
+ <translation>Houve um erro ao carregar o componente selecionado. Este componente não pode ser instalado.</translation>
+ </message>
+ <message>
+ <source>Update Info: </source>
+ <translation>Informação de Atualização: </translation>
+ </message>
+ <message>
+ <source>There was an error loading the selected component. This component can not be updated.</source>
+ <translation>Houve um erro ao carregar o componente selecionado. Este componente não pode ser atualizado.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ComponentModel</name>
+ <message>
+ <source>Component is marked for installation.</source>
+ <translation>Componente está marcado para instalação.</translation>
+ </message>
+ <message>
+ <source>Component is marked for uninstallation.</source>
+ <translation>Componente está marcado para desinstalação.</translation>
+ </message>
+ <message>
+ <source>Component is installed.</source>
+ <translation>Componente está instalado.</translation>
+ </message>
+ <message>
+ <source>Component is not installed.</source>
+ <translation>Componente não está instalado.</translation>
+ </message>
+ <message>
+ <source>Component Name</source>
+ <translation>Nome do Componente</translation>
+ </message>
+ <message>
+ <source>Action</source>
+ <translation>Ação</translation>
+ </message>
+ <message>
+ <source>Installed Version</source>
+ <translation>Versão Instalada</translation>
+ </message>
+ <message>
+ <source>New Version</source>
+ <translation>Nova Versão</translation>
+ </message>
+ <message>
+ <source>Release Date</source>
+ <translation>Data de Lançamento</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Tamanho</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ConsumeOutputOperation</name>
+ <message>
+ <source>&lt;to be saved installer key name&gt; &lt;executable&gt; [argument1] [argument2] [...]</source>
+ <translation>&lt;a ser salvo nome da chave do instalador&gt; &lt;executável&gt; [argumento1] [argumento2] [...]</translation>
+ </message>
+ <message>
+ <source>Needed installer object in %1 operation is empty.</source>
+ <translation>O objeto de instalação necessário na operação %1 está vazio.</translation>
+ </message>
+ <message>
+ <source>Cannot save the output of &quot;%1&quot; to an empty installer key value.</source>
+ <translation>Não é possível salvar a saída de &quot;%1&quot; em uma chave de instalação vazia.</translation>
+ </message>
+ <message>
+ <source>File &quot;%1&quot; does not exist or is not an executable binary.</source>
+ <translation>O arquivo &quot;%1&quot; não existe ou não é um binário executável.</translation>
+ </message>
+ <message>
+ <source>Running &quot;%1&quot; resulted in a crash.</source>
+ <translation>A execução de &quot;%1&quot; resultou em uma falha.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::CopyDirectoryOperation</name>
+ <message>
+ <source>&lt;source&gt; &lt;target&gt; [&quot;forceOverwrite&quot;]</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Invalid argument in %1: Third argument needs to be forceOverwrite, if specified.</source>
+ <translation>Argumento inválido em %1: O terceiro argumento precisa ser forceOverwrite, se especificado.</translation>
+ </message>
+ <message>
+ <source>Invalid argument in %1: Directory &quot;%2&quot; is invalid.</source>
+ <translation>Argumento inválido em %1: O diretório &quot;%2&quot; é inválido.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;.</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Failed to overwrite &quot;%1&quot;.</source>
+ <translation>Falha ao sobrescrever &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot copy file &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível copiar o arquivo de &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;.</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::CopyFileTask</name>
+ <message>
+ <source>Invalid task item count.</source>
+ <translation>Contagem de item de tarefa inválida.</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Writing to file &quot;%1&quot; failed: %2</source>
+ <translation>A gravação no arquivo &quot;%1&quot; falhou: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::CreateDesktopEntryOperation</name>
+ <message>
+ <source>Cannot backup file &quot;%1&quot;: %2</source>
+ <translation>Não é possível fazer o backup do arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Failed to overwrite file &quot;%1&quot;.</source>
+ <translation>Falha ao sobrescrever o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot write desktop entry to &quot;%1&quot;.</source>
+ <translation>Não é possível gravar a entrada da área de trabalho em &quot;%1&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::CreateLinkOperation</name>
+ <message>
+ <source>Cannot create link from &quot;%1&quot; to &quot;%2&quot;.</source>
+ <translation>Não é possível criar link de &quot;%1&quot; para &quot;%2&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot remove link from &quot;%1&quot; to &quot;%2&quot;.</source>
+ <translation>Não é possível remover o link de &quot;%1&quot; para &quot;%2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::CreateLocalRepositoryOperation</name>
+ <message>
+ <source>Cannot set permissions for file &quot;%1&quot;.</source>
+ <translation>Não é possível definir permissões para o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot move file &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível mover o arquivo &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Installer at &quot;%1&quot; needs to be an offline one.</source>
+ <translation>O instalador em &quot;%1&quot; precisa ser off-line.</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading.</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura.</translation>
+ </message>
+ <message>
+ <source>Cannot read file &quot;%1&quot;: %2</source>
+ <translation>Não é possível ler o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot create target directory: &quot;%1&quot;.</source>
+ <translation>Não é possível criar o diretório: &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Unknown exception caught: %1.</source>
+ <translation>Exceção desconhecida detectada: %1.</translation>
+ </message>
+ <message>
+ <source>Removing file &quot;%1&quot;.</source>
+ <translation>Removendo o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;.</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot remove directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o diretório &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::CreateShortcutOperation</name>
+ <message>
+ <source>&lt;target&gt; &lt;link location&gt; [target arguments] [&quot;workingDirectory=...&quot;] [&quot;iconPath=...&quot;] [&quot;iconId=...&quot;] [&quot;description=...&quot;]</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Failed to overwrite &quot;%1&quot;: %2</source>
+ <translation>Falha ao sobrescrever &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot create link &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o link &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::DownloadArchivesJob</name>
+ <message>
+ <source>Canceled</source>
+ <translation>Cancelado</translation>
+ </message>
+ <message>
+ <source>Downloading hash signature failed.</source>
+ <translation>Falha ao baixar assinatura de hash.</translation>
+ </message>
+ <message>
+ <source>Download Error</source>
+ <translation>Erro de Download</translation>
+ </message>
+ <message>
+ <source>Hash verification while downloading failed. This is a temporary error, please retry.</source>
+ <translation>A verificação de hash durante o download falhou. Este é um erro temporário. Por favor, tente novamente.</translation>
+ </message>
+ <message>
+ <source>Cannot verify Hash</source>
+ <translation>Não é possível verificar o Hash</translation>
+ </message>
+ <message>
+ <source>Cannot download archive %1: %2</source>
+ <translation>Não é possível baixar o arquivo %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot fetch archives: %1
+Error while loading %2</source>
+ <translation>Não é possível buscar arquivos: %1
+Erro ao carregar %2</translation>
+ </message>
+ <message>
+ <source>Downloading archive &quot;%1&quot; for component %2.</source>
+ <translation>Baixando arquivo &quot;%1&quot; para o componente %2.</translation>
+ </message>
+ <message>
+ <source>Scheme %1 not supported (URL: %2).</source>
+ <translation>Esquema %1 não suportado (URL: %2).</translation>
+ </message>
+ <message>
+ <source>Cannot find component for %1.</source>
+ <translation>Não é possível encontrar o componente para %1.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::Downloader</name>
+ <message>
+ <source>Target file &quot;%1&quot; already exists but is not a file.</source>
+ <translation>O arquivo de destino &quot;%1&quot; já existe, mas não é um arquivo.</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <extracomment>%2 is a sentence describing the error</extracomment>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>File &quot;%1&quot; not open for writing: %2</source>
+ <extracomment>%2 is a sentence describing the error.</extracomment>
+ <translation>Arquivo &quot;%1&quot; não aberto para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Writing to file &quot;%1&quot; failed: %2</source>
+ <extracomment>%2 is a sentence describing the error.</extracomment>
+ <translation>A gravação no arquivo &quot;%1&quot; falhou: %2</translation>
+ </message>
+ <message>
+ <source>Redirect loop detected for &quot;%1&quot;.</source>
+ <translation>Loop de redirecionamento detectado para &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Network error while downloading &apos;%1&apos;: %2.</source>
+ <translation>Erro de rede durante o download de &apos;%1&apos;: %2.</translation>
+ </message>
+ <message>
+ <source>Unknown network error while downloading &quot;%1&quot;.</source>
+ <extracomment>%1 is a sentence describing the error</extracomment>
+ <translation>Erro de rede desconhecido durante o download de &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Network transfers canceled.</source>
+ <translation>Transferências de rede canceladas.</translation>
+ </message>
+ <message>
+ <source>Pause and resume not supported by network transfers.</source>
+ <translation>Pausa e retomada não suportada por transferências de rede.</translation>
+ </message>
+ <message>
+ <source>Invalid source URL &quot;%1&quot;: %2</source>
+ <extracomment>%2 is a sentence describing the error</extracomment>
+ <translation>URL inválida &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationRequiredException</name>
+ <message>
+ <source>%1 at %2</source>
+ <translation>%1 em %2</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication.</source>
+ <translation>O proxy requer autenticação.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ElevatedExecuteOperation</name>
+ <message>
+ <source>Cannot start detached: &quot;%1&quot;</source>
+ <translation>Não é possível iniciar desanexado: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Cannot start: &quot;%1&quot;: %2</source>
+ <translation>Não é possível iniciar: &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Program crashed: &quot;%1&quot;</source>
+ <translation>Programa falhou: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Execution failed (Unexpected exit code: %1): &quot;%2&quot;</source>
+ <translation>Falha na execução (código de saída inesperado:%1): &quot;%2&quot;</translation>
+ </message>
+</context>
+<context>
+ <name>UpdateOperation</name>
+ <message>
+ <source>Cannot write to registry path %1.</source>
+ <translation>Não é possível gravar no caminho do registro %1.</translation>
+ </message>
+ <message>
+ <source>Registry path %1 is not writable.</source>
+ <translation>O caminho do registro %1 não é gravável.</translation>
+ </message>
+ <message>
+ <source>exactly %1</source>
+ <translation>exatamente %1</translation>
+ </message>
+ <message>
+ <source>at least %1</source>
+ <translation>pelo menos %1</translation>
+ </message>
+ <message>
+ <source>not more than %1</source>
+ <translation>não mais que %1</translation>
+ </message>
+ <message>
+ <source>%1 or %2</source>
+ <translation>%1 ou %2</translation>
+ </message>
+ <message>
+ <source>%1 to %2</source>
+ <translation>%1 a %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>Invalid arguments in %1: %n arguments given, %2 arguments expected.</source>
+ <translation>
+ <numerusform>Argumento inválido em %1: %n argumento fornecido,%2 argumentos esperados.</numerusform>
+ <numerusform>Argumentos inválidos em %1: %n argumentos fornecidos,%2 argumentos esperados.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>Invalid arguments in %1: %n arguments given, %2 arguments expected in the form: %3.</source>
+ <translation>
+ <numerusform>Argumento inválido em %1: %n argumento fornecido,%2 argumentos esperados no formulário %3.</numerusform>
+ <numerusform>Argumentos inválidos em %1: %n argumentos fornecidos,%2 argumentos esperados no formulário %3.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Renaming file &quot;%1&quot; to &quot;%2&quot; failed: %3</source>
+ <translation>A renomeação do arquivo &quot;%1&quot; para &quot;%2&quot; falhou: %3</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ExtractArchiveOperation::Runnable</name>
+ <message>
+ <source>Cannot open archive &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Error while extracting archive &quot;%1&quot;: %2</source>
+ <translation>Erro ao extrair o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Unknown exception caught while extracting &quot;%1&quot;.</source>
+ <translation>Exceção desconhecida detectada ao extrair &quot;%1&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::FakeStopProcessForUpdateOperation</name>
+ <message>
+ <source>Cannot get package manager core.</source>
+ <translation>Não é possível obter o núcleo do gerenciador de pacotes.</translation>
+ </message>
+ <message>
+ <source>This process should be stopped before continuing: %1</source>
+ <translation>Este processo deve ser interrompido antes de continuar: %1</translation>
+ </message>
+ <message>
+ <source>These processes should be stopped before continuing: %1</source>
+ <translation>Esses processos devem ser interrompidos antes de continuar: %1</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::GlobalSettingsOperation</name>
+ <message>
+ <source>Settings are not writable.</source>
+ <translation>Configurações não são graváveis.</translation>
+ </message>
+ <message>
+ <source>Failed to write settings.</source>
+ <translation>Falha ao gravar configurações.</translation>
+ </message>
+</context>
+<context>
+ <name>InstallerCalculator</name>
+ <message>
+ <source>Components added as automatic dependencies:</source>
+ <translation>Componentes adicionados como dependências automáticas:</translation>
+ </message>
+ <message>
+ <source>Components added as dependency for &quot;%1&quot;:</source>
+ <translation>Componentes adicionados como dependência para &quot;%1&quot;:</translation>
+ </message>
+ <message>
+ <source>Components that have resolved dependencies:</source>
+ <translation>Componentes que resolveram dependências:</translation>
+ </message>
+ <message>
+ <source>Selected components without dependencies:</source>
+ <translation>Componentes selecionados sem dependências:</translation>
+ </message>
+ <message>
+ <source>Recursion detected, component &quot;%1&quot; already added with reason: &quot;%2&quot;</source>
+ <translation>Recursão detectada, componente &quot;%1&quot; já adicionado com o motivo: &quot;%2&quot;</translation>
+ </message>
+ <message>
+ <source>Cannot find missing dependency &quot;%1&quot; for &quot;%2&quot;.</source>
+ <translation>Não foi possível encontrar a dependência ausente &quot;%1&quot; para &quot;%2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::InstallIconsOperation</name>
+ <message>
+ <source>&lt;source path&gt; [vendor prefix]</source>
+ <translation>&lt;caminho de origem&gt; [prefixo do fornecedor]</translation>
+ </message>
+ <message>
+ <source>Invalid Argument: source directory must not be empty.</source>
+ <translation>Argumento Inválido: o diretório de origem não deve estar vazio.</translation>
+ </message>
+ <message>
+ <source>Cannot backup file &quot;%1&quot;: %2</source>
+ <translation>Não é possível fazer o backup do arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Failed to overwrite &quot;%1&quot;: %2</source>
+ <translation>Falha ao sobrescrever &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Failed to copy file &quot;%1&quot;: %2</source>
+ <translation>Falha ao copiar o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>Lib7z</name>
+ <message>
+ <source>internal code: %1</source>
+ <translation>código interno: %1</translation>
+ </message>
+ <message>
+ <source>not enough memory</source>
+ <translation>memória insuficiente</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation>Erro: %1</translation>
+ </message>
+ <message>
+ <source>Cannot retrieve property %1 for item %2.</source>
+ <translation>Não é possível obter a propriedade %1 do item %2.</translation>
+ </message>
+ <message>
+ <source>Property %1 for item %2 not of type VT_FILETIME but %3.</source>
+ <translation>Propriedade %1 do item %2 não é do tipo VT_FILETIME, mas %3.</translation>
+ </message>
+ <message>
+ <source>Cannot convert UTC file time to system time.</source>
+ <translation>Não é possível converter a hora do arquivo UTC em hora do sistema.</translation>
+ </message>
+ <message>
+ <source>Cannot load codecs.</source>
+ <translation>Não é possível carregar codecs.</translation>
+ </message>
+ <message>
+ <source>Cannot open archive &quot;%1&quot;.</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot retrieve number of items in archive.</source>
+ <translation>Não é possível recuperar o número de itens no arquivo.</translation>
+ </message>
+ <message>
+ <source>Cannot retrieve path of archive item &quot;%1&quot;.</source>
+ <translation>Não é possível recuperar o caminho do item de arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Unknown exception caught (%1).</source>
+ <translation>Exceção desconhecida detectada (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot create temporary file: %1</source>
+ <translation>Não é possível criar arquivo temporário: %1</translation>
+ </message>
+ <message>
+ <source>Unsupported archive type.</source>
+ <translation>Tipo de arquivo não suportado.</translation>
+ </message>
+ <message>
+ <source>Cannot create archive &quot;%1&quot;</source>
+ <translation>Não é possível criar o arquivo &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Cannot create archive &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot remove old archive &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o arquivo antigo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot rename temporary archive &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível renomear o arquivo temporário &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Unknown exception caught (%1)</source>
+ <translation>Exceção desconhecida detectada (%1)</translation>
+ </message>
+</context>
+<context>
+ <name>DirectoryGuard</name>
+ <message>
+ <source>Path &quot;%1&quot; exists but is not a directory.</source>
+ <translation>O caminho &quot;%1&quot; existe, mas não é um diretório.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;.</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>ExtractCallbackImpl</name>
+ <message>
+ <source>Cannot retrieve path of archive item %1.</source>
+ <translation>Não é possível recuperar o caminho do item de arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot remove already existing symlink %1.</source>
+ <translation>Não é possível remover o link simbólico já existente %1.</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Cannot create symlink at &quot;%1&quot;. Another one is already existing.</source>
+ <translation>Não é possível criar o link simbólico em &quot;%1&quot;. Outro já existe.</translation>
+ </message>
+ <message>
+ <source>Cannot read symlink target from file &quot;%1&quot;.</source>
+ <translation>Não é possível ler o destino do link simbólico do arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot create symlink at %1: %2</source>
+ <translation>Não é possível criar o link simbólico em %1:%2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::LicenseOperation</name>
+ <message>
+ <source>No license files found to copy.</source>
+ <translation>Nenhum arquivo de licença encontrado para copiar.</translation>
+ </message>
+ <message>
+ <source>Needed installer object in %1 operation is empty.</source>
+ <translation>O objeto de instalação necessário na operação %1 está vazio.</translation>
+ </message>
+ <message>
+ <source>Can not write license file &quot;%1&quot;.</source>
+ <translation>Não é possível gravar o arquivo de licença &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>No license files found to delete.</source>
+ <translation>Nenhum arquivo de licença foi encontrado para ser excluído.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::LineReplaceOperation</name>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::MetadataJob</name>
+ <message>
+ <source>Missing package manager core engine.</source>
+ <translation>Faltando o mecanismo principal do gerenciador de pacotes.</translation>
+ </message>
+ <message>
+ <source>Preparing meta information download...</source>
+ <translation>Preparando o download de metadados...</translation>
+ </message>
+ <message>
+ <source>Unpacking compressed repositories. This may take a while...</source>
+ <translation>Descompactando repositórios compactados. Isso pode demorar um pouco...</translation>
+ </message>
+ <message>
+ <source>Meta data download canceled.</source>
+ <translation>Download de metadados cancelado.</translation>
+ </message>
+ <message>
+ <source>Unknown exception during extracting.</source>
+ <translation>Exceção desconhecida durante a extração.</translation>
+ </message>
+ <message>
+ <source>Missing proxy credentials.</source>
+ <translation>Faltando credenciais de proxy.</translation>
+ </message>
+ <message>
+ <source>Authentication failed.</source>
+ <translation>Falha de autenticação.</translation>
+ </message>
+ <message>
+ <source>Unknown exception during download.</source>
+ <translation>Exceção desconhecida durante o download.</translation>
+ </message>
+ <message>
+ <source>Checksum mismatch detected for &quot;%1&quot;.</source>
+ <translation>Incompatibilidade detectada na soma de verificação para &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Retrieving meta information from remote repository... %1/%2 </source>
+ <translation>Recuperando metadados do repositório remoto...%1/%2 </translation>
+ </message>
+ <message>
+ <source>Retrieving meta information from remote repository... </source>
+ <translation>Recuperando metadados do repositório remoto... </translation>
+ </message>
+ <message>
+ <source>Failure to fetch repositories.</source>
+ <translation>Falha ao buscar repositórios.</translation>
+ </message>
+ <message>
+ <source>Extracting meta information...</source>
+ <translation>Extraindo metadados...</translation>
+ </message>
+ <message>
+ <source>Error while extracting archive &quot;%1&quot;: %2</source>
+ <translation>Erro ao extrair o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Unknown exception caught while extracting archive &quot;%1&quot;.</source>
+ <translation>Exceção desconhecida detectada ao extrair o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::FileTaskObserver</name>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 de %2</translation>
+ </message>
+ <message>
+ <source>%1 received.</source>
+ <translation>%1 recebido.</translation>
+ </message>
+ <message>
+ <source>(%1/sec)</source>
+ <translation>(%1/segundo)</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s), </source>
+ <translation>
+ <numerusform>%n dia, </numerusform>
+ <numerusform>%n dias, </numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s), </source>
+ <translation>
+ <numerusform>%n hora, </numerusform>
+ <numerusform>%n horas, </numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation>
+ <numerusform>%n minuto</numerusform>
+ <numerusform>%n minutos</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation>
+ <numerusform>%n segundo</numerusform>
+ <numerusform>%n segundos</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source> - %1%2%3%4 remaining.</source>
+ <translation> - %1%2%3%4 restantes.</translation>
+ </message>
+ <message>
+ <source> - unknown time remaining.</source>
+ <translation> - tempo restante desconhecido.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::PackageManagerCore</name>
+ <message>
+ <source>Error writing Maintenance Tool</source>
+ <translation>Erro ao gravar a Ferramenta de Manutenção</translation>
+ </message>
+ <message>
+ <source>
+Downloading packages...</source>
+ <translation>
+Baixando pacotes...</translation>
+ </message>
+ <message>
+ <source>Installation canceled by user.</source>
+ <translation>Instalação cancelada pelo usuário.</translation>
+ </message>
+ <message>
+ <source>All downloads finished.</source>
+ <translation>Todos os downloads terminados.</translation>
+ </message>
+ <message>
+ <source>Cancelling the Installer</source>
+ <translation>Cancelando o Instalador</translation>
+ </message>
+ <message>
+ <source>Authentication Error</source>
+ <translation>Erro de Autenticação</translation>
+ </message>
+ <message>
+ <source>Some components could not be removed completely because administrative rights could not be acquired: %1.</source>
+ <translation>Alguns componentes não puderam ser removidos completamente porque não foi possível adquirir privilégios de administrador: %1.</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+ <translation>Erro desconhecido.</translation>
+ </message>
+ <message>
+ <source>Some components could not be removed completely because an unknown error happened.</source>
+ <translation>Alguns componentes não puderam ser removidos completamente porque ocorreu um erro desconhecido.</translation>
+ </message>
+ <message>
+ <source>Application not running in Package Manager mode.</source>
+ <translation>Aplicação não executada no modo Gerenciador de Pacotes.</translation>
+ </message>
+ <message>
+ <source>No installed packages found.</source>
+ <translation>Nenhum pacote instalado foi encontrado.</translation>
+ </message>
+ <message>
+ <source>Application running in Uninstaller mode.</source>
+ <translation>Aplicação em execução no modo Desinstalador.</translation>
+ </message>
+ <message>
+ <source>There is an important update available, please run the updater first.</source>
+ <translation>Existe uma atualização importante disponível, execute o atualizador primeiro.</translation>
+ </message>
+ <message>
+ <source>Cannot resolve all dependencies.</source>
+ <translation>Não é possível resolver todas as dependências.</translation>
+ </message>
+ <message>
+ <source>Components about to be removed.</source>
+ <translation>Componentes prestes a serem removidos.</translation>
+ </message>
+ <message>
+ <source>Error while elevating access rights.</source>
+ <translation>Erro ao elevar os privilégios de acesso.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <source>invalid</source>
+ <translation>inválido</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::PackageManagerCorePrivate</name>
+ <message>
+ <source>Unresolved dependencies</source>
+ <translation>Dependências não resolvidas</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <source>Access error</source>
+ <translation>Erro de acesso</translation>
+ </message>
+ <message>
+ <source>Format error</source>
+ <translation>Erro de formato</translation>
+ </message>
+ <message>
+ <source>Cannot write installer configuration to %1: %2</source>
+ <translation>Não é possível gravar a configuração do instalador em %1: %2</translation>
+ </message>
+ <message>
+ <source>Stop Processes</source>
+ <translation>Parar Processos</translation>
+ </message>
+ <message>
+ <source>These processes should be stopped to continue:
+
+%1</source>
+ <translation>Esses processos devem ser interrompidos para continuar:
+
+%1</translation>
+ </message>
+ <message>
+ <source>Installation canceled by user</source>
+ <translation>Instalação cancelada pelo usuário</translation>
+ </message>
+ <message>
+ <source>Writing maintenance tool.</source>
+ <translation>Escrevendo ferramenta de manutenção.</translation>
+ </message>
+ <message>
+ <source>Failed to seek in file %1: %2</source>
+ <translation>Falha ao procurar no arquivo %1: %2</translation>
+ </message>
+ <message>
+ <source>Maintenance tool is not a bundle</source>
+ <translation>Ferramenta de manutenção não é um pacote</translation>
+ </message>
+ <message>
+ <source>Cannot remove data file &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o arquivo de dados &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot write maintenance tool data to %1: %2</source>
+ <translation>Não é possível gravar dados da ferramenta de manutenção em %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot write maintenance tool to &quot;%1&quot;: %2</source>
+ <translation>Não é possível gravar a ferramenta de manutenção em &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot write maintenance tool binary data to %1: %2</source>
+ <translation>Não é possível gravar dados binários da ferramenta de manutenção em %1: %2</translation>
+ </message>
+ <message>
+ <source>Variable &apos;TargetDir&apos; not set.</source>
+ <translation>Variável &apos;TargetDir&apos; não definida.</translation>
+ </message>
+ <message>
+ <source>Preparing the installation...</source>
+ <translation>Preparando a instalação...</translation>
+ </message>
+ <message>
+ <source>It is not possible to install from network location</source>
+ <translation>Não é possível instalar a partir do local da rede</translation>
+ </message>
+ <message>
+ <source>Creating local repository</source>
+ <translation>Criando repositório local</translation>
+ </message>
+ <message>
+ <source>Creating Maintenance Tool</source>
+ <translation>Criando Ferramenta de Manutenção</translation>
+ </message>
+ <message>
+ <source>
+Installation finished!</source>
+ <translation>
+Instalação finalizada!</translation>
+ </message>
+ <message>
+ <source>
+Installation aborted!</source>
+ <translation>
+Instalação cancelada!</translation>
+ </message>
+ <message>
+ <source>It is not possible to run that operation from a network location</source>
+ <translation>Não é possível executar essa operação a partir de um local de rede</translation>
+ </message>
+ <message>
+ <source>Removing deselected components...</source>
+ <translation>Removendo componentes não selecionados...</translation>
+ </message>
+ <message>
+ <source>
+Update finished!</source>
+ <translation>
+Atualização finalizada!</translation>
+ </message>
+ <message>
+ <source>
+Update aborted!</source>
+ <translation>
+Atualização cancelada!</translation>
+ </message>
+ <message>
+ <source>Uninstallation completed successfully.</source>
+ <translation>Desinstalação concluída com sucesso.</translation>
+ </message>
+ <message>
+ <source>Uninstallation aborted.</source>
+ <translation>Desinstalação cancelada.</translation>
+ </message>
+ <message>
+ <source>
+Installing component %1...</source>
+ <translation>
+Instalando o componente %1...</translation>
+ </message>
+ <message>
+ <source>
+Installing component %1</source>
+ <translation type="vanished">
+Instalando o componente %1</translation>
+ </message>
+ <message>
+ <source>Installer Error</source>
+ <translation>Erro de Instalação</translation>
+ </message>
+ <message>
+ <source>Error during installation process (%1):
+%2</source>
+ <translation>Erro durante o processo de instalação (%1):
+%2</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Feito</translation>
+ </message>
+ <message>
+ <source>Cannot prepare uninstall</source>
+ <translation>Não é possível preparar a desinstalação</translation>
+ </message>
+ <message>
+ <source>Cannot start uninstall</source>
+ <translation>Não é possível iniciar a desinstalação</translation>
+ </message>
+ <message>
+ <source>Error during uninstallation process:
+%1</source>
+ <translation>Erro durante o processo de desinstalação:
+%1</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erro desconhecido</translation>
+ </message>
+ <message>
+ <source>Cannot retrieve remote tree %1.</source>
+ <translation>Não é possível recuperar a árvore remota %1.</translation>
+ </message>
+ <message>
+ <source>Failure to read packages from %1.</source>
+ <translation>Falha ao ler pacotes de %1.</translation>
+ </message>
+ <message>
+ <source>Cannot retrieve meta information: %1</source>
+ <translation>Não é possível recuperar metadados: %1</translation>
+ </message>
+ <message>
+ <source>Cannot add temporary update source information.</source>
+ <translation>Não é possível adicionar informações de fontes de atualização temporária.</translation>
+ </message>
+ <message>
+ <source>Cannot find any update source information.</source>
+ <translation>Não é possível encontrar informações de fonte de atualização.</translation>
+ </message>
+ <message>
+ <source>Dependency cycle between components &quot;%1&quot; and &quot;%2&quot; detected.</source>
+ <translation>Ciclo de dependência entre os componentes &quot;%1&quot; e &quot;%2&quot; detectados.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::PackageManagerGui</name>
+ <message>
+ <source>%1 Setup</source>
+ <translation>Instalação %1</translation>
+ </message>
+ <message>
+ <source>Maintain %1</source>
+ <translation>Manutenção %1</translation>
+ </message>
+ <message>
+ <source>Do you want to cancel the installation process?</source>
+ <translation>Deseja cancelar o processo de instalação?</translation>
+ </message>
+ <message>
+ <source>Do you want to cancel the uninstallation process?</source>
+ <translation>Deseja cancelar o processo de desinstalação?</translation>
+ </message>
+ <message>
+ <source>Do you want to quit the installer application?</source>
+ <translation>Deseja sair do instalador?</translation>
+ </message>
+ <message>
+ <source>Do you want to quit the uninstaller application?</source>
+ <translation>Deseja sair do desinstalador?</translation>
+ </message>
+ <message>
+ <source>Do you want to quit the maintenance application?</source>
+ <translation>Deseja sair do aplicativo de manutenção?</translation>
+ </message>
+ <message>
+ <source>%1 Question</source>
+ <translation>%1</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Configurações</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+ <message>
+ <source>It is not possible to install from network location.
+Please copy the installer to a local drive</source>
+ <translation>Não é possível instalar a partir da rede.
+Por favor, copie o instalador para uma unidade local</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::IntroductionPage</name>
+ <message>
+ <source>Setup - %1</source>
+ <translation>%1 - Configuração</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 Setup Wizard.</source>
+ <translation>Bem-vindo ao Assistente de Configuração %1.</translation>
+ </message>
+ <message>
+ <source>&amp;Add or remove components</source>
+ <translation>&amp;Adicionar ou remover componentes</translation>
+ </message>
+ <message>
+ <source>&amp;Update components</source>
+ <translation>At&amp;ualizar componentes</translation>
+ </message>
+ <message>
+ <source>&amp;Remove all components</source>
+ <translation>&amp;Remover todos os componentes</translation>
+ </message>
+ <message>
+ <source>Retrieving information from remote installation sources...</source>
+ <translation>Recuperando informações das fontes de instalações remotas...</translation>
+ </message>
+ <message>
+ <source>At least one valid and enabled repository required for this action to succeed.</source>
+ <translation>É necessário pelo menos um repositório válido e ativado para que esta ação seja bem-sucedida.</translation>
+ </message>
+ <message>
+ <source>No updates available.</source>
+ <translation>Nenhuma atualização disponível.</translation>
+ </message>
+ <message>
+ <source> Only local package management available.</source>
+ <translation> Apenas gerenciamento de pacotes locais disponível.</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>Sair</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::LicenseAgreementPage</name>
+ <message>
+ <source>License Agreement</source>
+ <translation>Contrato de Licença</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <comment>agree license</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <comment>do not agree license</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Please read the following license agreement. You must accept the terms contained in this agreement before continuing with the installation.</source>
+ <translation>Por favor, leia o seguinte contrato de licença. Você deve aceitar os termos contidos neste contrato antes de continuar com a instalação.</translation>
+ </message>
+ <message>
+ <source>I accept the license.</source>
+ <translation>Eu aceito a licença.</translation>
+ </message>
+ <message>
+ <source>I do not accept the license.</source>
+ <translation>Eu não aceito a licença.</translation>
+ </message>
+ <message>
+ <source>Please read the following license agreements. You must accept the terms contained in these agreements before continuing with the installation.</source>
+ <translation>Por favor, leia os seguintes contratos de licença. Você deve aceitar os termos contidos nesses contratos antes de continuar com a instalação.</translation>
+ </message>
+ <message>
+ <source>I accept the licenses.</source>
+ <translation>Eu aceito as licenças.</translation>
+ </message>
+ <message>
+ <source>I do not accept the licenses.</source>
+ <translation>Eu não aceito as licenças.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ComponentSelectionPage</name>
+ <message>
+ <source>Alt+A</source>
+ <comment>select default components</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Def&amp;ault</source>
+ <translation>Def&amp;ault</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <comment>reset to already installed components</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation>&amp;Resetar</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <comment>select all components</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Select All</source>
+ <translation>&amp;Selecionar Todos</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <comment>deselect all components</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Deselect All</source>
+ <translation>&amp;Desmarcar Todos</translation>
+ </message>
+ <message>
+ <source>&amp;Browse QBSP files</source>
+ <translation>&amp;Procurar arquivos QBSP</translation>
+ </message>
+ <message>
+ <source>This component will occupy approximately %1 on your hard disk drive.</source>
+ <translation>Este componente ocupará aproximadamente %1 na sua unidade de disco rígido.</translation>
+ </message>
+ <message>
+ <source>Open File</source>
+ <translation>Abrir Arquivo</translation>
+ </message>
+ <message>
+ <source>Select Components</source>
+ <translation>Selecionar Componentes</translation>
+ </message>
+ <message>
+ <source>Please select the components you want to update.</source>
+ <translation>Por favor, selecione os componentes que você deseja atualizar.</translation>
+ </message>
+ <message>
+ <source>Please select the components you want to install.</source>
+ <translation>Por favor, selecione os componentes que você deseja instalar.</translation>
+ </message>
+ <message>
+ <source>Please select the components you want to uninstall.</source>
+ <translation>Por favor, selecione os componentes que você deseja desinstalar.</translation>
+ </message>
+ <message>
+ <source>Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated.</source>
+ <translation>Selecione os componentes para instalar. Desmarque os componentes instalados para desinstalá-los. Quaisquer componentes já instalados não serão atualizados.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::TargetDirectoryPage</name>
+ <message>
+ <source>Installation Folder</source>
+ <translation>Pasta de Instalação</translation>
+ </message>
+ <message>
+ <source>Please specify the directory where %1 will be installed.</source>
+ <translation>Por favor especifique o diretório onde %1 será instalado.</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <comment>browse file system to choose a file</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>B&amp;rowse...</source>
+ <translation>P&amp;rocurar...</translation>
+ </message>
+ <message>
+ <source>The directory you selected already exists and contains an installation. Choose a different target for installation.</source>
+ <translation>O diretório selecionado já existe e contém uma instalação. Escolha um destino diferente para instalação.</translation>
+ </message>
+ <message>
+ <source>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?</source>
+ <translation>Você selecionou um diretório não vazio existente para instalação.
+Ele será completamente apagado na desinstalação deste aplicativo.
+Não é aconselhável instalar neste diretório, pois a instalação pode falhar.
+Você quer continuar?</translation>
+ </message>
+ <message>
+ <source>You have selected an existing file or symlink, please choose a different target for installation.</source>
+ <translation>Você selecionou um arquivo ou link simbólico existente, escolha um destino diferente para a instalação.</translation>
+ </message>
+ <message>
+ <source>Select Installation Folder</source>
+ <translation>Selecione a Pasta de Instalação</translation>
+ </message>
+ <message>
+ <source>The installation path cannot be empty, please specify a valid directory.</source>
+ <translation>O caminho da instalação não pode estar vazio, especifique um diretório válido.</translation>
+ </message>
+ <message>
+ <source>The installation path cannot be relative, please specify an absolute path.</source>
+ <translation>O caminho da instalação não pode ser relativo, especifique um caminho absoluto.</translation>
+ </message>
+ <message>
+ <source>The path or installation directory contains non ASCII characters. This is currently not supported! Please choose a different path or installation directory.</source>
+ <translation>O caminho ou diretório de instalação contém caracteres não ASCII. Atualmente, isso não é suportado! Por favor, escolha um caminho ou diretório de instalação diferente.</translation>
+ </message>
+ <message>
+ <source>As the install directory is completely deleted, installing in %1 is forbidden.</source>
+ <translation>Como o diretório de instalação está completamente deletado, a instalação em %1 é proibida.</translation>
+ </message>
+ <message>
+ <source>The path you have entered is too long, please make sure to specify a valid path.</source>
+ <translation>O caminho que você digitou é muito longo, por favor, certifique-se de especificar um caminho válido.</translation>
+ </message>
+ <message>
+ <source>The path you have entered is not valid, please make sure to specify a valid target.</source>
+ <translation>O caminho que você digitou não é válido, por favor, certifique-se de especificar um caminho válido.</translation>
+ </message>
+ <message>
+ <source>The path you have entered is not valid, please make sure to specify a valid drive.</source>
+ <translation>O caminho que você digitou não é válido, por favor, certifique-se de especificar uma unidade válida.</translation>
+ </message>
+ <message>
+ <source>The installation path must not end with &apos;.&apos;, please specify a valid directory.</source>
+ <translation>O caminho da instalação não deve terminar com &apos;.&apos;, por favor, especifique um diretório válido.</translation>
+ </message>
+ <message>
+ <source>The installation path must not contain &quot;%1&quot;, please specify a valid directory.</source>
+ <translation>O caminho da instalação não deve conter &quot;%1&quot;, por favor, especifique um diretório válido.</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Aviso</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::StartMenuDirectoryPage</name>
+ <message>
+ <source>Start Menu shortcuts</source>
+ <translation>Atalhos do Menu Iniciar</translation>
+ </message>
+ <message>
+ <source>Select the Start Menu in which you would like to create the program&apos;s shortcuts. You can also enter a name to create a new directory.</source>
+ <translation>Selecione o local no Menu Iniciar onde você gostaria de criar os atalhos do programa. Você também pode digitar um nome para criar um novo diretório.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ReadyForInstallationPage</name>
+ <message>
+ <source>U&amp;ninstall</source>
+ <translation>Desi&amp;nstalar</translation>
+ </message>
+ <message>
+ <source>Ready to Uninstall</source>
+ <translation>Pronto para Desinstalar</translation>
+ </message>
+ <message>
+ <source>Setup is now ready to begin removing %1 from your computer.&lt;br&gt;&lt;font color=&quot;red&quot;&gt;The program directory %2 will be deleted completely&lt;/font&gt;, including all content in that directory!</source>
+ <translation>O assistente de configuração está pronto para remover %1 do seu computador.&lt;br&gt;&lt;font color=&quot;red&quot;&gt;O diretório do programa %2 será excluído completamente&lt;/font&gt;, incluindo todo o conteúdo nesse diretório!</translation>
+ </message>
+ <message>
+ <source>U&amp;pdate</source>
+ <translation>A&amp;tualizar</translation>
+ </message>
+ <message>
+ <source>Ready to Update Packages</source>
+ <translation>Pronto para Atualizar Pacotes</translation>
+ </message>
+ <message>
+ <source>Setup is now ready to begin updating your installation.</source>
+ <translation>O assistente de configuração está pronto para começar a atualizar sua instalação.</translation>
+ </message>
+ <message>
+ <source>&amp;Install</source>
+ <translation>&amp;Instalar</translation>
+ </message>
+ <message>
+ <source>Ready to Install</source>
+ <translation>Pronto para Instalar</translation>
+ </message>
+ <message>
+ <source>Setup is now ready to begin installing %1 on your computer.</source>
+ <translation>O assistente de configuração está pronto para começar a instalar o %1 no seu computador.</translation>
+ </message>
+ <message>
+ <source>Not enough disk space to store temporary files and the installation. %1 are available, while %2 are at least required.</source>
+ <translation>Não há espaço em disco suficiente para armazenar arquivos temporários e a instalação. %1 estão disponíveis, enquanto pelo menos %2 são necessários.</translation>
+ </message>
+ <message>
+ <source>Not enough disk space to store all selected components! %1 are available while %2 are at least required.</source>
+ <translation>Não há espaço em disco suficiente para armazenar todos os componentes selecionados! %1 estão disponíveis, enquanto pelo menos %2 são necessários.</translation>
+ </message>
+ <message>
+ <source>Not enough disk space to store temporary files! %1 are available while %2 are at least required.</source>
+ <translation>Não há espaço em disco suficiente para armazenar arquivos temporários! %1 estão disponíveis, enquanto pelo menos %2 são necessários.</translation>
+ </message>
+ <message>
+ <source>The volume you selected for installation seems to have sufficient space for installation, but there will be less than 1% of the volume&apos;s space available afterwards. %1</source>
+ <translation>O volume que você selecionou para instalação parece ter espaço suficiente para instalação, mas haverá menos de 100 MB disponíveis posteriormente. %1</translation>
+ </message>
+ <message>
+ <source>The volume you selected for installation seems to have sufficient space for installation, but there will be less than 100 MB available afterwards. %1</source>
+ <translation>O volume que você selecionou para instalação parece ter espaço suficiente para instalação, mas haverá menos de 100 MB do espaço do volume disponível posteriormente. %1</translation>
+ </message>
+ <message>
+ <source>Installation will use %1 of disk space.</source>
+ <translation>A instalação usará %1 de espaço em disco.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::PerformInstallationPage</name>
+ <message>
+ <source>U&amp;ninstall</source>
+ <translation>Desi&amp;nstalar</translation>
+ </message>
+ <message>
+ <source>Uninstalling %1</source>
+ <translation>Desinstalando %1</translation>
+ </message>
+ <message>
+ <source>&amp;Update</source>
+ <translation>At&amp;ualizar</translation>
+ </message>
+ <message>
+ <source>Updating components of %1</source>
+ <translation>Atualizando componentes de %1</translation>
+ </message>
+ <message>
+ <source>&amp;Install</source>
+ <translation>&amp;Instalar</translation>
+ </message>
+ <message>
+ <source>Installing %1</source>
+ <translation>Instalando %1</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::FinishedPage</name>
+ <message>
+ <source>Completing the %1 Wizard</source>
+ <translation>Concluindo o Assistente %1</translation>
+ </message>
+ <message>
+ <source>Click %1 to exit the %2 Wizard.</source>
+ <translation>Clique em %1 para sair do Assistente %2.</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Reiniciar</translation>
+ </message>
+ <message>
+ <source>Run %1 now.</source>
+ <translation>Executar %1 agora.</translation>
+ </message>
+ <message>
+ <source>The %1 Wizard failed.</source>
+ <translation>O Assistente %1 falhou.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::RestartPage</name>
+ <message>
+ <source>Completing the %1 Setup Wizard</source>
+ <translation>Concluindo o Assistente de Configuração %1</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::PerformInstallationForm</name>
+ <message>
+ <source>&amp;Show Details</source>
+ <translation>Mostrar &amp;Detalhes</translation>
+ </message>
+ <message>
+ <source>&amp;Hide Details</source>
+ <translation>&amp;Esconder Detalhes</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::RegisterFileTypeOperation</name>
+ <message>
+ <source>Registering file types is only supported on Windows.</source>
+ <translation>O registro de tipos de arquivos é suportado apenas no Windows.</translation>
+ </message>
+ <message>
+ <source>Register File Type: Invalid arguments</source>
+ <translation>Registro de Tipo de Arquivo: argumentos inválidos</translation>
+ </message>
+</context>
+<context>
+ <name>RemoteClient</name>
+ <message>
+ <source>Cannot get authorization.</source>
+ <translation>Não é possível obter autorização.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Não é possível obter a autorização necessária para continuar a instalação.
+
+Por favor, inicie o programa de instalação como um usuário com os privilégios apropriados.
+Ou aceite a elevação de direitos de acesso se for solicitado.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Não é possível obter a autorização necessária para continuar a instalação.
+ Anule a instalação ou use a solução de fallback executando
+
+%1
+
+como um usuário com os privilégios apropriados e, em seguida, clicando em OK.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::RemoteObject</name>
+ <message>
+ <source>Cannot read all data after sending command: %1. Bytes expected: %2, Bytes received: %3. Error: %4</source>
+ <translation>Não é possível ler todos os dados após o envio do comando: %1. Bytes esperados: %2, Bytes recebidos: %3. Erro: %4</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ReplaceOperation</name>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ScriptEngine</name>
+ <message>
+ <source>Cannot open script file at %1: %2</source>
+ <translation>Não é possível abrir o arquivo de script em %1: %2</translation>
+ </message>
+ <message>
+ <source>Exception while loading the component script &quot;%1&quot;: %2</source>
+ <translation>Exceção ao carregar o script do componente &quot;%1&quot; %2</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+ <translation>Erro desconhecido.</translation>
+ </message>
+ <message>
+ <source>on line number: </source>
+ <translation>na linha número: </translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::SelfRestartOperation</name>
+ <message>
+ <source>Installer object needed in operation %1 is empty.</source>
+ <translation>O objeto de instalação necessário na operação %1 está vazio.</translation>
+ </message>
+ <message>
+ <source>Self Restart: Only valid within updater or packagemanager mode.</source>
+ <translation>Reinício Automático: Válido somente no modo updater ou packagemanager.</translation>
+ </message>
+ <message>
+ <source>Self Restart: Invalid arguments</source>
+ <translation>Reinício Automático: Argumentos inválidos</translation>
+ </message>
+</context>
+<context>
+ <name>Settings</name>
+ <message>
+ <source>Cannot open settings file %1 for reading: %2</source>
+ <translation>Não é possível abrir o arquivo de configurações %1 para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Package categories</source>
+ <translation>Categorias de pacote</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::SettingsOperation</name>
+ <message>
+ <source>Missing argument(s) &quot;%1&quot; calling %2 with arguments &quot;%3&quot;.</source>
+ <translation>Argumento(s) ausente(s) &quot;%1&quot; chamando %2 com argumentos &quot;%3&quot;.</translation>
+ </message>
+ <message>
+ <source>Current method argument calling &quot;%1&quot; with arguments &quot;%2&quot; is not supported. Please use set, remove, add_array_value or remove_array_value.</source>
+ <translation>O argumento do método atual chamando &quot;%1&quot; com argumentos &quot;%2&quot; não é suportado. Por favor, use set, remove, add_array_value ou remove_array_value.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::SimpleMoveFileOperation</name>
+ <message>
+ <source>None of the arguments can be empty: source &quot;%1&quot;, target &quot;%2&quot;.</source>
+ <translation>Nenhum dos argumentos pode estar vazio: origem &quot;%1&quot;, destino &quot;%2&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot move file from &quot;%1&quot; to &quot;%2&quot;, because the target path exists and is not removable.</source>
+ <translation>Não é possível mover o arquivo de &quot;%1&quot; para &quot;%2&quot; porque o caminho de destino existe e não é removível.</translation>
+ </message>
+ <message>
+ <source>Cannot move file &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível mover o arquivo &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Moving file &quot;%1&quot; to &quot;%2&quot;.</source>
+ <translation>Movendo arquivo &quot;%1&quot; para &quot;%2&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::TestRepository</name>
+ <message>
+ <source>Missing package manager core engine.</source>
+ <translation>Faltando o mecanismo principal do gerenciador de pacotes.</translation>
+ </message>
+ <message>
+ <source>Empty repository URL.</source>
+ <translation>URL do repositório vazia.</translation>
+ </message>
+ <message>
+ <source>Download canceled.</source>
+ <translation>Download cancelado.</translation>
+ </message>
+ <message>
+ <source>Timeout while testing repository &quot;%1&quot;.</source>
+ <translation>Tempo esgotado durante o teste do repositório &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot parse Updates.xml: %1</source>
+ <translation>Não é possível analisar o arquivo Updates.xml: %1</translation>
+ </message>
+ <message>
+ <source>Cannot open Updates.xml for reading: %1</source>
+ <translation>Não é possível abrir o arquivo Updates.xml para leitura: %1</translation>
+ </message>
+ <message>
+ <source>Authentication failed.</source>
+ <translation>Falha de autenticação.</translation>
+ </message>
+ <message>
+ <source>Unknown error while testing repository &quot;%1&quot;.</source>
+ <translation>Erro desconhecido ao testar o repositório &quot;%1&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::FileDownloader</name>
+ <message>
+ <source>Download finished.</source>
+ <translation>Download concluído.</translation>
+ </message>
+ <message>
+ <source>Cryptographic hashes do not match.</source>
+ <translation>Os hashes criptográficos não coincidem.</translation>
+ </message>
+ <message>
+ <source>Download canceled.</source>
+ <translation>Download cancelado.</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 de %2</translation>
+ </message>
+ <message>
+ <source>%1 downloaded.</source>
+ <translation>%1 baixado.</translation>
+ </message>
+ <message>
+ <source>(%1/sec)</source>
+ <translation>(%1/segundo)</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s), </source>
+ <translation>
+ <numerusform>%n dia, </numerusform>
+ <numerusform>%n dias, </numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s), </source>
+ <translation>
+ <numerusform>%n hora, </numerusform>
+ <numerusform>%n horas, </numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation>
+ <numerusform>%n minuto</numerusform>
+ <numerusform>%n minutos</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation>
+ <numerusform>%n segundo</numerusform>
+ <numerusform>%n segundos</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source> - %1%2%3%4 remaining.</source>
+ <translation> - %1%2%3%4 restantes.</translation>
+ </message>
+ <message>
+ <source> - unknown time remaining.</source>
+ <translation> - tempo restante desconhecido.</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::LocalFileDownloader</name>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Writing to file &quot;%1&quot; failed: %2</source>
+ <translation>A gravação no arquivo &quot;%1&quot; falhou: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::ResourceFileDownloader</name>
+ <message>
+ <source>Cannot read resource file &quot;%1&quot;: %2</source>
+ <translation>Não é possível ler o arquivo de recursos &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::HttpDownloader</name>
+ <message>
+ <source>Cannot download %1. Writing to file &quot;%2&quot; failed: %3</source>
+ <translation>Não é possível fazer o download de %1. A gravação no arquivo &quot;%2&quot; falhou: %3</translation>
+ </message>
+ <message>
+ <source>Cannot download %1. Cannot create file &quot;%2&quot;: %3</source>
+ <translation>Não é possível fazer o download de %1. Não é possível criar o arquivo &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>%1 at %2</source>
+ <translation>%1 em %2</translation>
+ </message>
+ <message>
+ <source>Authentication request canceled.</source>
+ <translation>Pedido de autenticação cancelado.</translation>
+ </message>
+ <message>
+ <source>Secure Connection Failed</source>
+ <translation>Falha na Conexão Segura</translation>
+ </message>
+ <message>
+ <source>There was an error during connection to: %1.</source>
+ <translation>Houve um erro durante a conexão com: %1.</translation>
+ </message>
+ <message>
+ <source>This could be a problem with the server&apos;s configuration, or it could be someone trying to impersonate the server.</source>
+ <translation>Isso pode ser um problema na configuração do servidor ou alguém tentando se passar pelo servidor.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Se você se conectou a este servidor com sucesso no passado ou confia nele, o erro pode ser temporário e você pode tentar novamente.</translation>
+ </message>
+ <message>
+ <source>Try again</source>
+ <translation>Tente novamente</translation>
+ </message>
+</context>
+<context>
+ <name>Job</name>
+ <message>
+ <source>Canceled</source>
+ <translation>Cancelado</translation>
+ </message>
+</context>
+<context>
+ <name>LocalPackageHub</name>
+ <message>
+ <source>%1 contains invalid content: %2</source>
+ <translation>%1 contém conteúdo inválido: %2</translation>
+ </message>
+ <message>
+ <source>The file %1 does not exist.</source>
+ <translation>O arquivo %1 não existe.</translation>
+ </message>
+ <message>
+ <source>Cannot open %1.</source>
+ <translation>Não é possível abrir %1.</translation>
+ </message>
+ <message>
+ <source>Parse error in %1 at %2, %3: %4</source>
+ <translation>Erro de análise em %1 em %2, %3: %4</translation>
+ </message>
+ <message>
+ <source>Root element %1 unexpected, should be &apos;Packages&apos;.</source>
+ <translation>Elemento raiz %1 inesperado. Deveria ser &apos;Packages&apos;.</translation>
+ </message>
+</context>
+<context>
+ <name>LockFile</name>
+ <message>
+ <source>Cannot create lock file &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o arquivo de bloqueio &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot write PID to lock file &quot;%1&quot;: %2</source>
+ <translation>Não é possível gravar o PID no arquivo de bloqueio &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot obtain the lock for file &quot;%1&quot;: %2</source>
+ <translation>Não é possível obter o bloqueio para o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot release the lock for file &quot;%1&quot;: %2</source>
+ <translation>Não é possível liberar o bloqueio para o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::Task</name>
+ <message>
+ <source>%1 started</source>
+ <translation>%1 inicializado</translation>
+ </message>
+ <message>
+ <source>%1 cannot be stopped</source>
+ <translation>%1 não pode ser parado</translation>
+ </message>
+ <message>
+ <source>Cannot stop task %1</source>
+ <translation>Não é possível parar a tarefa %1</translation>
+ </message>
+ <message>
+ <source>%1 cannot be paused</source>
+ <translation>%1 não pode ser pausado</translation>
+ </message>
+ <message>
+ <source>Cannot pause task %1</source>
+ <translation>Não é possível pausar a tarefa %1</translation>
+ </message>
+ <message>
+ <source>Cannot resume task %1</source>
+ <translation>Não é possível retomar a tarefa %1</translation>
+ </message>
+ <message>
+ <source>%1 done</source>
+ <translation>%1 concluído</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::UpdateFinder</name>
+ <message>
+ <source>Cannot access the package information of this application.</source>
+ <translation>Não é possível acessar as informações do pacote desta aplicação.</translation>
+ </message>
+ <message>
+ <source>No package sources set for this application.</source>
+ <translation>Nenhuma fonte de pacote definida para esta aplicação.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n update(s) found.</source>
+ <translation>
+ <numerusform>%n atualização encontrada.</numerusform>
+ <numerusform>%n atualizações encontradas.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Downloading Updates.xml from update sources.</source>
+ <translation>Baixando o arquivo Updates.xml dos repositórios de atualização.</translation>
+ </message>
+ <message>
+ <source>Cannot download package source %1 from &quot;%2&quot;.</source>
+ <translation>Não é possível baixar a fonte de pacote %1 de &quot;%2&quot;.</translation>
+ </message>
+ <message>
+ <source>Updates.xml file(s) downloaded from update sources.</source>
+ <translation>Arquivos Updates.xml baixados das fontes de atualização.</translation>
+ </message>
+ <message>
+ <source>Computing applicable updates.</source>
+ <translation>Calculando atualizações aplicáveis.</translation>
+ </message>
+ <message>
+ <source>Application updates computed.</source>
+ <translation>Atualizações aplicáveis calculadas.</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::CopyOperation</name>
+ <message>
+ <source>Cannot backup file &quot;%1&quot;.</source>
+ <translation>Não é possível fazer o backup do arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot copy a non-existent file: %1</source>
+ <translation>Não é possível copiar um arquivo inexistente: %1</translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot copy file &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível copiar o arquivo de &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Cannot delete file &quot;%1&quot;: %2</source>
+ <translation>Não é possível deletar o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file into &quot;%1&quot;: %2</source>
+ <translation>Não é possível restaurar o arquivo de backup em &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::MoveOperation</name>
+ <message>
+ <source>Cannot backup file &quot;%1&quot;.</source>
+ <translation>Não é possível fazer o backup do arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot copy file &quot;%1&quot; to &quot;%2&quot;: %3</source>
+ <translation>Não é possível copiar o arquivo de &quot;%1&quot; para &quot;%2&quot;: %3</translation>
+ </message>
+ <message>
+ <source>Cannot remove file &quot;%1&quot;.</source>
+ <translation>Não é possível remover o arquivo &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file for &quot;%1&quot;: %2</source>
+ <translation>Não é possível restaurar o arquivo de backup para &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::DeleteOperation</name>
+ <message>
+ <source>Cannot create backup of file &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar backup do arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file for &quot;%1&quot;: %2</source>
+ <translation>Não é possível restaurar o arquivo de backup para &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::MkdirOperation</name>
+ <message>
+ <source>Cannot create directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível criar o diretório &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+ <translation>Erro desconhecido.</translation>
+ </message>
+ <message>
+ <source>Cannot remove directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o diretório &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::RmdirOperation</name>
+ <message>
+ <source>Cannot remove directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível remover o diretório &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>The directory does not exist.</source>
+ <translation>O diretório não existe.</translation>
+ </message>
+ <message>
+ <source>Cannot recreate directory &quot;%1&quot;: %2</source>
+ <translation>Não é possível recriar o diretório &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::AppendFileOperation</name>
+ <message>
+ <source>Cannot backup file &quot;%1&quot;: %2</source>
+ <translation>Não é possível fazer o backup do arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Cannot find backup file for &quot;%1&quot;.</source>
+ <translation>Não é possível encontrar o arquivo de backup para &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file for &quot;%1&quot;.</source>
+ <translation>Não é possível restaurar o arquivo de backup para &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file for &quot;%1&quot;: %2</source>
+ <translation>Não é possível restaurar o arquivo de backup para &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::PrependFileOperation</name>
+ <message>
+ <source>Cannot backup file &quot;%1&quot;: %2</source>
+ <translation>Não é possível fazer o backup do arquivo &quot;%1&quot;: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for reading: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para leitura: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open file &quot;%1&quot; for writing: %2</source>
+ <translation>Não é possível abrir o arquivo &quot;%1&quot; para gravação: %2</translation>
+ </message>
+ <message>
+ <source>Cannot find backup file for &quot;%1&quot;.</source>
+ <translation>Não é possível encontrar o arquivo de backup para &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file for &quot;%1&quot;.</source>
+ <translation>Não é possível restaurar o arquivo de backup para &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot restore backup file for &quot;%1&quot;: %2</source>
+ <translation>Não é possível restaurar o arquivo de backup para &quot;%1&quot;: %2</translation>
+ </message>
+</context>
+<context>
+ <name>KDUpdater::UpdatesInfoData</name>
+ <message>
+ <source>Updates.xml contains invalid content: %1</source>
+ <translation>O arquivo Updates.xml contém conteúdo inválido: %1</translation>
+ </message>
+ <message>
+ <source>Cannot read &quot;%1&quot;</source>
+ <translation>Não é possível ler &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Parse error in %1 at %2, %3: %4</source>
+ <translation>Erro de análise em %1 em %2, %3: %4</translation>
+ </message>
+ <message>
+ <source>Root element %1 unexpected, should be &quot;Updates&quot;.</source>
+ <translation>Elemento raiz %1 inesperado. Deveria ser &apos;Updates&apos;.</translation>
+ </message>
+ <message>
+ <source>ApplicationName element is missing.</source>
+ <translation>O elemento &quot;ApplicationName&quot; está faltando.</translation>
+ </message>
+ <message>
+ <source>ApplicationVersion element is missing.</source>
+ <translation>O elemento &quot;ApplicationVersion&quot; está faltando.</translation>
+ </message>
+ <message>
+ <source>PackageUpdate element without Name</source>
+ <translation>Elemento &quot;PackageUpdate&quot; sem &quot;Name&quot;</translation>
+ </message>
+ <message>
+ <source>PackageUpdate element without Version</source>
+ <translation>Elemento &quot;PackageUpdate&quot; sem &quot;Version&quot;</translation>
+ </message>
+ <message>
+ <source>PackageUpdate element without ReleaseDate</source>
+ <translation>Elemento &quot;PackageUpdate&quot; sem &quot;ReleaseDate&quot;</translation>
+ </message>
+</context>
+<context>
+ <name>InstallerBase</name>
+ <message>
+ <source>Waiting for %1</source>
+ <translation>Aguardando por %1</translation>
+ </message>
+ <message>
+ <source>Another %1 instance is already running. Wait until it finishes, close it, or restart your system.</source>
+ <translation>Outra instância %1 já está em execução. Espere até que termine, feche ou reinicie o sistema.</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ComponentSelectionPagePrivate</name>
+ <message>
+ <source>Fetch</source>
+ <translation>Buscar</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erro</translation>
+ </message>
+</context>
+<context>
+ <name>QInstaller::ExtractArchiveOperation</name>
+ <message>
+ <source>Extracting &quot;%1&quot;</source>
+ <translation>Extraindo &quot;%1&quot;</translation>
+ </message>
+</context>
+</TS>
diff --git a/tests/auto/installer/installer.pro b/tests/auto/installer/installer.pro
index db94a23cb..7081a6316 100644
--- a/tests/auto/installer/installer.pro
+++ b/tests/auto/installer/installer.pro
@@ -21,7 +21,8 @@ SUBDIRS += \
settingsoperation \
task \
clientserver \
- factory
+ factory \
+ replaceoperation
win32 {
SUBDIRS += registerfiletypeoperation
diff --git a/tests/auto/installer/replaceoperation/replaceoperation.pro b/tests/auto/installer/replaceoperation/replaceoperation.pro
new file mode 100644
index 000000000..d2756d153
--- /dev/null
+++ b/tests/auto/installer/replaceoperation/replaceoperation.pro
@@ -0,0 +1,6 @@
+include(../../qttest.pri)
+
+QT -= gui
+QT += testlib
+
+SOURCES += tst_replaceoperation.cpp
diff --git a/tests/auto/installer/replaceoperation/tst_replaceoperation.cpp b/tests/auto/installer/replaceoperation/tst_replaceoperation.cpp
new file mode 100644
index 000000000..9afd91875
--- /dev/null
+++ b/tests/auto/installer/replaceoperation/tst_replaceoperation.cpp
@@ -0,0 +1,184 @@
+/**************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#include <fileutils.h>
+#include <replaceoperation.h>
+#include <qinstallerglobal.h>
+
+#include <QObject>
+#include <QDir>
+#include <QFile>
+#include <QTest>
+
+using namespace KDUpdater;
+using namespace QInstaller;
+
+class tst_replaceoperation : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase()
+ {
+ m_testDirectory = QInstaller::generateTemporaryFileName();
+ m_testFilePath = m_testDirectory + "/test." + QString::number(qrand() % 1000);
+ }
+
+ void testWrongArguments()
+ {
+ ReplaceOperation missingArgumentsOperation(nullptr);
+ missingArgumentsOperation.setArguments(QStringList() << "testFile" << "testSearch");
+
+ // should do nothing if there are missing arguments
+ QVERIFY(missingArgumentsOperation.testOperation());
+ QCOMPARE(missingArgumentsOperation.performOperation(), false);
+
+ ReplaceOperation invalidModeArgumentOperation(nullptr);
+ invalidModeArgumentOperation.setArguments(QStringList() << "testFile"
+ << "testSearch" << "testReplace" << "invalid");
+
+ // should do nothing if there is an invalid mode argument
+ QVERIFY(invalidModeArgumentOperation.testOperation());
+ QCOMPARE(invalidModeArgumentOperation.performOperation(), false);
+
+ QCOMPARE(UpdateOperation::Error(invalidModeArgumentOperation.error()),
+ UpdateOperation::InvalidArguments);
+
+ QString compareString = "Current mode argument calling \"Replace\" with "
+ "arguments \"testFile; testSearch; testReplace; invalid\" is not supported. "
+ "Please use string or regex.";
+
+ QCOMPARE(invalidModeArgumentOperation.errorString(), compareString);
+
+ ReplaceOperation emptySearchArgumentOperation(nullptr);
+ emptySearchArgumentOperation.setArguments(QStringList() << "testFile"
+ << "" << "testReplace" << "regex");
+
+ // should do nothing if there is an empty search argument
+ QVERIFY(emptySearchArgumentOperation.testOperation());
+ QCOMPARE(emptySearchArgumentOperation.performOperation(), false);
+
+ QCOMPARE(UpdateOperation::Error(emptySearchArgumentOperation.error()),
+ UpdateOperation::InvalidArguments);
+
+ compareString = "Current search argument calling \"Replace\" with "
+ "empty search argument is not supported.";
+
+ QCOMPARE(emptySearchArgumentOperation.errorString(), compareString);
+ }
+
+ void testStringSearchReplace()
+ {
+ QVERIFY(QDir().mkpath(m_testDirectory));
+ QVERIFY(QDir(m_testDirectory).exists());
+
+ QFile file(m_testFilePath);
+ QVERIFY(file.open(QIODevice::WriteOnly));
+
+ QTextStream stream(&file);
+ stream << "Lorem ipsum dolore sit amet, consectetur adipiscing elit, sed do eiusmod "
+ "tempor incididunt ut labore et dolore magna aliqua." << endl;
+ file.close();
+
+ ReplaceOperation searchReplaceOperation(nullptr);
+ searchReplaceOperation.setArguments(QStringList() << m_testFilePath
+ << "dolore" << "test");
+
+ // should succeed
+ QVERIFY(searchReplaceOperation.testOperation());
+ QCOMPARE(searchReplaceOperation.performOperation(), true);
+
+ QVERIFY(file.open(QIODevice::ReadOnly));
+
+ QString fileContent = stream.readAll();
+ QCOMPARE(fileContent, QLatin1String(
+ "Lorem ipsum test sit amet, consectetur adipiscing elit, sed do eiusmod "
+ "tempor incididunt ut labore et test magna aliqua.\n"));
+
+ file.close();
+ QVERIFY(file.remove());
+ QVERIFY(QDir().rmdir(m_testDirectory));
+ }
+
+ void testRegexSearchReplace()
+ {
+ // Test with three different regexes, one containing
+ // a capturing group
+
+ QVERIFY(QDir().mkpath(m_testDirectory));
+ QVERIFY(QDir(m_testDirectory).exists());
+
+ QFile file(m_testFilePath);
+ QVERIFY(file.open(QIODevice::WriteOnly));
+
+ QTextStream stream(&file);
+ stream << "one | 10/10/2010 | three | 1.2345 | 0.00001 "
+ "| 7 | A <i>bon mot</i>." << endl;
+ file.close();
+
+ ReplaceOperation searchReplaceOperation(nullptr);
+ searchReplaceOperation.setArguments(QStringList() << m_testFilePath
+ << "\\d{1,2}/\\d{1,2}/\\d{4}" << "date-match" << "regex");
+
+ // should succeed
+ QVERIFY(searchReplaceOperation.testOperation());
+ QCOMPARE(searchReplaceOperation.performOperation(), true);
+
+ searchReplaceOperation.setArguments(QStringList() << m_testFilePath
+ << "[-+]?[0-9]*\\.?[0-9]+" << "number-match" << "regex");
+
+ // should succeed
+ QVERIFY(searchReplaceOperation.testOperation());
+ QCOMPARE(searchReplaceOperation.performOperation(), true);
+
+ searchReplaceOperation.setArguments(QStringList() << m_testFilePath
+ << "<i>([^<]*)</i>" << "\\emph{\\1}" << "regex");
+
+ // should succeed
+ QVERIFY(searchReplaceOperation.testOperation());
+ QCOMPARE(searchReplaceOperation.performOperation(), true);
+
+ QVERIFY(file.open(QIODevice::ReadOnly));
+
+ QString fileContent = stream.readAll();
+ QCOMPARE(fileContent, QLatin1String("one | date-match | three "
+ "| number-match | number-match | number-match | A \\emph{bon mot}.\n"));
+
+ file.close();
+ QVERIFY(file.remove());
+ QVERIFY(QDir().rmdir(m_testDirectory));
+ }
+
+private:
+ QString m_testDirectory;
+ QString m_testFilePath;
+};
+
+QTEST_MAIN(tst_replaceoperation)
+
+#include "tst_replaceoperation.moc"