#
#
# Copyright 2000-2005 Sun Microsystems, Inc.  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.  Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#

# "rmid", inetd", and "wait" should not be translated.
rmid.syntax.exec.invalid=\
        rmid \u00e8 stato avviato da inetd con uno stato non valido (diverso da wait)

# "rmid" and "inetd" should not be translated.
rmid.syntax.port.badarg=\
	non \u00e8 possibile specificare la porta se rmid viene avviato da inetd

# "port" here refers to a TCP port for the server to listen on.
rmid.syntax.port.badnumber=\
    la porta non \u00e8 un numero

# "-port" should not be translated, because it's part of command syntax.
rmid.syntax.port.missing=\
    L'opzione -port richiede un argomento

# "-log" should not be translated, because it's part of command syntax.
rmid.syntax.log.missing=\
    L'opzione -log richiede un argomento

# "-log" should not be translated, because it's part of command syntax.
rmid.syntax.log.required=\
	\u00c8 richiesta l'opzione -log

# {0} = the (string) illegal argument in question
rmid.syntax.illegal.option=\
	opzione illegale: {0}

# {0} = the (string) reason text that came with a thrown exception
# "Activation.main" should not be translated, because it's a codepoint
rmid.unexpected.exception=\
	Activation.main: si \u00e8 verificata un''eccezione: {0}

# "java.home" should not be translated, because it's a property name
# "ActivatorImpl" should not be translated, because it's a codepoint
rmid.unfound.java.home.property=\
	ActivatorImpl: impossibile individuare java.home

# "rmid" should not be translated
rmid.inherited.channel.info=\
	Avvio di rmid con canale ereditato

# "Activation.main" should not be translated, because it's a codepoint
rmid.exec.policy.invalid=\
	Activation.main: classe di policy eseguibile non valida

# "rmid" should not be translated
rmid.exec.policy.exception=\
	rmid: il tentativo di ottenere i criteri di esecuzione ha restituito:

# "rmid" should not be translated
rmid.exec.command=\
	rmid: debugExec: esecuzione di "{0}" in corso

# "rmid" should not be translated
rmid.group.inactive=\
	rmid: gruppo attivazione inattivo: {0}

# "Activation.main", "sun.rmi.activation.execPolicy", "ExecPermission" and 
# "ExecOptionPermission" should not be translated, since they refer to
# class/permission names.
rmid.exec.perms.inadequate=\
    Activation.main: avviso: sistema sun.rmi.activation.execPolicy\n\
        Propriet\u00e0 non specificata e nessun ExecPermissions/ExecOptionPermissions\n\
        garantito. I tentativi di attivazione successivi potrebbero fallire a causa di \n\
    controlli di autorizzazione ExecPermission/ExecOptionPermission non andati a buon fine.  Per\n\
    la documentazione e le modalit\u00e0 di configurazione della protezione rmid, fare riferimento a (informazioni in inglese):\n\
\n\
        http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/rmid.html\n\
        http://java.sun.com/j2se/1.4/docs/tooldocs/win32/rmid.html\n

# "rmid", "-port", "-log", "-stop", "-C" and "-J" should not be translated,
# because they are syntax
rmid.usage=Utilizzo: {0} <opzioni>\
\n\
\ndove <opzioni> comprende:\
\n  -port <porta>       Specifica la porta usata da rmid\
\n  -log <directory>    Specifica la directory in cui rmid scrive il log\
\n  -stop              Interrompe l''invocazione corrente di rmid (per la porta specificata)\
\n  -C<flag runtime>    Passa l''argomento a ciascun processo figlio (gruppo di attivazione)\
\n  -J<flag runtime>    Passa l''argomento all''interprete java\
\n\

# This means "The currently running activation daemon has been shut down,
# and is about to exit".
rmid.daemon.shutdown=\
	daemon di attivazione terminato

# "rmid" should not be translated
rmid.restart.group.warning=\
\nrmid: (AVVERTENZA) il riavvio del gruppo ha restituito:

# "rmid" should not be translated
rmid.restart.service.warning=\
\nrmid: (AVVERTENZA) il riavvio del servizio ha restituito:

# "rmid" should not be translated
rmid.log.update.warning=\
\nrmid: (AVVERTENZA) il log dell'aggiornamento ha restituito:

# "rmid" should not be translated
rmid.log.snapshot.warning=\
\nrmid: (GRAVE) il log dell'istantanea ha restituito:

# "rmid" should not be translated
rmid.log.recover.warning=\
\nrmid: (AVVERTENZA) {0}: record del log ignorato durante il ripristino:
