/*
 * 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\
/Unix        Use a Unix filename and start the file like windows explorer. \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"

STRING_UNIXFAIL "Could not translate the specified Unix filename to a DOS filename."
}
