/*
 * German resources for mshtml
 *
 * Copyright 2005 Henning Gerhardt
 * Copyright 2010 André Hentschel
 *
 * 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"

LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

STRINGTABLE
{
    IDS_STATUS_DONE            "Fertig"
    IDS_STATUS_DOWNLOADINGFROM "Herunterladen von %s..."
}

STRINGTABLE
{
    IDS_HTMLDISABLED  "Die HTML-Darstellung ist zur Zeit ausgeschaltet."
    IDS_HTMLDOCUMENT  "HTML-Dokument"
    IDS_DOWNLOADING   "Lade herunter..."
    IDS_INSTALLING    "Installiere..."
}

ID_DWL_DIALOG DIALOG  0, 0, 260, 95
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Wine-Gecko-Installation"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Wine kann das Gecko-Paket nicht finden. Es wird von Programmen mit eingebettetem HTML benötigt, " \
          "damit diese richtig funktionieren.\n" \
          "Wine kann das Paket für Sie herunterladen und installieren.\n\n" \
          "Hinweis: Es wird empfohlen das Paket ihrer Distribution zu verwenden. " \
          "Weitere Hinweise finden Sie unter http://wiki.winehq.org/Gecko",
          ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT
    CONTROL "Fortschritt", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
    DEFPUSHBUTTON "&Installieren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
    PUSHBUTTON "&Abbrechen", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP
}

IDD_HYPERLINK DIALOG 0, 0, 250, 65
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Hyperlink"
FONT 8, "MS Shell Dlg"
{
    GROUPBOX "Hyperlink Informationen", -1, 5, 5, 190, 55
    LTEXT "&Typ:", -1, 10, 22, 20, 10
    COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
    LTEXT "&URL:", -1, 10, 42, 20, 10
    EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "Abbrechen", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}

ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION ""
FONT 8, "MS Shell Dlg"
{
    LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
    EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "Abbrechen", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
