/*
 * Help Viewer (Dutch resources)
 *
 * Copyright 2003 Hans Leidekker
 * Copyright 2008 Frans Kool
 *
 * 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 */

MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
{
 POPUP "&Bestand" {
  MENUITEM "&Openen", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "Af&drukken", MNID_FILE_PRINT
  MENUITEM "&Pagina-instellingen...", MNID_FILE_SETUP
  MENUITEM SEPARATOR
  MENUITEM "&Afsluiten", MNID_FILE_EXIT
 }
 POPUP "&Bewerken" {
   MENUITEM "&Kopiëren...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "&Annoteren...", MNID_EDIT_ANNOTATE
 }
 POPUP "&Favorieten" {
   MENUITEM "&Aanmaken...", MNID_BKMK_DEFINE
 }
 POPUP "&Opties" {
   POPUP	"Help altijd zichtbaar"
   BEGIN
     MENUITEM "Standaard",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "Zichtbaar",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "Niet zichtbaar",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "Geschiedenis",		MNID_OPTS_HISTORY
  POPUP    "Lettertype"
  BEGIN
    MENUITEM "Klein",		MNID_OPTS_FONTS_SMALL
    MENUITEM "Standaard",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "Groot",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "Gebruik systeemkleuren",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "&Help" {
   MENUITEM "Hulp &bij help", MNID_HELP_HELPON
   MENUITEM "Altijd &zichtbaar", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "&Info...", MNID_HELP_ABOUT
#ifdef WINELIB
   MENUITEM "&Over Wine", MNID_HELP_WINE
#endif
 }
}

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

IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Zoeken"
{
    LTEXT  "Nog niet geïmplementeerd", -1, 10, 10, 180, 150
}

/* Strings */
STRINGTABLE DISCARDABLE LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
{
STID_WINE_HELP, 	"Wine Help"
STID_WHERROR, 		"FOUT"
STID_WARNING,  		"WAARSCHUWING"
STID_INFO,  		"Informatie"
STID_NOT_IMPLEMENTED, 	"Niet geïmplementeerd"
STID_HLPFILE_ERROR_s, 	"Fout bij het lezen van het helpbestand '%s'"
STID_INDEX, 		"Inde&x"
STID_CONTENTS,		"&Inhoudsopgave"
STID_BACK, 		"&Terug"
STID_ALL_FILES, 	"Alle bestanden (*.*)"
STID_HELP_FILES_HLP, 	"Helpbestanden (*.hlp)"
STID_FILE_NOT_FOUND_s	"Kan '%s' niet openen. Wilt u zelf dit bestand zoeken?"
STID_NO_RICHEDIT	"Kan geen richedit implementatie vinden... Actie afgebroken"
STID_PSH_INDEX,		"Help-onderwerpen: "
}

CONTEXT_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
BEGIN
	POPUP ""
	BEGIN
		MENUITEM "Annotering...",       MNID_CTXT_ANNOTATE
		MENUITEM "Kopiëren",            MNID_CTXT_COPY
		MENUITEM "Afdrukken ...",       MNID_CTXT_PRINT
		POPUP    "Lettertype"
		BEGIN
			MENUITEM "Klein",       MNID_CTXT_FONTS_SMALL
			MENUITEM "Normaal",     MNID_CTXT_FONTS_NORMAL
			MENUITEM "Groot",       MNID_CTXT_FONTS_LARGE
		END
		POPUP   "Help altijd zichtbaar"
		BEGIN
			MENUITEM "Standaard",   MNID_CTXT_HELP_DEFAULT
			MENUITEM "Zichtbaar",   MNID_CTXT_HELP_VISIBLE
			MENUITEM "Onzichtbaar", MNID_CTXT_HELP_NONVISIBLE
		END
		MENUITEM "Gebruik systeemkleuren",   MNID_CTXT_SYSTEM_COLORS
	END
END
