/*
 * Help Viewer
 * Portuguese Language Support
 *
 * Copyright 1996 Ulrich Schmid
 * Portuguese translation by Gustavo Junior Alves <alves@correionet.com.br>
 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 * Copyright 2003 Marcelo Duarte
 * Copyright 2004,2007 Américo José Melo
 * Copyright 2009 Ricardo Filipe
 *
 * 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 "winhelp_res.h"

#pragma code_page(65001)

/* Menu */

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

MAIN_MENU MENU
{
 POPUP "&Arquivo" {
  MENUITEM "&Abrir...", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "&Imprimir", MNID_FILE_PRINT
  MENUITEM "&Configurar Impressora...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "Sai&r", MNID_FILE_EXIT
 }
 POPUP "&Editar" {
   MENUITEM "&Copiar...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "&Anotar...", MNID_EDIT_ANNOTATE
 }
 POPUP "In&dicador" {
   MENUITEM "&Definir...", MNID_BKMK_DEFINE
 }
 POPUP "&Options" {
   POPUP	"Help always visible"
   BEGIN
     MENUITEM "Default",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "Visible",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "Non visible",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "History",		MNID_OPTS_HISTORY
  POPUP    "Fonts"
  BEGIN
    MENUITEM "Small",		MNID_OPTS_FONTS_SMALL
    MENUITEM "Normal",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "Large",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "Use system colors",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "Aj&uda" {
   MENUITEM "Ajuda &na ajuda", MNID_HELP_HELPON
   MENUITEM "Sempre &visível", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "&Informações...", MNID_HELP_ABOUT
#ifdef WINELIB
   MENUITEM "&Sobre WINE", MNID_HELP_WINE
#endif
 }
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

MAIN_MENU MENU
{
 POPUP "&Ficheiro" {
  MENUITEM "&Abrir...", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "&Imprimir", MNID_FILE_PRINT
  MENUITEM "&Configurar Impressora...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "Sai&r", MNID_FILE_EXIT
 }
 POPUP "&Editar" {
   MENUITEM "&Copiar...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "&Anotar...", MNID_EDIT_ANNOTATE
 }
 POPUP "In&dicador" {
   MENUITEM "&Definir...", MNID_BKMK_DEFINE
 }
 POPUP "&Opções" {
   POPUP	"Ajuda sempre visível"
   BEGIN
     MENUITEM "Omissão",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "Visível",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "Invisível",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "Histórico",		MNID_OPTS_HISTORY
  POPUP    "Tipos de Letra"
  BEGIN
    MENUITEM "Pequeno",		MNID_OPTS_FONTS_SMALL
    MENUITEM "Normal",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "Grande",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "Usar cores do sistema",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "Aj&uda" {
   MENUITEM "Ajuda &na ajuda", MNID_HELP_HELPON
   MENUITEM "Sempre &visível", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "&Informações...", MNID_HELP_ABOUT
#ifdef WINELIB
   MENUITEM "&Acerca do WINE", MNID_HELP_WINE
#endif
 }
}

IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Índice"
{
    LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}

IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Procura"
{
    LTEXT  "Ainda não implementado", -1, 10, 10, 180, 150
}

/* Strings */

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
{
STID_WINE_HELP, 	"Ajuda WINE"
STID_WHERROR, 		"ERRO"
STID_WARNING,  		"AVISO"
STID_INFO,  		"Informação"
STID_NOT_IMPLEMENTED, 	"Não implementado"
STID_HLPFILE_ERROR_s, 	"Erro encontrado na leitura do arquivo de ajuda '%s'"
STID_INDEX, 		"&Conteúdo"
STID_CONTENTS,		"Summary"
STID_BACK, 		"&Voltar"
STID_ALL_FILES, 	"Todos os arquivos (*.*)"
STID_HELP_FILES_HLP, 	"Arquivos de ajuda (*.hlp)"
STID_FILE_NOT_FOUND_s   "Cannot find '%s'. Do you want to find this file yourself?"
STID_NO_RICHEDIT	"Cannot find a richedit implementation... Aborting"
STID_PSH_INDEX,		"Help topics: "
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

STRINGTABLE DISCARDABLE
{
STID_WINE_HELP, 	"Ajuda WINE"
STID_WHERROR, 		"ERRO"
STID_WARNING,  		"AVISO"
STID_INFO,  		"Informação"
STID_NOT_IMPLEMENTED, 	"Não implementado"
STID_HLPFILE_ERROR_s, 	"Erro encontrado na leitura do ficheiro de ajuda '%s'"
STID_INDEX, 		"&Conteúdo"
STID_CONTENTS,		"Sumário"
STID_BACK, 		"&Voltar"
STID_ALL_FILES, 	"Todos os ficheiros (*.*)"
STID_HELP_FILES_HLP, 	"Ficheiros de ajuda (*.hlp)"
STID_FILE_NOT_FOUND_s	"Não é possível encontrar '%s'. Deseja procurar este ficheiro você mesmo?"
STID_NO_RICHEDIT	"Não foi possível encontrar uma implementação do richedit... A abortar"
STID_PSH_INDEX,		"Tópicos de ajuda: "
}

CONTEXT_MENU MENU LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
BEGIN
	POPUP ""
	BEGIN
		MENUITEM "Anotação...",       MNID_CTXT_ANNOTATE
		MENUITEM "Copiar",                MNID_CTXT_COPY
		MENUITEM "Imprimir...",            MNID_CTXT_PRINT
		POPUP    "Tipos de letra"
		BEGIN
			MENUITEM "Pequeno",       MNID_CTXT_FONTS_SMALL
			MENUITEM "Normal",      MNID_CTXT_FONTS_NORMAL
			MENUITEM "Grande",       MNID_CTXT_FONTS_LARGE
		END
		POPUP   "Ajuda sempre visível"
		BEGIN
			MENUITEM "Omissão",     MNID_CTXT_HELP_DEFAULT
			MENUITEM "Visível",     MNID_CTXT_HELP_VISIBLE
			MENUITEM "Invisível", MNID_CTXT_HELP_NONVISIBLE
		END
		MENUITEM "Usar cores do sistema",   MNID_CTXT_SYSTEM_COLORS
	END
END
