/*
 * Start
 * English 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."
}
