################################################################################
##
##  Licensed to the Apache Software Foundation (ASF) under one or more
##  contributor license agreements.  See the NOTICE file distributed with
##  this work for additional information regarding copyright ownership.
##  The ASF licenses this file to You under the Apache License, Version 2.0
##  (the "License"); you may not use this file except in compliance with
##  the License.  You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
##  Unless required by applicable law or agreed to in writing, software
##  distributed under the License is distributed on an "AS IS" BASIS,
##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
##  See the License for the specific language governing permissions and
##  limitations under the License.
##
################################################################################

# flex2.tools
Mxmlc.OutputMessage=${name} (${length} byte)
Compc.OutputMessage=${name} (${length} byte)
Compiler.NoUpdateMessage=${name} \u00e8 aggiornato e non \u00e8 necessario rigenerarlo.
Compc.NoUpdateMessage=${name} \u00e8 aggiornato e non \u00e8 necessario rigenerarlo.
CompcPreLink.HigherMinimumSupportedVersionRequired='${swc}' richiede almeno la versione minima supportata ${swcMinimumSupportedVersion}. 
CompcPreLink.PotentialForMissingSkins='${swc}' ha impostazioni predefinite per gli stili e si trova in library-path, il che significa che le dipendenze verranno collegate senza gli stili. Di conseguenza, nelle applicazioni che usano il file SWC di output potrebbero mancare degli skin. Il file SWC deve essere in external-library-path.
PreLink.DependencyNotCompatible=La dipendenza ${definition} da ${swc} richiede la versione minima supportata ${swcMinimumVersion}, che \u00e8 superiore della versione compatibile, ${compatibilityVersion}.
PreLink.NoExternalVisibleDefinition=Nel file di destinazione non \u00e8 presente alcuna definizione visibile esternamente.
PreLink.MissingFactoryClassInFrameMetadata=Nei metadati Frame inclusi in questa unit\u00e0 di raccolta non \u00e8 stata specificata alcuna classe factoryClass per consentire il caricamento delle librerie condivise in fase di esecuzione configurate. Per eseguire la compilazione senza le librerie condivise in fase di esecuzione, impostare l'opzione -static-link-runtime-shared-libraries su True o rimuovere l'opzione -runtime-shared-libraries.
PreLink.InvalidBackgroundColor=Colore di sfondo non valido: ${backgroundColor}
PreLink.CouldNotParseNumber=Impossibile analizzare '${num}' come numero relativo a ${attribute}.
PreLink.MissingSignedLibraryDigest=Nel file catalog.xml della libreria, ${libraryPath}, non \u00e8 stato trovato alcun digest firmato. Compilare la libreria con -create-digest=true e riprovare.
PreLink.MissingUnsignedLibraryDigest=Nel file catalog.xml della libreria, ${libraryPath}, non \u00e8 stato trovato alcun digest non firmato. Compilare la libreria con -create-digest=true e riprovare.
PreLink.ClassesMappedToSameRemoteAlias=Per la classe '${existingClassName}' \u00e8 stata trovata una mappatura all'alias della classe remota '${alias}' durante l'elaborazione della classe '${className}'. Ora Flex genera codice per verificare se un alias \u00e8 gi\u00e0 stato registrato. Quando si deserializzano dati remoti, \u00e8 possibile mappare un alias solo a una classe singola.
PreLink.RequiredRsls=RSL obbligatori:
PreLink.RequiredRslUrl=\u0020\u0020\u0020\u0020${rslUrl}
PreLink.RequiredRslUrlWithFailover=\u0020\u0020\u0020\u0020${rslUrl} con 1 failover.
PreLink.RequiredRslUrlWithMultipleFailovers=\u0020\u0020\u0020\u0020${rslUrl} con ${failoverCount} failover.
PreLink.CompiledAsAComponent=${className} \u00e8 un modulo o un'applicazione a cui viene fatto riferimento diretto. ${className} e tutte le relative dipendenze verranno collegati a ${mainDefinition}. Per evitare questo problema si consiglia di utilizzare un'interfaccia.
ToolsConfiguration.FailedToLoadLicenseFile=Caricamento del file di licenza non riuscito: ${fileName}
ToolsConfiguration.BadAS3ESCombination=Combinazione \u2013as3 ed \u2013es non valida. -as3=${as3} ed -es=${es}. \u00c8 necessario che uno dei due valori corrisponda a true.
ToolsConfiguration.BadESStrictCombination=-es=${es} e -strict=${strict}. il parametro -strict \u00e8 consentito, ma potrebbero verificarsi degli errori di compilazione relativi ai riferimenti alle propriet\u00e0 dinamiche.
ToolsConfiguration.DeprecatedConfigurationOption=${var}' \u00e8 stato contrassegnato come obsoleto a partire da ${since}. Utilizzare '${replacement}'.
Optimizer.NotAValidSwfFile=${fileName} non \u00e8 un file SWF valido
