/*
 * 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
 */

#include "xcopy.h"

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"

}
