/*
 * Notepad
 * Portuguese Language Support
 *
 * Copyright 1999 Marcel Baur <alves@correionet.com.br>
 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 * 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 "notepad_res.h"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

MAIN_MENU MENU
{
 POPUP "&Arquivo" {
  MENUITEM "&Novo\tCtrl+N",		CMD_NEW
  MENUITEM "A&brir...\tCtrl+O",		CMD_OPEN
  MENUITEM "&Salvar\tCtrl+S",		CMD_SAVE
  MENUITEM "Salvar &como...",	CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Imprimir...\tCtrl+P",		CMD_PRINT
  MENUITEM "C&onfigurar página...",	CMD_PAGE_SETUP
  MENUITEM "Configurar i&mpressora...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "Sai&r",		CMD_EXIT
 }
POPUP "&Editar" {
  MENUITEM "&Desfazer\tCtrl+Z", CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "&Recortar\tCtrl+X",	CMD_CUT
  MENUITEM "&Copiar\tCtrl+C",	CMD_COPY
  MENUITEM "C&olar\tCtrl+V",	CMD_PASTE
  MENUITEM "E&xcluir\tDel",	CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Selecionar &tudo",	CMD_SELECT_ALL
  MENUITEM "&Data/Hora\tF5",	CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Quebrar automática de linha",	CMD_WRAP
  MENUITEM "&Fonte...",          CMD_FONT
 }
POPUP "&Pesquisa" {
  MENUITEM "&Localizar...",	CMD_SEARCH
  MENUITEM "Localizar &próxima\tF3",	CMD_SEARCH_NEXT
 }
POPUP "&Ajuda" {
  MENUITEM "&Conteúdo",		CMD_HELP_CONTENTS
  MENUITEM "&Procurar...",	CMD_HELP_SEARCH
  MENUITEM "&Ajuda na ajuda",	CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&About Notepad", CMD_HELP_ABOUT_NOTEPAD
 }
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

MAIN_MENU MENU
{
 POPUP "&Ficheiro" {
  MENUITEM "&Novo...",		CMD_NEW
  MENUITEM "A&brir",		CMD_OPEN
  MENUITEM "&Gravar",		CMD_SAVE
  MENUITEM "Gravar &como...",	CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Imprimir",		CMD_PRINT
  MENUITEM "C&onfigurar página...",	CMD_PAGE_SETUP
  MENUITEM "Configurar i&mpressora...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "Sai&r",		CMD_EXIT
 }
POPUP "&Editar" {
  MENUITEM "&Desfazer\tCtrl+Z", CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "&Cortar\tCtrl+X",	CMD_CUT
  MENUITEM "&Copiar\tCtrl+C",	CMD_COPY
  MENUITEM "C&olar\tCtrl+V",	CMD_PASTE
  MENUITEM "E&xcluir\tDel",	CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Seleccionar &tudo",	CMD_SELECT_ALL
  MENUITEM "&Data/Hora\tF5",	CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Quebrar automática de linha",	CMD_WRAP
  MENUITEM "&Tipo de Letra...",          CMD_FONT
 }
POPUP "&Pesquisa" {
  MENUITEM "&Localizar...",	CMD_SEARCH
  MENUITEM "Localizar &próxima\tF3",	CMD_SEARCH_NEXT
  MENUITEM "&Substituir...\tCtrl+H", CMD_REPLACE
 }
POPUP "&Ajuda" {
  MENUITEM "&Conteúdo",		CMD_HELP_CONTENTS
  MENUITEM "&Procurar...",	CMD_HELP_SEARCH
  MENUITEM "&Ajuda na ajuda",	CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&Acerca do Notepad...", CMD_HELP_ABOUT_NOTEPAD
 }
}


/* Dialog `Page setup' */

LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Configurar página"
{
LTEXT    "&Cabeçalho (mm):",  0x140,  10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Rodapé:",  0x142,   10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "&Margens:",      0x144,     10, 43,160, 45
LTEXT    "&Esquerda:",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Superior:",         0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Direita:",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Inferior:",      0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",         IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Cancelar",     IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Ajuda",       IDHELP,                180, 39, 40, 15, WS_TABSTOP
}

IDD_OFN_TEMPLATE  DIALOG  DISCARDABLE 50,50,300,15
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
  LTEXT "Codificação:", -1, 5,0, 50,12
  COMBOBOX IDC_OFN_ENCCOMBO, 53,0, 156,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE,	"&f"
STRING_PAGESETUP_FOOTERVALUE,	"Página &p"

STRING_NOTEPAD,					"Notepad"
STRING_ERROR,					"ERRO"
STRING_WARNING,					"AVISO"
STRING_INFO,					"Informação"

STRING_UNTITLED,				"(sem nome)"

STRING_ALL_FILES,				"Todos os arquivos (*.*)"
STRING_TEXT_FILES_TXT,			"Arquivos texto (*.txt)"

STRING_TOOLARGE,				"Arquivo '%s' é muito longo para o notepad.\n \
Por favor use um editor diferente."
STRING_NOTEXT,					"Você não digitou nenhum texto. \
\nPor favor digite alguma coisa e tente novamente"
STRING_DOESNOTEXIST,				"Arquivo '%s'\nnão existe\n\n \
Você deseja criar um novo arquivo?"
STRING_NOTSAVED,				"Arquivo '%s'\nfoi modificado\n\n \
Gostaria de salvar as alteraçÕes?"
STRING_NOTFOUND,					"'%s' não pode ser encontrado."
STRING_OUT_OF_MEMORY,			"Não há memória suficiente para completar essa \
tarefa.\nFeche uma ou mais aplicações para aumentar a quantidade de memória livre."
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

STRINGTABLE DISCARDABLE
{
 STRING_PAGESETUP_HEADERVALUE,	"&f"
 STRING_PAGESETUP_FOOTERVALUE,	"Página &p"

 STRING_NOTEPAD,		"Notepad"
 STRING_ERROR,			"ERRO"
 STRING_WARNING,		"AVISO"
 STRING_INFO,			"Informação"

 STRING_UNTITLED,		"(sem nome)"

 STRING_ALL_FILES,		"Todos os arquivos (*.*)"
 STRING_TEXT_FILES_TXT,		"Ficheiros de texto (*.txt)"

 STRING_TOOLARGE,		"Ficheiros '%s' é muito longo para o notepad.\n \
 Por favor use um editor diferente."
 STRING_NOTEXT,			"Não digitou nenhum texto. \
\nPor favor digite alguma coisa e tente novamente"
 STRING_DOESNOTEXIST,		"Ficheiro '%s'\nnão existe\n\n \
Deseja criar um novo ficheiro?"
 STRING_NOTSAVED,		"Ficheiro '%s'\nfoi modificado\n\n \
Gostaria de gravar as alteraçÕes?"
 STRING_NOTFOUND,		"'%s' não pode ser encontrado."
 STRING_OUT_OF_MEMORY,		"Não há memória suficiente para completar esta \
tarefa.\nFeche uma ou mais aplicações para aumentar a quantidade de memória livre."

STRING_UNICODE_LE,     "Unicode (UTF-16)"
STRING_UNICODE_BE,     "Unicode (UTF-16 big-endian)"

STRING_LOSS_OF_UNICODE_CHARACTERS,         "%s\n\
Este ficheiro contém caracteres Unicode que serão perdidos se\n\
guardar este ficheiro na codificação %s.\n\
Para manter estes caracteres, carregue em Cancelar, e depois seleccione\n\
uma das opções Unicode na lista de Codificações.\n\
Continuar?"
}
