#
# Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code 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 General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

error.cant.open=\
     impossibile aprire: {0} 
error.illegal.option=\
        Opzione non valida: {0}
error.bad.option=\
        \u00c8 necessario specificare una delle opzioni -{ctxu}.
error.bad.cflag=\
        Per il flag 'c' \u00e8 necessario specificare file manifesto o di input.
error.bad.uflag=\
        Per il flag 'u' \u00e8 necessario specificare il flag 'e' oppure file manifesto o di input.
error.bad.eflag=\
	Il flag 'e' e il manifesto con l'attributo 'Main-Class' non possono essere specificati\n\
	 insieme.
error.nosuch.fileordir=\
        {0} : impossibile trovare il file o la directory
error.write.file=\
        Errore durante la scrittura del file jar esistente
error.create.dir=\
        {0} : impossibile creare la directory
error.incorrect.length=\
        lunghezza non valida durante l''elaborazione: {0}
out.added.manifest=\
        aggiunto manifesto
out.update.manifest=\
        aggiornato manifesto
out.ignore.entry=\
        la voce {0} sar\u00e0 ignorata
out.adding=\
        aggiunta in corso di: {0}
out.deflated=\
        \ \(compresso {0}%)
out.stored=\
        \ \(archiviato 0%)
out.create=\
        \ \ \ \ \ creato: {0}
out.extracted=\
        \ \ \ estratto: {0}
out.inflated=\
        decompresso: {0}
out.size=\
        \ \(in = {0}) (out = {1})

usage=\
Utilizzo: jar {ctxui}[vfm0Me] [file-jar] [file-manifesto] [punto di ingresso] [-C dir] file ...\n\
Opzioni:\n\
\ \   -c  crea un nuovo archivio\n\
\ \   -t  visualizza l'indice dell'archivio\n\
\ \   -x  estrae i file con nome (o tutti i file) dall'archivio\n\
\ \   -u  aggiorna l'archivio esistente\n\
\ \   -v  genera output commentato dall'output standard\n\
\ \   -f  specifica il nome file dell'archivio\n\
\ \   -m  include informazioni manifesto dal file manifesto specificato\n\
\ \   -e  specifica il punto di ingresso per l'applicazione stand-alone \n\
\ \       inclusa nel file jar eseguibile\n\
\ \   -0  solo memorizzazione; senza compressione ZIP\n\
\ \   -M  consente di non creare un file manifesto per le voci\n\
\ \   -i  genera informazioni sull'indice per i file jar specificati\n\
\ \   -C  imposta la directory specificata e include il file seguente\n\
Se un file \u00e8 una directory, verr\u00e0 elaborato in modo ricorsivo.\n\
Il nome del file manifesto, del file di archivio e del punto di ingresso devono\n\
essere specificati nello stesso ordine dei flag 'm', 'f' ed 'e'.\n\n\
Esempio 1: archiviazione di due file di classe in un archivio con il nome classes.jar: \n\
\ \      jar cvf classes.jar Foo.class Bar.class \n\
Esempio 2: utilizzo del file manifesto esistente 'mymanifest' e archiviazione di tutti i\n\
\ \          file della directory foo/ in 'classes.jar': \n\
\ \      jar cvfm classes.jar mymanifest -C foo/ .\n
