/*
 * Start
 * Italian Language Support
 *
 * Copyright 2003 Dan Kegel
 * Copyright 2003 Ivan Leo Puoti
 * Copyright 2006 Antonio Codazzi
 * Copyright 2009 Luca Bennati
 *
 * 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) /* UTF-8 */

LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL

STRINGTABLE DISCARDABLE
{
STRING_USAGE,                                   "Avvia un programma, o apri un documento con il programma normalmente usato per i files con quell'estensione\n\
Usage:\n\
start [opzioni] nome_programma [...]\n\
start [opzioni] nome_documento\n\
\n\
Options:\n\
/M[inimized] Avvia il programma minimizzato.\n\
/MAX[imized] Avvia il programma massimizato.\n\
/R[estored]  Avvia il programma normalmente (né minimizzato né massimizzato).\n\
/W[ait]      Attendi l'uscita del programma, poi esci con il suo codice di uscita.\n\
/Unix        Usa un nome file Unix e apre il file come windows explorer.\n\
/ProgIDOpen  Apri un documento usando il seguente progID.\n\
/L           Mostra l'accordo di licenza con l'utente finale.\n\
\n\
start.exe versione 0.2 Copyright (C) 2003, Dan Kegel\n\
Start è fornito SENZA GARANZIA di alcun tipo; per ulteriori informazioni eseguire start con l'opzione /L.\n\
Questo è software libero, e lo potete redistribuire\n\
sotto alcune condizioni; eseguire 'start' con l'opzione /L per ulteriori infomazioni.\n\
"

STRING_LICENSE, "start.exe versione 0.2 Copyright (C) 2003, Dan Kegel\n\
Questo programma è software libero; puoi redistribuirlo e/o\n\
modificarlo sotto i termini della GNU Lesser Public License\n\
così come pubblicata dalla Free Software Foundation; sia la versione 2.1\n\
della Licenza, o (a tua scelta) ogni altra versione successiva.\n\
\n\
Questo programma è distribuito nella speranza che sia utile,\n\
ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di\n\
COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO.  Consulta la\n\
GNU Lesser Public License per ulteriori dettagli.\n\
\n\
Dovresti aver ricevuto una copia della GNU Lesser Public License\n\
assieme a questo programma; se no, scrivi a Free Software\n\
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n\
\n\
Consulta il file COPYING.LIB per informazioni sulla licenza.\n\
"

STRING_EXECFAIL "Non è stato possibile eseguire l'applicazione, o nessuna applicazione è associata con il file specificato.\nShellExecuteEx fallito"

STRING_UNIXFAIL "Non è stato possibile tradurre il nome file Unix in un nome file DOS."
}
