From 8354381c8be13adbcfe4e2c056e52b985be9df5c Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 26 Dec 2010 16:25:30 +0000 Subject: [PATCH] Sync xcopy, iexplore, winhlp32, wordpad and write to wine 1.3.10 svn path=/trunk/; revision=50150 --- .../base/applications/cmdutils/xcopy/It.rc | 2 +- .../base/applications/cmdutils/xcopy/Ko.rc | 2 +- .../base/applications/cmdutils/xcopy/Sr.rc | 141 +++++++ .../base/applications/cmdutils/xcopy/rsrc.rc | 1 + .../base/applications/cmdutils/xcopy/xcopy.c | 351 +++++++++++------- .../base/applications/cmdutils/xcopy/xcopy.h | 1 + .../base/applications/iexplore/iexplore.rc | 4 +- reactos/base/applications/winhlp32/Ko.rc | 110 +++--- reactos/base/applications/winhlp32/Zh.rc | 56 ++- reactos/base/applications/winhlp32/rsrc.rc | 2 +- reactos/base/applications/wordpad/Zh.rc | 6 +- reactos/base/applications/wordpad/wordpad.c | 8 +- reactos/base/applications/write/Sr.rc | 38 ++ reactos/base/applications/write/Zh.rc | 31 ++ reactos/base/applications/write/rsrc.rc | 2 + 15 files changed, 550 insertions(+), 205 deletions(-) create mode 100644 reactos/base/applications/cmdutils/xcopy/Sr.rc create mode 100644 reactos/base/applications/write/Sr.rc create mode 100644 reactos/base/applications/write/Zh.rc diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc index 2978c0db147..2a1cae94ea5 100644 --- a/reactos/base/applications/cmdutils/xcopy/It.rc +++ b/reactos/base/applications/cmdutils/xcopy/It.rc @@ -34,7 +34,7 @@ STRINGTABLE STRING_SIMCOPY, "%d file saranno copiati\n" STRING_COPY, "%d file copiato/i\n" STRING_QISDIR, "'%s' è il nome di un file o una cartella\n\ - nell'obiettivo?\n\ + nella destinazione?\n\ (F - File, C - Cartella)\n" STRING_SRCPROMPT,"%s? (Sì|No)\n" STRING_OVERWRITE,"Sovrascrivere %s? (Sì|No|Tutti)\n" diff --git a/reactos/base/applications/cmdutils/xcopy/Ko.rc b/reactos/base/applications/cmdutils/xcopy/Ko.rc index bb46a36499a..8a68ebe4fe0 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ko.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ko.rc @@ -56,7 +56,7 @@ XCOPY 원본 [대상] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \n\ Where:\n\ \n\ -[/I] 만약 대상이 존재하지 않는 경우 디렉토리로 가정하고 두개나 더 많은 파일을 \n\ +[/I] 만약 대상이 존재하지 않는 경우 디렉토리로 가정하고 두개나 더 많은 파일을\n\ \t복사\n\ [/S] 디렉토리하고 하위 디렉토리 복사\n\ [/E] 빈 디렉토리를 포함해서 디렉토리와 하위 디렉토리 복사\n\ diff --git a/reactos/base/applications/cmdutils/xcopy/Sr.rc b/reactos/base/applications/cmdutils/xcopy/Sr.rc new file mode 100644 index 00000000000..92f7ef3860b --- /dev/null +++ b/reactos/base/applications/cmdutils/xcopy/Sr.rc @@ -0,0 +1,141 @@ +/* + * XCOPY - Wine-compatible xcopy program + * Serbian language support + * + * Copyright (C) 2007 J. Edmeades + * Copyright 2010 Đorđe Vasiljević + * + * 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" + +#pragma code_page(65001) + +LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC + +STRINGTABLE +{ + STRING_INVPARMS, "Неисправан број параметара. Користите xcopy /? за помоћ\n" + STRING_INVPARM, "Неисправан параметар „%s“. Користите xcopy /? за помоћ\n" + STRING_PAUSE, "Притисните да започнете умножавање\n" + STRING_SIMCOPY, "%d датотека/е ће бити уможено\n" + STRING_COPY, "%d датотека/е је умножено\n" + STRING_QISDIR, "Да ли је „%s“ назив датотеке или фасцикла\n\ + на одредишту?\n\ + (Д - датотека, Ф - фасцикла)\n" + STRING_SRCPROMPT,"%s? (Да|Не)\n" + STRING_OVERWRITE,"Заменити %s? (Да|Не|Све)\n" + STRING_COPYFAIL, "Умножавање „%s“ у „%s“ није успело са r/c %d\n" + STRING_OPENFAIL, "Отварање „%s“ датотеке није успело\n" + STRING_READFAIL, "Читање „%s“ датотеке није успело\n" + STRING_YES_CHAR, "Д" + STRING_NO_CHAR, "Н" + STRING_ALL_CHAR, "С" + STRING_FILE_CHAR,"Д" + STRING_DIR_CHAR, "Ф" + + STRING_HELP, +"XCOPY — умножава изворне датотеке или гране фасцикли у одредиште\n\ +\n\ +Синтакса:\n\ +XCOPY извор [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Где:\n\ +\n\ +[/I] Претпостави фасциклу када одредиште не постоји и када се умножавају две или\n\ +\tвише датотека\n\ +[/S] Умножи фасцикле и потфасцикле\n\ +[/E] Умножи фасцикле и потфасцикле заједно с празним\n\ +[/Q] Не приказуј називе током умножавања.\n\ +[/F] Прикажи цео извор и одредиште током умножавања\n\ +[/L] Опонашај радњу приказујући називе који ће бити умножени\n\ +[/W] Питај пре почињања умножавања\n\ +[/T] Прави празну структуру фасцикле, али не умножава датотеке\n\ +[/Y] Потисни упит при замењивању датотека\n\ +[/-Y] Омогући упит при замењивању датотека\n\ +[/P] Питај за сваку изворну датотеку пре умножавања\n\ +[/N] Умножи користећи кратке називе\n\ +[/U] Умножи само оне датотеке које постоје у одредишту\n\ +[/R] Замени све датотеке које се само читају\n\ +[/H] Укључи сакривене и системске датотеке у умножавање\n\ +[/C] Настави иако дође до грешке у умножавању\n\ +[/A] Умножи само архивиране датотеке\n\ +[/M] Умножи само архивиране датотеке и уклони\n\ +\tособине архиве\n\ +[/D | /D:m-d-y] Умножи нове или измењене датотеке након одређеног датума.\n\ +\t\tАко датум није унесен, умножи само ако је одредиште старије\n\ +\t\tод извора\n\n" + +} + +LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN + +STRINGTABLE +{ + STRING_INVPARMS, "Neispravan broj parametara. Koristite xcopy /? za pomoć\n" + STRING_INVPARM, "Neispravan parametar „%s“. Koristite xcopy /? za pomoć\n" + STRING_PAUSE, "Pritisnite da započnete umnožavanje\n" + STRING_SIMCOPY, "%d datoteka/e će biti umoženo\n" + STRING_COPY, "%d datoteka/e je umnoženo\n" + STRING_QISDIR, "Da li je „%s“ naziv datoteke ili fascikla\n\ + na odredištu?\n\ + (D - datoteka, F - fascikla)\n" + STRING_SRCPROMPT,"%s? (Da|Ne)\n" + STRING_OVERWRITE,"Zameniti %s? (Da|Ne|Sve)\n" + STRING_COPYFAIL, "Umnožavanje „%s“ u „%s“ nije uspelo sa r/c %d\n" + STRING_OPENFAIL, "Otvaranje „%s“ datoteke nije uspelo\n" + STRING_READFAIL, "Čitanje „%s“ datoteke nije uspelo\n" + STRING_YES_CHAR, "D" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "S" + STRING_FILE_CHAR,"D" + STRING_DIR_CHAR, "F" + + STRING_HELP, +"XCOPY — umnožava izvorne datoteke ili grane fascikli u odredište\n\ +\n\ +Sintaksa:\n\ +XCOPY izvor [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Gde:\n\ +\n\ +[/I] Pretpostavi fasciklu kada odredište ne postoji i kada se umnožavaju dve ili\n\ +\tviše datoteka\n\ +[/S] Umnoži fascikle i potfascikle\n\ +[/E] Umnoži fascikle i potfascikle zajedno s praznim\n\ +[/Q] Ne prikazuj nazive tokom umnožavanja.\n\ +[/F] Prikaži ceo izvor i odredište tokom umnožavanja\n\ +[/L] Oponašaj radnju prikazujući nazive koji će biti umnoženi\n\ +[/W] Pitaj pre počinjanja umnožavanja\n\ +[/T] Pravi praznu strukturu fascikle, ali ne umnožava datoteke\n\ +[/Y] Potisni upit pri zamenjivanju datoteka\n\ +[/-Y] Omogući upit pri zamenjivanju datoteka\n\ +[/P] Pitaj za svaku izvornu datoteku pre umnožavanja\n\ +[/N] Umnoži koristeći kratke nazive\n\ +[/U] Umnoži samo one datoteke koje postoje u odredištu\n\ +[/R] Zameni sve datoteke koje se samo čitaju\n\ +[/H] Uključi sakrivene i sistemske datoteke u umnožavanje\n\ +[/C] Nastavi iako dođe do greške u umnožavanju\n\ +[/A] Umnoži samo arhivirane datoteke\n\ +[/M] Umnoži samo arhivirane datoteke i ukloni\n\ +\tosobine arhive\n\ +[/D | /D:m-d-y] Umnoži nove ili izmenjene datoteke nakon određenog datuma.\n\ +\t\tAko datum nije unesen, umnoži samo ako je odredište starije\n\ +\t\tod izvora\n\n" + +} diff --git a/reactos/base/applications/cmdutils/xcopy/rsrc.rc b/reactos/base/applications/cmdutils/xcopy/rsrc.rc index 7d4990c5763..ec82d6116f6 100644 --- a/reactos/base/applications/cmdutils/xcopy/rsrc.rc +++ b/reactos/base/applications/cmdutils/xcopy/rsrc.rc @@ -43,5 +43,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Ro.rc" #include "Ru.rc" #include "Si.rc" +#include "Sr.rc" #include "Sv.rc" #include "Uk.rc" diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.c b/reactos/base/applications/cmdutils/xcopy/xcopy.c index 4572374de9f..daf269b99b7 100644 --- a/reactos/base/applications/cmdutils/xcopy/xcopy.c +++ b/reactos/base/applications/cmdutils/xcopy/xcopy.c @@ -49,6 +49,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(xcopy); /* Prototypes */ +static int XCOPY_ParseCommandLine(WCHAR *suppliedsource, + WCHAR *supplieddestination, DWORD *flags); static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, WCHAR *spec, DWORD flags); static int XCOPY_ProcessDestParm(WCHAR *supplieddestination, WCHAR *stem, @@ -108,17 +110,6 @@ int wmain (int argc, WCHAR *argvW[]) const WCHAR PROMPTSTR1[] = {'/', 'Y', 0}; const WCHAR PROMPTSTR2[] = {'/', 'y', 0}; const WCHAR COPYCMD[] = {'C', 'O', 'P', 'Y', 'C', 'M', 'D', 0}; - const WCHAR EXCLUDE[] = {'E', 'X', 'C', 'L', 'U', 'D', 'E', ':', 0}; - - /* - * Parse the command line - */ - - /* Confirm at least one parameter */ - if (argc < 2) { - XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARMS)); - return RC_INITERROR; - } /* Preinitialize flags based on COPYCMD */ if (GetEnvironmentVariableW(COPYCMD, copyCmd, MAXSTRING)) { @@ -135,126 +126,17 @@ int wmain (int argc, WCHAR *argvW[]) lose */ flags |= OPT_COPYHIDSYS; - /* Skip first arg, which is the program name */ - argvW++; - - while (argc > 1) - { - argc--; - WINE_TRACE("Processing Arg: '%s'\n", wine_dbgstr_w(*argvW)); - - /* First non-switch parameter is source, second is destination */ - if (*argvW[0] != '/') { - if (suppliedsource[0] == 0x00) { - lstrcpyW(suppliedsource, *argvW); - } else if (supplieddestination[0] == 0x00) { - lstrcpyW(supplieddestination, *argvW); - } else { - XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARMS)); - return RC_INITERROR; - } - } else { - /* Process all the switch options - Note: Windows docs say /P prompts when dest is created - but tests show it is done for each src file - regardless of the destination */ - switch (toupper(argvW[0][1])) { - case 'I': flags |= OPT_ASSUMEDIR; break; - case 'S': flags |= OPT_RECURSIVE; break; - case 'Q': flags |= OPT_QUIET; break; - case 'F': flags |= OPT_FULL; break; - case 'L': flags |= OPT_SIMULATE; break; - case 'W': flags |= OPT_PAUSE; break; - case 'T': flags |= OPT_NOCOPY | OPT_RECURSIVE; break; - case 'Y': flags |= OPT_NOPROMPT; break; - case 'N': flags |= OPT_SHORTNAME; break; - case 'U': flags |= OPT_MUSTEXIST; break; - case 'R': flags |= OPT_REPLACEREAD; break; - case 'H': flags |= OPT_COPYHIDSYS; break; - case 'C': flags |= OPT_IGNOREERRORS; break; - case 'P': flags |= OPT_SRCPROMPT; break; - case 'A': flags |= OPT_ARCHIVEONLY; break; - case 'M': flags |= OPT_ARCHIVEONLY | - OPT_REMOVEARCH; break; - - /* E can be /E or /EXCLUDE */ - case 'E': if (CompareStringW(LOCALE_USER_DEFAULT, - NORM_IGNORECASE | SORT_STRINGSORT, - &argvW[0][1], 8, - EXCLUDE, -1) == 2) { - if (XCOPY_ProcessExcludeList(&argvW[0][9])) { - XCOPY_FailMessage(ERROR_INVALID_PARAMETER); - return RC_INITERROR; - } else flags |= OPT_EXCLUDELIST; - } else flags |= OPT_EMPTYDIR | OPT_RECURSIVE; - break; - - /* D can be /D or /D: */ - case 'D': if ((argvW[0][2])==':' && isdigit(argvW[0][3])) { - SYSTEMTIME st; - WCHAR *pos = &argvW[0][3]; - BOOL isError = FALSE; - memset(&st, 0x00, sizeof(st)); - - /* Parse the arg : Month */ - st.wMonth = _wtol(pos); - while (*pos && isdigit(*pos)) pos++; - if (*pos++ != '-') isError = TRUE; - - /* Parse the arg : Day */ - if (!isError) { - st.wDay = _wtol(pos); - while (*pos && isdigit(*pos)) pos++; - if (*pos++ != '-') isError = TRUE; - } - - /* Parse the arg : Day */ - if (!isError) { - st.wYear = _wtol(pos); - if (st.wYear < 100) st.wYear+=2000; - } - - if (!isError && SystemTimeToFileTime(&st, &dateRange)) { - SYSTEMTIME st; - WCHAR datestring[32], timestring[32]; - - flags |= OPT_DATERANGE; - - /* Debug info: */ - FileTimeToSystemTime (&dateRange, &st); - GetDateFormatW(0, DATE_SHORTDATE, &st, NULL, datestring, - sizeof(datestring)/sizeof(WCHAR)); - GetTimeFormatW(0, TIME_NOSECONDS, &st, - NULL, timestring, sizeof(timestring)/sizeof(WCHAR)); - - WINE_TRACE("Date being used is: %s %s\n", - wine_dbgstr_w(datestring), wine_dbgstr_w(timestring)); - } else { - XCOPY_FailMessage(ERROR_INVALID_PARAMETER); - return RC_INITERROR; - } - } else { - flags |= OPT_DATENEWER; - } - break; - - case '-': if (toupper(argvW[0][2])=='Y') - flags &= ~OPT_NOPROMPT; break; - case '?': XCOPY_wprintf(XCOPY_LoadMessage(STRING_HELP)); - return RC_OK; - default: - WINE_TRACE("Unhandled parameter '%s'\n", wine_dbgstr_w(*argvW)); - XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARM), *argvW); - return RC_INITERROR; - } - } - argvW++; + /* + * Parse the command line + */ + if ((rc = XCOPY_ParseCommandLine(suppliedsource, supplieddestination, + &flags)) != RC_OK) { + if (rc == RC_HELP) + return RC_OK; + else + return rc; } - /* Default the destination if not supplied */ - if (supplieddestination[0] == 0x00) - lstrcpyW(supplieddestination, wchr_dot); - /* Trace out the supplied information */ WINE_TRACE("Supplied parameters:\n"); WINE_TRACE("Source : '%s'\n", wine_dbgstr_w(suppliedsource)); @@ -310,6 +192,211 @@ int wmain (int argc, WCHAR *argvW[]) } +/* ========================================================================= + XCOPY_ParseCommandLine - Parses the command line + ========================================================================= */ +static BOOL is_whitespace(WCHAR c) +{ + return c == ' ' || c == '\t'; +} + +static WCHAR *skip_whitespace(WCHAR *p) +{ + for (; *p && is_whitespace(*p); p++); + return p; +} + +/* Windows XCOPY uses a simplified command line parsing algorithm + that lacks the escaped-quote logic of build_argv(), because + literal double quotes are illegal in any of its arguments. + Example: 'XCOPY "c:\DIR A" "c:DIR B\"' is OK. */ +static int find_end_of_word(const WCHAR *word, WCHAR **end) +{ + BOOL in_quotes = 0; + const WCHAR *ptr = word; + for (;;) { + for (; *ptr != '\0' && *ptr != '"' && + (in_quotes || !is_whitespace(*ptr)); ptr++); + if (*ptr == '"') { + in_quotes = !in_quotes; + ptr++; + } + /* Odd number of double quotes is illegal for XCOPY */ + if (in_quotes && *ptr == '\0') + return RC_INITERROR; + if (*ptr == '\0' || (!in_quotes && is_whitespace(*ptr))) + break; + } + *end = (WCHAR*)ptr; + return RC_OK; +} + +/* Remove all double quotes from a word */ +static void strip_quotes(WCHAR *word, WCHAR **end) +{ + WCHAR *rp, *wp; + for (rp = word, wp = word; *rp != '\0'; rp++) { + if (*rp == '"') + continue; + if (wp < rp) + *wp = *rp; + wp++; + } + *wp = '\0'; + *end = wp; +} + +static int XCOPY_ParseCommandLine(WCHAR *suppliedsource, + WCHAR *supplieddestination, DWORD *pflags) +{ + const WCHAR EXCLUDE[] = {'E', 'X', 'C', 'L', 'U', 'D', 'E', ':', 0}; + DWORD flags = *pflags; + WCHAR *cmdline, *word, *end, *next; + int rc = RC_INITERROR; + + cmdline = _wcsdup(GetCommandLineW()); + if (cmdline == NULL) + return rc; + + /* Skip first arg, which is the program name */ + if ((rc = find_end_of_word(cmdline, &word)) != RC_OK) + goto out; + word = skip_whitespace(word); + + while (*word) + { + WCHAR first; + if ((rc = find_end_of_word(word, &end)) != RC_OK) + goto out; + + next = skip_whitespace(end); + first = word[0]; + *end = '\0'; + strip_quotes(word, &end); + WINE_TRACE("Processing Arg: '%s'\n", wine_dbgstr_w(word)); + + /* First non-switch parameter is source, second is destination */ + if (first != '/') { + if (suppliedsource[0] == 0x00) { + lstrcpyW(suppliedsource, word); + } else if (supplieddestination[0] == 0x00) { + lstrcpyW(supplieddestination, word); + } else { + XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARMS)); + goto out; + } + } else { + /* Process all the switch options + Note: Windows docs say /P prompts when dest is created + but tests show it is done for each src file + regardless of the destination */ + switch (toupper(word[1])) { + case 'I': flags |= OPT_ASSUMEDIR; break; + case 'S': flags |= OPT_RECURSIVE; break; + case 'Q': flags |= OPT_QUIET; break; + case 'F': flags |= OPT_FULL; break; + case 'L': flags |= OPT_SIMULATE; break; + case 'W': flags |= OPT_PAUSE; break; + case 'T': flags |= OPT_NOCOPY | OPT_RECURSIVE; break; + case 'Y': flags |= OPT_NOPROMPT; break; + case 'N': flags |= OPT_SHORTNAME; break; + case 'U': flags |= OPT_MUSTEXIST; break; + case 'R': flags |= OPT_REPLACEREAD; break; + case 'H': flags |= OPT_COPYHIDSYS; break; + case 'C': flags |= OPT_IGNOREERRORS; break; + case 'P': flags |= OPT_SRCPROMPT; break; + case 'A': flags |= OPT_ARCHIVEONLY; break; + case 'M': flags |= OPT_ARCHIVEONLY | + OPT_REMOVEARCH; break; + + /* E can be /E or /EXCLUDE */ + case 'E': if (CompareStringW(LOCALE_USER_DEFAULT, + NORM_IGNORECASE | SORT_STRINGSORT, + &word[1], 8, + EXCLUDE, -1) == 2) { + if (XCOPY_ProcessExcludeList(&word[9])) { + XCOPY_FailMessage(ERROR_INVALID_PARAMETER); + goto out; + } else flags |= OPT_EXCLUDELIST; + } else flags |= OPT_EMPTYDIR | OPT_RECURSIVE; + break; + + /* D can be /D or /D: */ + case 'D': if (word[2]==':' && isdigit(word[3])) { + SYSTEMTIME st; + WCHAR *pos = &word[3]; + BOOL isError = FALSE; + memset(&st, 0x00, sizeof(st)); + + /* Parse the arg : Month */ + st.wMonth = _wtol(pos); + while (*pos && isdigit(*pos)) pos++; + if (*pos++ != '-') isError = TRUE; + + /* Parse the arg : Day */ + if (!isError) { + st.wDay = _wtol(pos); + while (*pos && isdigit(*pos)) pos++; + if (*pos++ != '-') isError = TRUE; + } + + /* Parse the arg : Day */ + if (!isError) { + st.wYear = _wtol(pos); + while (*pos && isdigit(*pos)) pos++; + if (st.wYear < 100) st.wYear+=2000; + } + + if (!isError && SystemTimeToFileTime(&st, &dateRange)) { + SYSTEMTIME st; + WCHAR datestring[32], timestring[32]; + + flags |= OPT_DATERANGE; + + /* Debug info: */ + FileTimeToSystemTime (&dateRange, &st); + GetDateFormatW(0, DATE_SHORTDATE, &st, NULL, datestring, + sizeof(datestring)/sizeof(WCHAR)); + GetTimeFormatW(0, TIME_NOSECONDS, &st, + NULL, timestring, sizeof(timestring)/sizeof(WCHAR)); + + WINE_TRACE("Date being used is: %s %s\n", + wine_dbgstr_w(datestring), wine_dbgstr_w(timestring)); + } else { + XCOPY_FailMessage(ERROR_INVALID_PARAMETER); + goto out; + } + } else { + flags |= OPT_DATENEWER; + } + break; + + case '-': if (toupper(word[2])=='Y') + flags &= ~OPT_NOPROMPT; break; + case '?': XCOPY_wprintf(XCOPY_LoadMessage(STRING_HELP)); + rc = RC_HELP; + goto out; + default: + WINE_TRACE("Unhandled parameter '%s'\n", wine_dbgstr_w(word)); + XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARM), word); + goto out; + } + } + word = next; + } + + /* Default the destination if not supplied */ + if (supplieddestination[0] == 0x00) + lstrcpyW(supplieddestination, wchr_dot); + + *pflags = flags; + rc = RC_OK; + + out: + free(cmdline); + return rc; +} + /* ========================================================================= XCOPY_ProcessSourceParm - Takes the supplied source parameter, and @@ -432,8 +519,10 @@ static int XCOPY_ProcessDestParm(WCHAR *supplieddestination, WCHAR *stem, WCHAR if (attribs == INVALID_FILE_ATTRIBUTES) { /* If /I supplied and wildcard copy, assume directory */ - if (flags & OPT_ASSUMEDIR && - (wcschr(srcspec, '?') || wcschr(srcspec, '*'))) { + /* Also if destination ends with backslash */ + if ((flags & OPT_ASSUMEDIR && + (wcschr(srcspec, '?') || wcschr(srcspec, '*'))) || + (supplieddestination[lstrlenW(supplieddestination)-1] == '\\')) { isDir = TRUE; diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.h b/reactos/base/applications/cmdutils/xcopy/xcopy.h index 1c933951284..3e9644efe8c 100644 --- a/reactos/base/applications/cmdutils/xcopy/xcopy.h +++ b/reactos/base/applications/cmdutils/xcopy/xcopy.h @@ -26,6 +26,7 @@ #define RC_CTRLC 2 #define RC_INITERROR 4 #define RC_WRITEERROR 5 +#define RC_HELP 6 #define OPT_ASSUMEDIR 0x00000001 #define OPT_RECURSIVE 0x00000002 diff --git a/reactos/base/applications/iexplore/iexplore.rc b/reactos/base/applications/iexplore/iexplore.rc index f37481a309d..64a976cf4f5 100644 --- a/reactos/base/applications/iexplore/iexplore.rc +++ b/reactos/base/applications/iexplore/iexplore.rc @@ -16,13 +16,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WINE_OLESELFREGISTER -#define WINE_FILEDESCRIPTION_STR "Wine core exe" +#define WINE_FILEDESCRIPTION_STR "Wine Internet Explorer" #define WINE_FILENAME_STR "iexplore.exe" #define WINE_FILEVERSION 6,0,2900,2180 #define WINE_FILEVERSION_STR "6.0.2900.2180" #define WINE_PRODUCTVERSION 6,0,2900,2180 #define WINE_PRODUCTVERSION_STR "6.0.2900.2180" +#define WINE_EXTRAVALUES VALUE "OLESelfRegister","" #include "wine/wine_common_ver.rc" diff --git a/reactos/base/applications/winhlp32/Ko.rc b/reactos/base/applications/winhlp32/Ko.rc index 32b32b21865..1acc2db701b 100644 --- a/reactos/base/applications/winhlp32/Ko.rc +++ b/reactos/base/applications/winhlp32/Ko.rc @@ -21,49 +21,51 @@ #include "winhelp_res.h" +#pragma code_page(65001) + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT /* Menu */ MAIN_MENU MENU { - POPUP "(&F)" { - MENUITEM "(&O)...", MNID_FILE_OPEN + POPUP "파일(&F)" { + MENUITEM "열기(&O)...", MNID_FILE_OPEN MENUITEM SEPARATOR - MENUITEM "μ(&P)", MNID_FILE_PRINT - MENUITEM " (&S)...", MNID_FILE_SETUP + MENUITEM "인쇄(&P)", MNID_FILE_PRINT + MENUITEM "프린터 설정(&S)...", MNID_FILE_SETUP MENUITEM SEPARATOR - MENUITEM "(&E)", MNID_FILE_EXIT + MENUITEM "종료(&E)", MNID_FILE_EXIT } - POPUP "(&E)" { - MENUITEM "(&C)...", MNID_EDIT_COPYDLG + POPUP "편집(&E)" { + MENUITEM "복사(&C)...", MNID_EDIT_COPYDLG MENUITEM SEPARATOR - MENUITEM "ּ(&A)...", MNID_EDIT_ANNOTATE + MENUITEM "주석(&A)...", MNID_EDIT_ANNOTATE } - POPUP "å(&B)" { - MENUITEM "(&D)...", MNID_BKMK_DEFINE + POPUP "책갈피(&B)" { + MENUITEM "정의(&D)...", MNID_BKMK_DEFINE } - POPUP "ɼ(&O)" { - POPUP " ̱" + POPUP "옵션(&O)" { + POPUP "가능한 도움말 보이기" BEGIN - MENUITEM "⺻", MNID_OPTS_HELP_DEFAULT - MENUITEM "̱", MNID_OPTS_HELP_VISIBLE - MENUITEM " ʱ", MNID_OPTS_HELP_NONVISIBLE + MENUITEM "기본", MNID_OPTS_HELP_DEFAULT + MENUITEM "보이기", MNID_OPTS_HELP_VISIBLE + MENUITEM "보여주지 않기", MNID_OPTS_HELP_NONVISIBLE END - MENUITEM "", MNID_OPTS_HISTORY - POPUP "۲" + MENUITEM "기록", MNID_OPTS_HISTORY + POPUP "글꼴" BEGIN - MENUITEM "۰", MNID_OPTS_FONTS_SMALL - MENUITEM "", MNID_OPTS_FONTS_NORMAL - MENUITEM "ũ", MNID_OPTS_FONTS_LARGE + MENUITEM "작게", MNID_OPTS_FONTS_SMALL + MENUITEM "보통", MNID_OPTS_FONTS_NORMAL + MENUITEM "크게", MNID_OPTS_FONTS_LARGE END - MENUITEM "ý ", MNID_OPTS_SYSTEM_COLORS + MENUITEM "시스템 색상 사용", MNID_OPTS_SYSTEM_COLORS } - POPUP "(&H)" { - MENUITEM " (&O)", MNID_HELP_HELPON - MENUITEM "׻ (&T)", MNID_HELP_HELPTOP + POPUP "도움말(&H)" { + MENUITEM "도움말 사용법(&O)", MNID_HELP_HELPON + MENUITEM "항상 위(&T)", MNID_HELP_HELPTOP MENUITEM SEPARATOR - MENUITEM "(&I)...", MNID_HELP_ABOUT + MENUITEM "Wine 도움말 정보(&I)...", MNID_HELP_ABOUT } } @@ -71,7 +73,7 @@ MAIN_MENU MENU IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 9, "MS Shell Dlg" -CAPTION "ε" +CAPTION "인덱스" { LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } @@ -79,50 +81,50 @@ CAPTION " IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 9, "MS Shell Dlg" -CAPTION "ã" +CAPTION "찾기" { - LTEXT " ", -1, 10, 10, 180, 150 + LTEXT "아직 구현되지 않음", -1, 10, 10, 180, 150 } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "Wine " -STID_WHERROR, "" -STID_WARNING, "" -STID_INFO, "" -STID_NOT_IMPLEMENTED, " ʾ" -STID_HLPFILE_ERROR_s, " `%s' д ߻" -STID_INDEX, "(&C)" -STID_CONTENTS, "" -STID_BACK, "ڷ(&B)" -STID_ALL_FILES, " (*.*)" -STID_HELP_FILES_HLP, " (*.hlp)" -STID_FILE_NOT_FOUND_s "%s ã ϴ'. ãڽϱ?" -STID_NO_RICHEDIT "richedit ã ϴ.. " -STID_PSH_INDEX, " : " +STID_WINE_HELP, "Wine 도움말" +STID_WHERROR, "에러" +STID_WARNING, "경고" +STID_INFO, "정보" +STID_NOT_IMPLEMENTED, "구현되지 않았음" +STID_HLPFILE_ERROR_s, "도움말 파일 `%s'를 읽는 도중 오류 발생" +STID_INDEX, "목차(&C)" +STID_CONTENTS, "요약" +STID_BACK, "뒤로(&B)" +STID_ALL_FILES, "모든 파일 (*.*)" +STID_HELP_FILES_HLP, "도움말 파일 (*.hlp)" +STID_FILE_NOT_FOUND_s "%s을 찾을 수 없습니다'. 이 파일을 직접 찾겠습니까?" +STID_NO_RICHEDIT "richedit 구현을 찾을수 업습니다.. 취소중" +STID_PSH_INDEX, "도움말 목차: " } CONTEXT_MENU MENU BEGIN POPUP "" BEGIN - MENUITEM "ּ...", MNID_CTXT_ANNOTATE - MENUITEM "", MNID_CTXT_COPY - MENUITEM "μ...", MNID_CTXT_PRINT - POPUP "۲" + MENUITEM "주석...", MNID_CTXT_ANNOTATE + MENUITEM "복사", MNID_CTXT_COPY + MENUITEM "인쇄...", MNID_CTXT_PRINT + POPUP "글꼴" BEGIN - MENUITEM "", MNID_CTXT_FONTS_SMALL - MENUITEM "", MNID_CTXT_FONTS_NORMAL - MENUITEM "а", MNID_CTXT_FONTS_LARGE + MENUITEM "좁게", MNID_CTXT_FONTS_SMALL + MENUITEM "보통", MNID_CTXT_FONTS_NORMAL + MENUITEM "넓게", MNID_CTXT_FONTS_LARGE END - POPUP " ׻ ̱" + POPUP "도움말 항상 보이기" BEGIN - MENUITEM "⺻", MNID_CTXT_HELP_DEFAULT - MENUITEM "̱", MNID_CTXT_HELP_VISIBLE - MENUITEM " ̱", MNID_CTXT_HELP_NONVISIBLE + MENUITEM "기본", MNID_CTXT_HELP_DEFAULT + MENUITEM "보이기", MNID_CTXT_HELP_VISIBLE + MENUITEM "안 보이기", MNID_CTXT_HELP_NONVISIBLE END - MENUITEM "ý ", MNID_CTXT_SYSTEM_COLORS + MENUITEM "시스템 색상 사용", MNID_CTXT_SYSTEM_COLORS END END diff --git a/reactos/base/applications/winhlp32/Zh.rc b/reactos/base/applications/winhlp32/Zh.rc index f9d27461223..2532cb3fa54 100644 --- a/reactos/base/applications/winhlp32/Zh.rc +++ b/reactos/base/applications/winhlp32/Zh.rc @@ -4,6 +4,7 @@ * * Copyright 2002 liuspider * Copyright 2008 Hongbo Ni + * Copyright 2010 Cheer Xiao * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -37,7 +38,7 @@ MAIN_MENU MENU MENUITEM "打印(&P)", MNID_FILE_PRINT MENUITEM "打印机设置(&S)...", MNID_FILE_SETUP MENUITEM SEPARATOR - MENUITEM "退出(&E)", MNID_FILE_EXIT + MENUITEM "退出(&X)", MNID_FILE_EXIT } POPUP "编辑(&E)" { MENUITEM "复制(&C)...", MNID_EDIT_COPYDLG @@ -48,7 +49,7 @@ MAIN_MENU MENU MENUITEM "定义(&D)...", MNID_BKMK_DEFINE } POPUP "选项(&O)" { - POPUP "显示帮助" + POPUP "总是显示帮助" BEGIN MENUITEM "默认", MNID_OPTS_HELP_DEFAULT MENUITEM "显示", MNID_OPTS_HELP_VISIBLE @@ -67,10 +68,26 @@ MAIN_MENU MENU MENUITEM "如何使用帮助(&O)", MNID_HELP_HELPON MENUITEM "总是在最前面(&T)", MNID_HELP_HELPTOP MENUITEM SEPARATOR - MENUITEM "资料信息(&I)...", MNID_HELP_ABOUT + MENUITEM "关于 Wine 帮助(&I)...", MNID_HELP_ABOUT } } +IDD_INDEX DIALOG 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "索引" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER +} + +IDD_SEARCH DIALOG 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "搜索" +{ + LTEXT "尚未实现", -1, 10, 10, 180, 150 +} + /* Strings */ STRINGTABLE { @@ -79,17 +96,40 @@ STID_WHERROR, "错误" STID_WARNING, "警告" STID_INFO, "信息" STID_NOT_IMPLEMENTED, "未实现" -STID_HLPFILE_ERROR_s, "读入帮助文件 ‘%s’ 时发生错误" -STID_INDEX, "内容(&C)" +STID_HLPFILE_ERROR_s, "读入帮助文件“%s”时发生错误" +STID_INDEX, "索引(&I)" STID_CONTENTS, "概要" STID_BACK, "返回(&B)" STID_ALL_FILES, "所有文件 (*.*)" STID_HELP_FILES_HLP, "帮助文件 (*.hlp)" -STID_FILE_NOT_FOUND_s "不能打开文件 '%s'. 你想要自己找这个文件吗?" -STID_NO_RICHEDIT "找不到 richedit... 终止" -STID_PSH_INDEX, "帮助内容: " +STID_FILE_NOT_FOUND_s "找不到文件“%s”。 你想要自己找这个文件吗?" +STID_NO_RICHEDIT "找不到 richedit 的实现……终止" +STID_PSH_INDEX, "帮助主题:" } +CONTEXT_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "注释...", MNID_CTXT_ANNOTATE + MENUITEM "复制", MNID_CTXT_COPY + MENUITEM "打印...", MNID_CTXT_PRINT + POPUP "字体" + BEGIN + MENUITEM "小号", MNID_CTXT_FONTS_SMALL + MENUITEM "中号", MNID_CTXT_FONTS_NORMAL + MENUITEM "大号", MNID_CTXT_FONTS_LARGE + END + POPUP "总是显示帮助" + BEGIN + MENUITEM "默认", MNID_CTXT_HELP_DEFAULT + MENUITEM "显示", MNID_CTXT_HELP_VISIBLE + MENUITEM "不显示", MNID_CTXT_HELP_NONVISIBLE + END + MENUITEM "使用系统颜色", MNID_CTXT_SYSTEM_COLORS + END +END + LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL /* Menu */ diff --git a/reactos/base/applications/winhlp32/rsrc.rc b/reactos/base/applications/winhlp32/rsrc.rc index 6bf84754f48..303366abf9a 100644 --- a/reactos/base/applications/winhlp32/rsrc.rc +++ b/reactos/base/applications/winhlp32/rsrc.rc @@ -30,7 +30,6 @@ IDI_WINHELP ICON winhelp.ico #include "Es.rc" #include "Fi.rc" #include "Hu.rc" -#include "Ko.rc" #include "No.rc" #include "Pl.rc" #include "Sk.rc" @@ -44,6 +43,7 @@ IDI_WINHELP ICON winhelp.ico #include "He.rc" #include "It.rc" #include "Ja.rc" +#include "Ko.rc" #include "Lt.rc" #include "Nl.rc" #include "Pt.rc" diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc index cd13c719a85..b2689fa72a2 100644 --- a/reactos/base/applications/wordpad/Zh.rc +++ b/reactos/base/applications/wordpad/Zh.rc @@ -61,7 +61,7 @@ BEGIN MENUITEM SEPARATOR POPUP "其他(&X)" BEGIN - MENUITEM "选中信息(&I)", ID_EDIT_SELECTIONINFO + MENUITEM "选中信息(&I)", ID_EDIT_SELECTIONINFO /* 准确性待议 */ MENUITEM "文字格式(&F)", ID_EDIT_CHARFORMAT MENUITEM "默认格式(&D)", ID_EDIT_DEFCHARFORMAT MENUITEM "段落格式(&H)", ID_EDIT_PARAFORMAT @@ -118,7 +118,7 @@ BEGIN BEGIN MENUITEM "黑色", ID_COLOR_BLACK /* 未找到“标准译名表” */ MENUITEM "栗色", ID_COLOR_MAROON - MENUITEM "调和绿", ID_COLOR_GREEN + MENUITEM "绿色", ID_COLOR_GREEN MENUITEM "橄榄色" ID_COLOR_OLIVE MENUITEM "藏青" ID_COLOR_NAVY MENUITEM "紫色" ID_COLOR_PURPLE @@ -126,7 +126,7 @@ BEGIN MENUITEM "灰色" ID_COLOR_GRAY MENUITEM "银色" ID_COLOR_SILVER MENUITEM "红色" ID_COLOR_RED - MENUITEM "绿色" ID_COLOR_LIME + MENUITEM "青柠色" ID_COLOR_LIME MENUITEM "黄色" ID_COLOR_YELLOW MENUITEM "蓝色" ID_COLOR_BLUE MENUITEM "洋红" ID_COLOR_FUCHSIA /* =magenta? */ diff --git a/reactos/base/applications/wordpad/wordpad.c b/reactos/base/applications/wordpad/wordpad.c index 187aef09842..db7546bfb1a 100644 --- a/reactos/base/applications/wordpad/wordpad.c +++ b/reactos/base/applications/wordpad/wordpad.c @@ -162,7 +162,7 @@ static void AddButton(HWND hwndToolBar, int nImage, int nCommand) button.iBitmap = nImage; button.idCommand = nCommand; button.fsState = TBSTATE_ENABLED; - button.fsStyle = TBSTYLE_BUTTON; + button.fsStyle = BTNS_BUTTON; button.dwData = 0; button.iString = -1; SendMessageW(hwndToolBar, TB_ADDBUTTONSW, 1, (LPARAM)&button); @@ -176,7 +176,7 @@ static void AddSeparator(HWND hwndToolBar) button.iBitmap = -1; button.idCommand = 0; button.fsState = 0; - button.fsStyle = TBSTYLE_SEP; + button.fsStyle = BTNS_SEP; button.dwData = 0; button.iString = -1; SendMessageW(hwndToolBar, TB_ADDBUTTONSW, 1, (LPARAM)&button); @@ -1818,7 +1818,7 @@ static LRESULT OnCreate( HWND hWnd ) if(!SendMessageW(hReBarWnd, RB_SETBARINFO, 0, (LPARAM)&rbi)) return -1; - hToolBarWnd = CreateToolbarEx(hReBarWnd, CCS_NOPARENTALIGN|CCS_NOMOVEY|WS_VISIBLE|WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_BUTTON, + hToolBarWnd = CreateToolbarEx(hReBarWnd, CCS_NOPARENTALIGN|CCS_NOMOVEY|WS_VISIBLE|WS_CHILD|TBSTYLE_TOOLTIPS|BTNS_BUTTON, IDC_TOOLBAR, 1, hInstance, IDB_TOOLBAR, NULL, 0, @@ -1880,7 +1880,7 @@ static LRESULT OnCreate( HWND hWnd ) SendMessageW(hReBarWnd, RB_INSERTBAND, -1, (LPARAM)&rbb); hFormatBarWnd = CreateToolbarEx(hReBarWnd, - CCS_NOPARENTALIGN | CCS_NOMOVEY | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_BUTTON, + CCS_NOPARENTALIGN | CCS_NOMOVEY | WS_VISIBLE | TBSTYLE_TOOLTIPS | BTNS_BUTTON, IDC_FORMATBAR, 8, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON)); AddButton(hFormatBarWnd, 0, ID_FORMAT_BOLD); diff --git a/reactos/base/applications/write/Sr.rc b/reactos/base/applications/write/Sr.rc new file mode 100644 index 00000000000..da4dae9fd4f --- /dev/null +++ b/reactos/base/applications/write/Sr.rc @@ -0,0 +1,38 @@ +/* + * Serbian language support + * + * Copyright (C) 2007 Mikolaj Zalewski + * Copyright 2010 Đorđe Vasiljević + * + * 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_SERBIAN, SUBLANG_SERBIAN_CYRILLIC + +STRINGTABLE +{ + IDS_FAILED, "Покретање Писанке није успело" +} + +LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN + +STRINGTABLE +{ + IDS_FAILED, "Pokretanje Pisanke nije uspelo" +} diff --git a/reactos/base/applications/write/Zh.rc b/reactos/base/applications/write/Zh.rc new file mode 100644 index 00000000000..1ff92b3360e --- /dev/null +++ b/reactos/base/applications/write/Zh.rc @@ -0,0 +1,31 @@ +/* + * Simplified Chinese language support + * + * Copyright (C) 2010 Cheer Xiao + * + * 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" + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE +{ + IDS_FAILED, "启动写字板失败" +} diff --git a/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/rsrc.rc index 70113567651..b1500b0cc1f 100644 --- a/reactos/base/applications/write/rsrc.rc +++ b/reactos/base/applications/write/rsrc.rc @@ -39,4 +39,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Ro.rc" #include "Ru.rc" #include "Si.rc" +#include "Sr.rc" #include "Uk.rc" +#include "Zh.rc"