/*
 * Start
 * Portuguese Language Support
 *
 * Copyright 2003 Marcelo Duarte
 * Copyright 2004 Américo José Melo
 *
 * 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 "resources.h"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
{
STRING_USAGE, "Inicia um programa, ou abre um documento no programa normalmente usado para arquivos com determinado sufixo.\n\
Uso:\n\
start [opções] arquivo_de_programa [argumentos...]\n\
start [opções] arquivo_de_documento.ext\n\
\n\
Options:\n\
/M[inimized] Inicia o programa minimizado.\n\
/MAX[imized] Inicia o programa maximizado.\n\
/R[estored]  Inicia o programa normalmente (sem minimizar nem maximizar).\n\
/W[ait]      Aguarda que o programa iniciado termine e então retorna\n\
\t\tseu valor de saída (exit code).\n\
/ProgIDOpen  Open a document using the following progID.\n\
/L           Mostra a licença ao usuário.\n\
\n\
start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\
Start não vem com ABSOLUTAMENTE NENHUMA GARANTIA; para detalhes execute com a opção /L.\n\
Este é um software livre (free software), e você é bem-vindo a redistribuí-lo sob\n\
certas condições; execute 'start /L' para detalhes.\n\
"

STRING_LICENSE, "start.exe versão 0.2 Copyright (C) 2003, Dan Kegel\n\
This program is free software; you can redistribute it and/or\n\
modify it under the terms of the GNU Lesser Public License\n\
as published by the Free Software Foundation; either version 2.1\n\
of the License, or (at your option) any later version.\n\
\n\
This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
GNU Lesser Public License for more details.\n\
\n\
You should have received a copy of the GNU Lesser Public License\n\
along with this program; if not, write to the Free Software\n\
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n\
\n\
Veja o arquivo COPYING.LIB para informação sobre a licença.\n\
"

STRING_EXECFAIL "O aplicativo não pôde ser iniciado ou não existe aplicativo associado ao arquivo especificado.\nShellExecuteEx falhou"

STRING_UNIXFAIL "Não foi possível traduzir o nome de arquivo Unix para um nome de arquivo DOS."
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

STRINGTABLE DISCARDABLE
{
STRING_USAGE, "Inicia um programa, ou abre um documento no programa normalmente usado para ficheiros com determinado sufixo.\n\
Uso:\n\
start [opções] ficheiro_de_programa [argumentos...]\n\
start [opções] ficheiro_de_documento.ext\n\
\n\
Options:\n\
/M[inimized] Inicia o programa minimizado.\n\
/MAX[imized] Inicia o programa maximizado.\n\
/R[estored]  Inicia o programa normalmente (sem minimizar nem maximizar).\n\
/W[ait]      Aguarda que o programa iniciado termine e então retorne um código (exit code).\n\
/L           Mostra a licença ao utilizador.\n\
\n\
start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\
Start não vem com ABSOLUTAMENTE NENHUMA GARANTIA; para detalhes execute com a opção /L.\n\
Este é um software livre (free software), e é bem-vindo a redistribuí-lo sob certas\n\
condições; execute 'start /L' para detalhes.\n\
"

STRING_LICENSE, "start.exe versão 0.2 Copyright (C) 2003, Dan Kegel\n\
This program is free software; you can redistribute it and/or\n\
modify it under the terms of the GNU Lesser Public License\n\
as published by the Free Software Foundation; either version 2.1\n\
of the License, or (at your option) any later version.\n\
\n\
This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
GNU Lesser Public License for more details.\n\
\n\
You should have received a copy of the GNU Lesser Public License\n\
along with this program; if not, write to the Free Software\n\
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n\
\n\
Veja o ficheiro COPYING.LIB para informação sobre a licença.\n\
"

STRING_EXECFAIL "A aplicação não pode ser iniciada, ou não existe aplicação associada com o ficheiro especificado.\nShellExecuteEx falhado"

STRING_UNIXFAIL "Could not translate the specified Unix filename to a DOS filename."
}
