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