/*
 * Start
 * English Language Support
 *
 * Copyright 2003 Dan Kegel
 *
 * 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
 */

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

STRINGTABLE DISCARDABLE LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
{
STRING_USAGE,                                   "Start a program, or open a document in the program normally used for files with that suffix. \n\
Usage: \n\
start [options] program_filename [...] \n\
start [options] document_filename \n\
 \n\
Options: \n\
/M[inimized] Start the program minimized. \n\
/MAX[imized] Start the program maximized. \n\
/R[estored]  Start the program normally (neither minimized nor maximized). \n\
/W[ait]      Wait for started program to finish, then exit with its exit code. \n\
/L           Show end-user license. \n\
 \n\
start.exe version 0.2 Copyright (C) 2003, Dan Kegel \n\
Start comes with ABSOLUTELY NO WARRANTY; for details run with /L option. \n\
This is free software, and you are welcome to redistribute it \n\
under certain conditions; run 'start /L' for details. \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\
See the COPYING.LIB file for license information. \n\
"

STRING_EXECFAIL "Application could not be started, or no application associated with the specified file.\nShellExecuteEx failed"
}
