/*
 * Start
 * German Language Support
 *
 * Copyright 2003 Dan Kegel
 * Copyright 2004 Henning Gerhardt
 *
 * 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 "resources.h"

#pragma code_page(65001)

LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL

STRINGTABLE DISCARDABLE LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
{
STRING_USAGE,                                   "Startet ein Programm, oder öffnet ein Dokument in dem Programm, dass normalerweise für die Dateien mit dieser Dateiendung benutzt wird..\n\
Gebrauch:\n\
start [Optionen] Programm_Dateiname [...]\n\
start [Optionen] Dokument_Dateiname\n\
\n\
Optionen:\n\
/M[inimized] Starte das Programm minimiert.\n\
/MAX[imized] Starte das Programm maximiert.\n\
/R[estored]  Starte das Programm normal (weder minimiert noch maximiert).\n\
/W[ait]      Wartet bis das gestartete Programm sich beendet,\n\t     dann beendet sich start mit dessen Exitcode des Programmes.\n\
/ProgIDOpen  Öffne ein Dokument mit der folgenden progID.\n\
/L           Zeige die Endbenutzerlizenz an.\n\
\n\
start.exe Version 0.2 Copyright (C) 2003, Dan Kegel\n\
Start kommt ABSOLUT OHNE GARANTIE; für detaillierte Informationen, starte es mit der /L Option.\n\
Dies ist freie Software, und du bist willkommen, es unter bestimmten\n\
Bedingungen weiter zu verbreiten; führe 'start /L' für mehr Details aus.\n\
"

STRING_LICENSE, "start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\
This program is free software; you can redistribute it and/or\n\
modify it under the terms of the GNU Lesser Public License\n\
as published by the Free Software Foundation; either version 2.1\n\
of the License, or (at your option) any later version.\n\
\n\
This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
GNU Lesser Public License for more details.\n\
\n\
You should have received a copy of the GNU Lesser Public License\n\
along with this program; if not, write to the Free Software\n\
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n\
\n\
Schau in die Datei COPYING.LIB für Lizenzinformationen.\n\
"

STRING_EXECFAIL "Es konnte keine Anwendung gestartet werden, oder es ist keine Anwendung mit der angegebenen Datei verknüpft.\nShellExecuteEx gescheitert"

STRING_UNIXFAIL "Der angegebene Unix Dateiname konnte nicht in einen DOS Dateinamen umgewandelt werden."
}
