/*
 * Portuguese resources for MSI
 *
 * Copyright 2005 Marcelo Duarte
 * Copyright 2006 Américo José Melo
 * Copyright 2010 Gustavo Henrique Milaré
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "windef.h"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
{
	4 "O pacote de instalação especificado não pôde ser aberto. Por favor, verifique o arquivo e tente novamente."
	5 "caminho %s não encontrado"
	9 "insira disco %s"
	10 "Windows Installer %s\n\n" \
	"Modo de usar:\n" \
	"msiexec command {required parameter} [optional parammeter]\n\n" \
	"Instalar um produto:\n" \
	"\t/i {package|productcode} [property]\n" \
	"\t/package {package|productcode} [property]\n" \
	"\t/a package [property]\n" \
	"Reparar uma instalação:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
	"Desinstalar um produto:\n" \
	"\t/uninstall {package|productcode} [property]\n" \
	"\t/x {package|productcode} [property]\n" \
	"Anunciar um produto:\n" \
	"\t/j[u|m] package [/t transform] [/g languageid]\n" \
	"Aplicar um patch:\n" \
	"\t/p patchpackage [property]\n" \
	"\t/p patchpackage /a package [property]\n" \
	"Modificadores Log e UI para os comandos acima:\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"Registrar Serviço MSI:\n" \
	"\t/y\n" \
	"Desregistrar Serviço MSI:\n" \
	"\t/z\n" \
	"Mostrar esta ajuda:\n" \
	"\t/help\n" \
	"\t/?\n"
	11 "entre a pasta que contém %s"
	12 "faltando fonte de instalação para característica"
	13 "faltando drive de rede para característica"
	14 "origem da característica:"
	15 "escolha a pasta que contém %s"
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

STRINGTABLE DISCARDABLE
{
	4 "The specified installation package could not be opened.  Please check the file path and try again."
	5 "localização %s não encontrada"
	9 "insira o disco %s"
	10 "Windows Installer %s\n\n" \
	"Usage:\n" \
	"msiexec command {required parameter} [optional parammeter]\n\n" \
	"Install a product:\n" \
	"\t/i {package|productcode} [property]\n" \
	"\t/package {package|productcode} [property]\n" \
	"\t/a package [property]\n" \
	"Repair an installation:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
	"Uninstall a product:\n" \
	"\t/uninstall {package|productcode} [property]\n" \
	"\t/x {package|productcode} [property]\n" \
	"Advertise a product:\n" \
	"\t/j[u|m] package [/t transform] [/g languageid]\n" \
	"Apply a patch:\n" \
	"\t/p patchpackage [property]\n" \
	"\t/p patchpackage /a package [property]\n" \
	"Log and UI Modifiers for above commands:\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"Register MSI Service:\n" \
	"\t/y\n" \
	"Unregister MSI Service:\n" \
	"\t/z\n" \
	"Display this help:\n" \
	"\t/help\n" \
	"\t/?\n"
	11 "indique que pasta contém %s"
	12 "instalar fonte para a opção em falta"
	13 "controlador de rede para a opção em falta"
	14 "opção de:"
	15 "indique que pasta contém %s"
}
