/*
 * Copyright 2003 Mike McCormack for CodeWeavers
 *
 * 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 "resource.h"

#pragma makedep po

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
{
  IDS_LANCONNECTION "LAN Connection"
  IDS_CERT_CA_INVALID   "The certificate is issued by an unknown or untrusted publisher."
  IDS_CERT_DATE_INVALID "The date on the certificate is invalid."
  IDS_CERT_CN_INVALID   "The name on the certificate does not match the site."
  IDS_CERT_ERRORS       "There is at least one unspecified security problem with this certificate."
}

IDD_PROXYDLG DIALOG 36, 24, 220, 146
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Enter Network Password"
FONT 8, "MS Shell Dlg"
{
 LTEXT "Please enter your username and password:", -1, 6, 6, 210, 15
 LTEXT "Proxy", -1, 6, 26, 50, 18
 LTEXT "Realm", -1, 6, 46, 50, 18
 LTEXT "User", -1, 6, 66, 50, 18
 LTEXT "Password", -1, 6, 86, 50, 18
 LTEXT "", IDC_PROXY, 60, 26, 150, 14, 0
 LTEXT "", IDC_REALM, 60, 46, 150, 14, 0
 EDITTEXT IDC_USERNAME, 60, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
 EDITTEXT IDC_PASSWORD, 60, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD
 CHECKBOX "&Save this password (insecure)", IDC_SAVEPASSWORD,
           60, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
 PUSHBUTTON "OK", IDOK, 90, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON
 PUSHBUTTON "Cancel", IDCANCEL, 154, 126, 56, 14, WS_GROUP | WS_TABSTOP
}

IDD_AUTHDLG DIALOG 36, 24, 220, 146
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Authentication Required"
FONT 8, "MS Shell Dlg"
{
 LTEXT "Please enter your username and password:", -1, 6, 6, 210, 15
 LTEXT "Server", -1, 6, 26, 50, 18
 LTEXT "Realm", -1, 6, 46, 50, 18
 LTEXT "User", -1, 6, 66, 50, 18
 LTEXT "Password", -1, 6, 86, 50, 18
 LTEXT "", IDC_SERVER, 60, 26, 150, 14, 0
 LTEXT "", IDC_REALM, 60, 46, 150, 14, 0
 EDITTEXT IDC_USERNAME, 60, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
 EDITTEXT IDC_PASSWORD, 60, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD
 CHECKBOX "&Save this password (insecure)", IDC_SAVEPASSWORD,
           60, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
 PUSHBUTTON "OK", IDOK, 90, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON
 PUSHBUTTON "Cancel", IDCANCEL, 154, 126, 56, 14, WS_GROUP | WS_TABSTOP
}

IDD_INVCERTDLG DIALOG 3, 24, 250, 86
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Security Warning"
FONT 8, "MS Shell Dlg"
{
 LTEXT "There is a problem with the certificate for this site.", -1, 40, 6, 200, 20
 LTEXT "", IDC_CERT_ERROR, 40, 26, 200, 20
 LTEXT "Do you want to continue anyway?", -1, 40, 46, 200, 20
 PUSHBUTTON "Yes", IDOK, 40, 66, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON
 PUSHBUTTON "No", IDCANCEL, 100, 66, 56, 14, WS_GROUP | WS_TABSTOP
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

#define WINE_FILEDESCRIPTION_STR "Wine Internet Connectivity"
#define WINE_FILENAME_STR "wininet.dll"
#define WINE_FILEVERSION 8,00,7601,17601
#define WINE_FILEVERSION_STR "8.00.7601.17601"
#define WINE_PRODUCTVERSION 8,00,7601,17601
#define WINE_PRODUCTVERSION_STR "8.00.7601.17601"

#include "wine/wine_common_ver.rc"
