/*
 * XCOPY - Wine-compatible xcopy program
 * English language support
 *
 * Copyright (C) 2007 J. Edmeades
 *
 * 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_DEFAULT

STRINGTABLE
{
    STRING_INVPARMS, "Invalid number of parameters - Use xcopy /? for help\n"
    STRING_INVPARM,  "Invalid parameter '%s' -  Use xcopy /? for help\n"
    STRING_PAUSE,    "Press <enter> to begin copying\n"
    STRING_SIMCOPY,  "%d file(s) would be copied\n"
    STRING_COPY,     "%d file(s) copied\n"
    STRING_QISDIR,   "Is '%s' a filename or directory\n" \
                     "on the target?\n" \
                     "(F - File, D - Directory)\n"
    STRING_SRCPROMPT,"%s? (Yes|No)\n"
    STRING_OVERWRITE,"Overwrite %s? (Yes|No|All)\n"
    STRING_COPYFAIL, "Copying of '%s' to '%s' failed with r/c %d\n"
    STRING_OPENFAIL, "Failed to open '%s'\n"
    STRING_READFAIL, "Failed during reading of '%s'\n"
    STRING_YES_CHAR, "Y"
    STRING_NO_CHAR,  "N"
    STRING_ALL_CHAR, "A"
    STRING_FILE_CHAR,"F"
    STRING_DIR_CHAR, "D"

    STRING_HELP,
"XCOPY - Copies source files or directory trees to a destination\n\
\n\
Syntax:\n\
XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U] \n\
\t     [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
\n\
Where:\n\
\n\
[/I]  Assume directory if destination does not exist and copying 2 or \n\
\tmore files\n\
[/S]  Copy directories and subdirectories\n\
[/E]  Copy directories and subdirectories, including any empty ones\n\
[/Q]  Do not list names during copy, ie quiet.\n\
[/F]  Show full source and destination names during copy\n\
[/L]  Simulate operation, showing names which would be copied\n\
[/W]  Prompts before beginning the copy operation\n\
[/T]  Creates empty directory structure but does not copy files\n\
[/Y]  Suppress prompting when overwriting files\n\
[/-Y] Enable prompting when overwriting files\n\
[/P]  Prompts on each source file before copying\n\
[/N]  Copy using short names\n\
[/U]  Copy only files which already exist in destination\n\
[/R]  Overwrite any read only files\n\
[/H]  Include hidden and system files in the copy\n\
[/C]  Continue even if an error occurs during the copy\n\
[/A]  Only copy files with archive attribute set\n\
[/M]  Only copy files with archive attribute set, removes \n\
\tarchive attribute\n\
[/D | /D:m-d-y] Copy new files or those modified after the supplied date.\n\
\t\tIf no date is supplied, only copy if destination is older\n\
\t\tthan source\n\n"

}
