/*
 * Dutch language resource file for Credentials UI
 *
 * 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 "credui_resources.h"

LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL

IDD_CREDDIALOG DIALOG  0, 0, 213, 149
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "IDS_TITLEFORMAT"
FONT 8, "MS Shell Dlg"
BEGIN
    CONTROL         IDB_BANNER,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "&Gebruikersnaam:",-1,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
    LTEXT           "&Wachtwoord:",-1,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Onthoud mijn wachtwoord",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "OK",IDOK,97,128,50,14
    PUSHBUTTON      "Annuleren",IDCANCEL,156,128,50,14
END

STRINGTABLE
{
    IDS_TITLEFORMAT     "Verbind met %s"
    IDS_MESSAGEFORMAT   "Verbinden met %s"
    IDS_INCORRECTPASSWORDTITLE  "Inloggen mislukt"
    IDS_INCORRECTPASSWORD       "Controleer of uw gebruikersnaam\nen wachtwoord correct zijn."
    IDS_CAPSLOCKONTITLE "Caps Lock staat Aan"
    IDS_CAPSLOCKON      "Met Caps Lock aan kan uw wachtwoord verkeerd worden ingevoerd.\n\nDruk op de Caps Lock toets op uw toetsenbord om Caps Lock uit\nte zetten voor invoer van uw wachtwoord."
}
