Creazione di pacchetti e distribuzione delle risorse nelle app .NETPackaging and Deploying Resources in .NET Apps

Per recuperare le risorse localizzate le applicazioni usano .NET Framework Resource Manager, rappresentato dalla classe ResourceManager.Applications rely on the .NET Framework Resource Manager, represented by the ResourceManager class, to retrieve localized resources. Resource Manager presuppone l'uso di un modello hub e spoke per la creazione di pacchetti e la distribuzione delle risorse.The Resource Manager assumes that a hub and spoke model is used to package and deploy resources. L'hub è l'assembly principale che contiene il codice eseguibile non localizzabile e le risorse di un singolo set di impostazioni cultura, denominate impostazioni cultura neutre o predefinite.The hub is the main assembly that contains the nonlocalizable executable code and the resources for a single culture, called the neutral or default culture. Le impostazioni cultura predefinite sono le impostazioni di fallback per l'applicazione, ovvero le impostazioni che vengono usate quando non si trovano le risorse localizzate.The default culture is the fallback culture for the application; it is the culture whose resources are used if localized resources cannot be found. Ogni spoke si connette a un assembly satellite contenente le risorse di determinate impostazioni cultura, ma non contiene alcun codice.Each spoke connects to a satellite assembly that contains the resources for a single culture, but does not contain any code.

Questo modello presenta diversi vantaggi:There are several advantages to this model:

  • È possibile aggiungere in modo incrementale risorse per nuove impostazioni cultura dopo la distribuzione di un'applicazione.You can incrementally add resources for new cultures after you have deployed an application. Lo sviluppo di risorse specifiche per le impostazioni cultura può richiedere molto tempo. Questo modello consente di rilasciare l'applicazione principale e quindi di distribuire in un secondo momento le risorse specifiche delle impostazioni cultura.Because subsequent development of culture-specific resources can require a significant amount of time, this allows you to release your main application first, and deliver culture-specific resources at a later date.

  • È possibile aggiornare e modificare gli assembly satellite di un'applicazione senza ricompilare l'applicazione.You can update and change an application's satellite assemblies without recompiling the application.

  • L'applicazione potrà caricare solo gli assembly satellite che contengono le risorse necessarie per impostazioni cultura specifiche.An application needs to load only those satellite assemblies that contain the resources needed for a particular culture. In questo modo è possibile ridurre notevolmente l'uso delle risorse di sistema.This can significantly reduce the use of system resources.

Tuttavia il modello presenta anche alcuni svantaggi:However, there are also disadvantages to this model:

  • È necessario gestire più set di risorse.You must manage multiple sets of resources.

  • Il costo iniziale del test un'applicazione è più elevato, perché è necessario sottoporre a test diverse configurazioni.The initial cost of testing an application increases, because you must test several configurations. Si noti che a lungo termine sarà più semplice ed economico testare un'applicazione centrale con vari satelliti che testare e gestire più versioni internazionali parallele.Note that in the long term it will be easier and less expensive to test one core application with several satellites, than to test and maintain several parallel international versions.

Convenzioni di denominazione delle risorseResource Naming Conventions

Quando si includono nel pacchetto le risorse dell'applicazione è necessario denominarle in base alle convenzioni previste dal Common Language Runtime.When you package your application's resources, you must name them using the resource naming conventions that the common language runtime expects. Il runtime identifica una risorsa in base al nome delle impostazioni cultura.The runtime identifies a resource by its culture name. A ogni set di impostazioni cultura viene assegnato un nome univoco, in genere una combinazione di un nome impostazioni cultura di due lettere minuscole associato a una lingua e (se necessario) un nome impostazioni cultura secondarie di due lettere maiuscole associato a un paese o a una regione.Each culture is given a unique name, which is usually a combination of a two-letter, lowercase culture name associated with a language and, if required, a two-letter, uppercase subculture name associated with a country or region. Il nome delle impostazioni cultura secondarie segue il nome delle impostazioni cultura ed è separato da un trattino (-).The subculture name follows the culture name, separated by a dash (-). Ad esempio ja-JP corrisponde al giapponese parlato in Giappone, en-US corrisponde all'inglese parlato negli Stati Uniti d'America, de-DE corrisponde al tedesco parlato in Germania, de-AT corrisponde al tedesco parlato in Austria.Examples include ja-JP for Japanese as spoken in Japan, en-US for English as spoken in the United States, de-DE for German as spoken in Germany, or de-AT for German as spoken in Austria. Per un elenco completo dei nomi delle impostazioni cultura, vedere la pagina del riferimento all'API NLS (National Language Support) nel Globalization Developer Center.See the National Language Support (NLS) API Reference at the Go Global Developer Center for a complete list of culture names.

Nota

Per informazioni sulla creazione di file di risorse, vedere Creazione di file di risorse e Creazione di assembly satellite.For information about creating resource files, see Creating Resource Files and Creating Satellite Assemblies.

Processo di fallback per le risorseThe Resource Fallback Process

Il modello hub e spoke di creazione dei pacchetti e distribuzione delle risorse usa un processo di fallback per trovare le risorse appropriate.The hub and spoke model for packaging and deploying resources uses a fallback process to locate appropriate resources. Se in un'applicazione viene richiesta una risorsa localizzata non disponibile, tramite Common Language Runtime viene cercata nella gerarchia delle impostazioni cultura una risorsa di fallback appropriata che corrisponda il più possibile alla richiesta dell'applicazione dell'utente e viene generata un'eccezione solo come ultima soluzione.If an application requests a localized resource that is unavailable, the common language runtime searches the hierarchy of cultures for an appropriate fallback resource that most closely matches the user's application's request, and throws an exception only as a last resort. A ogni livello della gerarchia, quando viene trovata una risorsa appropriata viene usata tale risorsa.At each level of the hierarchy, if an appropriate resource is found, the runtime uses it. Se la ricerca ha esito negativo si passa al livello successivo.If the resource is not found, the search continues at the next level.

Per migliorare le prestazioni di ricerca, applicare l'attributo NeutralResourcesLanguageAttribute all'assembly principale e passare a tale attributo il nome della lingua neutra da usare con l'assembly principale.To improve lookup performance, apply the NeutralResourcesLanguageAttribute attribute to your main assembly, and pass it the name of the neutral language that will work with your main assembly.

Processo di fallback per le risorse di .NET Framework.NET Framework resource fallback process

Il processo di fallback per le risorse di .NET Framework include i passaggi seguenti:The .NET Framework resource fallback process involves the following steps:

Suggerimento

L'elemento di configurazione <relativeBindForResources> può contribuire a ottimizzare il processo di fallback delle risorse e il processo di probe degli assembly di risorse nel runtime.You may be able to use the <relativeBindForResources> configuration element to optimize the resource fallback process and the process by which the runtime probes for resource assemblies. Per altre informazioni vedere la sezione Ottimizzazione del processo di fallback delle risorse.For more information, see the Optimizing the Resource Fallback Process section.

  1. Il runtime ricerca nella Global Assembly Cache un assembly corrispondente alle impostazioni cultura richieste per l'applicazione.The runtime first checks the global assembly cache for an assembly that matches the requested culture for your application.

    La Global Assembly Cache può archiviare assembly di risorse condivisi da più applicazioni.The global assembly cache can store resource assemblies that are shared by many applications. In tal modo non è necessario includere set di risorse specifici nella struttura di directory di ogni applicazione creata.This frees you from having to include specific sets of resources in the directory structure of every application you create. Se il runtime rileva un riferimento all'assembly, cerca nell'assembly la risorsa richiesta.If the runtime finds a reference to the assembly, it searches the assembly for the requested resource. Se rileva la voce nell'assembly usa la risorsa richiesta.If it finds the entry in the assembly, it uses the requested resource. Se la voce non viene trovata la ricerca continua.If it doesn't find the entry, it continues the search.

  2. Il runtime cerca quindi nella directory dell'assembly in esecuzione una sottodirectory corrispondente alle impostazioni cultura richieste.The runtime next checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. Se trova la sottodirectory, cerca nella sottodirectory un assembly satellite valido per le impostazioni cultura richieste.If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture. Il runtime cerca quindi nell'assembly satellite la risorsa richiesta.The runtime then searches the satellite assembly for the requested resource. Se trova la risorsa nell'assembly la usa direttamente.If it finds the resource in the assembly, it uses it. In caso contrario la ricerca continua.If it doesn't find the resource, it continues the search.

  3. Il runtime esegue una query in Windows Installer per determinare se l'assembly satellite va installato su richiesta.The runtime next queries the Windows Installer to determine whether the satellite assembly is to be installed on demand. In tal caso il runtime gestisce l'installazione, carica l'assembly e cerca la risorsa richiesta.If so, it handles the installation, loads the assembly, and searches it or the requested resource. Se trova la risorsa nell'assembly la usa direttamente.If it finds the resource in the assembly, it uses it. In caso contrario la ricerca continua.If it doesn't find the resource, it continues the search.

  4. Il runtime genera l'evento AppDomain.AssemblyResolve per indicare che l'assembly satellite non è stato trovato.The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. Se si sceglie di gestire l'evento, il gestore eventi può restituire un riferimento all'assembly satellite le cui risorse verranno usate per la ricerca.If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. In caso contrario il gestore eventi restituisce null e la ricerca continua.Otherwise, the event handler returns null and the search continues.

  5. Il runtime torna a eseguire una ricerca nella Global Assembly Cache, ma ora cerca l'assembly padre delle impostazioni cultura richieste.The runtime next searches the global assembly cache again, this time for the parent assembly of the requested culture. Se l'assembly padre esiste nella Global Assembly Cache il runtime cerca nell'assembly la risorsa richiesta.If the parent assembly exists in the global assembly cache, the runtime searches the assembly for the requested resource.

    Le impostazioni cultura padre sono definite come impostazioni cultura di fallback appropriate.The parent culture is defined as the appropriate fallback culture. Gli elementi padre sono candidati ideali per il fallback, perché l'impostazione di una risorsa qualsiasi è preferibile alla generazione di un'eccezione.Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. Questo processo consente anche di tornare a usare le risorse.This process also allows you to reuse resources. Una determinata risorsa va inclusa nel livello padre solo se le impostazioni cultura figlio non richiedono la localizzazione della risorsa richiesta.You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. Se ad esempio si specificano assembly satellite per en (inglese neutro), en-GB (inglese del Regno Unito) ed en-US (inglese degli Stati Uniti), il satellite en contiene la terminologia comune, mentre i satelliti en-GB ed en-US possono fornire override solo per i termini diversi.For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite would contain the common terminology, and the en-GB and en-US satellites could provide overrides for only those terms that differ.

  6. Il runtime cerca quindi nella directory dell'assembly in esecuzione una directory padre.The runtime next checks the directory of the currently executing assembly to see if it contains a parent directory. Se esiste una directory padre il runtime cerca in tale directory un assembly satellite valido per le impostazioni cultura padre.If a parent directory exists, the runtime searches the directory for a valid satellite assembly for the parent culture. Se il runtime trova l'assembly cerca nell'assembly la risorsa richiesta.If it finds the assembly, the runtime searches the assembly for the requested resource. Se trova la risorsa la usa direttamente.If it finds the resource, it uses it. In caso contrario la ricerca continua.If it doesn't find the resource, it continues the search.

  7. Il runtime esegue una query in Windows Installer per determinare se l'assembly satellite padre va installato su richiesta.The runtime next queries the Windows Installer to determine whether the parent satellite assembly is to be installed on demand. In tal caso il runtime gestisce l'installazione, carica l'assembly e cerca la risorsa richiesta.If so, it handles the installation, loads the assembly, and searches it or the requested resource. Se trova la risorsa nell'assembly la usa direttamente.If it finds the resource in the assembly, it uses it. In caso contrario la ricerca continua.If it doesn't find the resource, it continues the search.

  8. Il runtime genera l'evento AppDomain.AssemblyResolve per indicare che non è stata trovata una risorsa di fallback appropriata.The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find an appropriate fallback resource. Se si sceglie di gestire l'evento, il gestore eventi può restituire un riferimento all'assembly satellite le cui risorse verranno usate per la ricerca.If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. In caso contrario il gestore eventi restituisce null e la ricerca continua.Otherwise, the event handler returns null and the search continues.

  9. Il runtime esegue quindi la ricerca negli assembly padre come nei tre passaggi precedenti, su numerosi livelli potenziali.The runtime next searches parent assemblies, as in the previous three steps, through many potential levels. Ogni set di impostazioni cultura ha un solo set padre, definito dalla proprietà CultureInfo.Parent, ma un set padre può a sua volta avere un proprio set padre.Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. La ricerca di impostazioni cultura padre si interrompe quando la proprietà Parent di un set di impostazioni cultura restituisce CultureInfo.InvariantCulture. Ai fini del fallback delle risorse le impostazioni cultura invariabili non sono considerate impostazioni cultura padre o impostazioni cultura che possono avere risorse.The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture; for resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  10. Se dopo la ricerca nelle impostazioni cultura specificate in origine e in tutte le impostazioni cultura padre la risorsa non è stata trovata, viene usata la risorsa corrispondente alle impostazioni cultura predefinite (fallback).If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. In genere le risorse delle impostazioni cultura predefinite sono incluse nell'assembly principale dell'applicazione.Typically, the resources for the default culture are included in the main application assembly. Tuttavia è possibile specificare il valore Satellite per la proprietà Location dell'attributo NeutralResourcesLanguageAttribute per indicare come posizione finale di fallback per le risorse un assembly satellite anziché l'assembly principale.However, you can specify a value of Satellite for the Location property of the NeutralResourcesLanguageAttribute attribute to indicate that the ultimate fallback location for resources is a satellite assembly, rather than the main assembly.

    Nota

    La risorsa predefinita è l'unica risorsa che può essere compilata con l'assembly principale.The default resource is the only resource that can be compiled with the main assembly. Se non si specifica un assembly satellite tramite l'attributo NeutralResourcesLanguageAttribute, la risorsa predefinita è il fallback finale (padre finale).Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). È pertanto consigliabile includere sempre un set di risorse predefinito nell'assembly principale.Therefore, we recommend that you always include a default set of resources in your main assembly. Ciò evita la generazione di eccezioni.This helps prevent exceptions from being thrown. Se si include un file di risorse predefinito, si offre un fallback per tutte le risorse e si garantisce che l'utente disponga di almeno una risorsa, anche se questa non è specifica per le impostazioni cultura.By including a default resource, file you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  11. Infine se il runtime non trova una risorsa per impostazioni cultura predefinite (fallback) viene generata un'eccezione MissingManifestResourceException o MissingSatelliteAssemblyException per indicare che la risorsa non è stata trovata.Finally, if the runtime doesn't find a resource for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found.

Si supponga ad esempio che l'applicazione richieda una risorsa localizzata in spagnolo (Messico) (impostazioni cultura es-MX).For example, suppose the application requests a resource localized for Spanish (Mexico) (the es-MX culture). Il runtime cerca nella Global Assembly Cache l'assembly corrispondente a es-MX, ma non lo trova.The runtime first searches the global assembly cache for the assembly that matches es-MX, but doesn't find it. Il runtime cerca quindi nella directory dell'assembly in esecuzione una directory es-MX.The runtime then searches the directory of the currently executing assembly for an es-MX directory. Se la ricerca non ha esito positivo, il runtime cerca nuovamente nella Global Assembly Cache un assembly padre corrispondente alle impostazioni cultura di fallback, in questo esempio es (spagnolo).Failing that, the runtime searches the global assembly cache again for a parent assembly that reflects the appropriate fallback culture — in this case, es (Spanish). Se l'assembly padre non viene trovato, il runtime cerca le impostazioni cultura es-MX in tutti i livelli potenziali di assembly padre finché non trova una risorsa corrispondente.If the parent assembly is not found, the runtime searches all potential levels of parent assemblies for the es-MX culture until it finds a corresponding resource. Se non trova una risorsa, il runtime usa la risorsa delle impostazioni cultura predefinite.If a resource isn't found, the runtime uses the resource for the default culture.

Ottimizzazione del processo di fallback per le risorse di .NET FrameworkOptimizing the .NET Framework Resource Fallback Process

Se si verificano le seguenti condizioni, è possibile ottimizzare il processo con il quale il runtime cerca risorse negli assembly satelliteUnder the following conditions, you can optimize the process by which the runtime searches for resources in satellite assemblies

  • Gli assembly satellite vengono distribuiti nello stesso percorso in cui si trova l'assembly di codice.Satellite assemblies are deployed in the same location as the code assembly. Se l'assembly di codice è installato nella Global Assembly Cache anche gli assembly satellite vengono installati nella Global Assembly Cache.If the code assembly is installed in the Global Assembly Cache, satellite assemblies are also installed in the global assembly cache. Se l'assembly di codice è installato in una directory gli assembly satellite vengono installati in cartelle specifiche della directory, corrispondenti alle impostazioni cultura.If the code assembly is installed in a directory, satellite assemblies are installed in culture-specific folders of that directory.

  • Gli assembly satellite non vengono installati su richiesta.Satellite assemblies are not installed on demand.

  • Il codice dell'applicazione non gestisce l'evento AppDomain.AssemblyResolve.Application code does not handle the AppDomain.AssemblyResolve event.

È possibile ottimizzare il probe per gli assembly satellite includendo l'elemento <relativeBindForResources> e impostando il relativo attributo enabled su true nel file di configurazione dell'applicazione, come illustrato nell'esempio seguente.You optimize the probe for satellite assemblies by including the <relativeBindForResources> element and setting its enabled attribute to true in the application configuration file, as shown in the following example.

<configuration>
   <runtime>
      <relativeBindForResources enabled="true" />
   </runtime>
</configuration>

Il probe ottimizzato per gli assembly satellite è una funzionalità che richiede il consenso esplicito.The optimized probe for satellite assemblies is an opt-in feature. In altri termini il runtime segue le fasi documentate in Processo di fallback per le risorse salvo se nel file di configurazione dell'applicazione è presente l'elemento <relativeBindForResources> e l'attributo enabled di tale elemento è impostato su true.That is, the runtime follows the steps documented in The Resource Fallback Process unless the <relativeBindForResources> element is present in the application's configuration file and its enabled attribute is set to true. In questo caso il processo di probe di un assembly satellite viene modificato come segue:If this is the case, the process of probing for a satellite assembly is modified as follows:

  • Il runtime usa il percorso dell'assembly del codice padre per il probe dell'assembly satellite.The runtime uses the location of the parent code assembly to probe for the satellite assembly. Se l'assembly padre è installato nella Global Assembly Cache il runtime esegue il probe nella cache ma non nella directory dell'applicazione.If the parent assembly is installed in the global assembly cache, the runtime probes in the cache but not in the application's directory. Se l'assembly padre è installato in una directory dell'applicazione il runtime esegue il probe nella directory dell'applicazione ma non nella Global Assembly Cache.If the parent assembly is installed in an application directory, the runtime probes in the application directory but not in the global assembly cache.

  • Il runtime non esegue una query in Windows Installer per l'installazione su richiesta di assembly satellite.The runtime doesn't query the Windows Installer for on-demand installation of satellite assemblies.

  • Se il probe per un assembly di risorse specifico non riesce, il runtime non genera l'evento AppDomain.AssemblyResolve.If the probe for a particular resource assembly fails, the runtime does not raise the AppDomain.AssemblyResolve event.

Processo di fallback per le risorse di .NET Core.NET Core resource fallback process

Il processo di fallback per le risorse di .NET Core include i passaggi seguenti:The .NET Core resource fallback process involves the following steps:

  1. Il runtime prova a caricare un assembly satellite per le impostazioni cultura richieste.The runtime attempts to load a satellite assembly for the requested culture.

    • Cerca quindi nella directory dell'assembly in esecuzione una sottodirectory corrispondente alle impostazioni cultura richieste.Checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. Se trova la sottodirectory, cerca nella sottodirectory un assembly satellite valido per le impostazioni cultura richieste e lo carica.If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture and loads it.

      Nota

      Nei sistemi operativi con file system che fanno distinzione tra maiuscole e minuscole, ovvero Linux e macOS, la ricerca di sottodirectory con il nome delle impostazioni cultura fa distinzione tra maiuscole e minuscole.On operating systems with case-sensitive file systems (that is, Linux and macOS), the culture name subdirectory search is case-sensitive. L'uso di maiuscole e minuscole nel nome della sottodirectory deve corrispondere esattamente a quello di CultureInfo.Name, ad esempio es o es-MX.The subdirectory name must exactly match the case of the CultureInfo.Name (for example, es or es-MX).

      Nota

      Se il programmatore ha derivato un contesto di caricamento dell'assembly personalizzato da AssemblyLoadContext, la situazione è più complicata.If the programmer has derived a custom assembly load context from AssemblyLoadContext, the situation is complicated. Se l'assembly in esecuzione è stato caricato nel contesto personalizzato, il runtime carica l'assembly satellite nel contesto personalizzato.If the executing assembly was loaded into the custom context, the runtime loads the satellite assembly into the custom context. I dettagli esulano dall'ambito di questo documento.The details are out of scope for this document. Vedere AssemblyLoadContext.See AssemblyLoadContext.

    • Se non viene trovato un assembly satellite, AssemblyLoadContext genera l'evento AssemblyLoadContext.Resolving per indicare che non riesce a trovare l'assembly.If a satellite assemble has not been found, the AssemblyLoadContext raises the AssemblyLoadContext.Resolving event to indicate that it is unable to find the satellite assembly. Se si sceglie di gestire l'evento, il gestore eventi può caricare e restituire un riferimento all'assembly satellite.If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

    • Se l'assembly satellite non viene ancora trovato, AssemblyLoadContext determina l'attivazione di un evento AppDomain.AssemblyResolve da parte di AppDomain per indicare che non riesce a trovare l'assembly.If a satellite assembly still has not been found, the AssemblyLoadContext causes the AppDomain to trigger an AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. Se si sceglie di gestire l'evento, il gestore eventi può caricare e restituire un riferimento all'assembly satellite.If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

  2. Se non viene trovato un assembly satellite, il runtime cerca la risorsa richiesta.If a satellite assembly is found, the runtime searches it for the requested resource. Se trova la risorsa nell'assembly la usa direttamente.If it finds the resource in the assembly, it uses it. In caso contrario la ricerca continua.If it doesn't find the resource, it continues the search.

    Nota

    Per trovare una risorsa all'interno dell'assembly satellite, il runtime cerca il file di risorse richiesto da ResourceManager per la proprietà CultureInfo.Name corrente.To find a resource within the satellite assembly, the runtime searches for the resource file requested by the ResourceManager for the current CultureInfo.Name. All'interno del file di risorse cerca il nome della risorsa richiesta.Within the resource file it searches for the requested resource name. Se uno dei due non viene trovato, la risorsa viene considerata come non trovata.If either is not found, the resource is treated as not found.

  3. Il runtime cerca quindi gli assembly di impostazioni cultura padre su molti livelli potenziali, ripetendo ogni ora i passaggi 1 e 2.The runtime next searches the parent culture assemblies through many potential levels, each time repeating steps 1 & 2.

    Le impostazioni cultura padre sono definite come impostazioni cultura di fallback appropriate.The parent culture is defined as an appropriate fallback culture. Gli elementi padre sono candidati ideali per il fallback, perché l'impostazione di una risorsa qualsiasi è preferibile alla generazione di un'eccezione.Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. Questo processo consente anche di tornare a usare le risorse.This process also allows you to reuse resources. Una determinata risorsa va inclusa nel livello padre solo se le impostazioni cultura figlio non richiedono la localizzazione della risorsa richiesta.You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. Se ad esempio si specificano assembly satellite per en (inglese neutro), en-GB (inglese del Regno Unito) ed en-US (inglese degli Stati Uniti), il satellite en contiene la terminologia comune, mentre i satelliti en-GB ed en-US forniscono override solo per i termini diversi.For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite contains the common terminology, and the en-GB and en-US satellites provides overrides for only those terms that differ.

    Ogni set di impostazioni cultura ha un solo set padre, definito dalla proprietà CultureInfo.Parent, ma un set padre può a sua volta avere un proprio set padre.Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. La ricerca di impostazioni cultura padre si arresta quando la proprietà Parent di un set di impostazioni cultura restituisce CultureInfo.InvariantCulture.The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture. Ai fini del fallback delle risorse, le impostazioni cultura inglese non dipendenti da paese/area geografica non sono considerate impostazioni cultura padre o impostazioni cultura che possono avere risorse.For resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  4. Se dopo la ricerca nelle impostazioni cultura specificate in origine e in tutte le impostazioni cultura padre la risorsa non è stata trovata, viene usata la risorsa corrispondente alle impostazioni cultura predefinite (fallback).If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. In genere le risorse delle impostazioni cultura predefinite sono incluse nell'assembly principale dell'applicazione.Typically, the resources for the default culture are included in the main application assembly. È tuttavia possibile specificare il valore Satellite per la proprietà Location per indicare che la posizione finale di fallback per le risorse è un assembly satellite anziché l'assembly principale.However, you can specify a value of Satellite for the Location property to indicate that the ultimate fallback location for resources is a satellite assembly rather than the main assembly.

    Nota

    La risorsa predefinita è l'unica risorsa che può essere compilata con l'assembly principale.The default resource is the only resource that can be compiled with the main assembly. Se non si specifica un assembly satellite tramite l'attributo NeutralResourcesLanguageAttribute, la risorsa predefinita è il fallback finale (padre finale).Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). È pertanto consigliabile includere sempre un set di risorse predefinito nell'assembly principale.Therefore, we recommend that you always include a default set of resources in your main assembly. Ciò evita la generazione di eccezioni.This helps prevent exceptions from being thrown. Se si include un file di risorse predefinito, si offre un fallback per tutte le risorse e si garantisce che l'utente disponga di almeno una risorsa, anche se questa non è specifica per le impostazioni cultura.By including a default resource file, you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  5. Se infine il runtime non trova un file di risorse per impostazioni cultura predefinite (fallback), viene generata un'eccezione MissingManifestResourceException o MissingSatelliteAssemblyException per indicare che la risorsa non è stata trovata.Finally, if the runtime doesn't find a resource file for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found. Se il file di risorse viene trovato ma la risorsa richiesta non è presente, la richiesta restituisce null.If the resource file is found but the requested resource is not present the request returns null.

Fallback finale a un assembly satelliteUltimate Fallback to Satellite Assembly

Se si vuole è possibile rimuovere risorse dall'assembly principale e specificare che il runtime caricherà le risorse di fallback finale da un assembly satellite corrispondente a impostazioni cultura specifiche.You can optionally remove resources from the main assembly and specify that the runtime should load the ultimate fallback resources from a satellite assembly that corresponds to a specific culture. Per controllare il processo di fallback si usa il costruttore NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) e si specifica un valore per il parametro UltimateResourceFallbackLocation che indica se Resource Manager estrarrà le risorse di fallback dall'assembly principale o da un assembly satellite.To control the fallback process, you use the NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) constructor and supply a value for the UltimateResourceFallbackLocation parameter that specifies whether Resource Manager should extract the fallback resources from the main assembly or from a satellite assembly.

Nell'esempio di .NET Framework seguente viene usato l'attributo NeutralResourcesLanguageAttribute per archiviare le risorse di fallback di un'applicazione in un assembly satellite per la lingua francese (fr).The following .NET Framework example uses the NeutralResourcesLanguageAttribute attribute to store an application's fallback resources in a satellite assembly for the French (fr) language. L'esempio include due file di testo di risorse che definiscono un'unica risorsa stringa denominata Greeting.The example has two text-based resource files that define a single string resource named Greeting. Il primo file, resources.fr.txt, contiene una risorsa per la lingua francese.The first, resources.fr.txt, contains a French language resource.

Greeting=Bon jour!

Il secondo file, resources.ru.txt, contiene una risorsa per la lingua russa.The second, resources,ru.txt, contains a Russian language resource.

Greeting=Добрый день

Questi due file vengono compilati in file resources eseguendo il generatore di file di risorse (Resgen.exe) dalla riga di comando.These two files are compiled to .resources files by running the resource file generator (Resgen.exe) from the command line. Per la risorsa di lingua francese il comando è:For the French language resource, the command is:

resgen.exe resources.fr.txtresgen.exe resources.fr.txt

Per la risorsa di lingua russa il comando è:For the Russian language resource, the command is:

resgen.exe resources.ru.txtresgen.exe resources.ru.txt

È possibile incorporare i file resources in librerie di collegamento dinamico (DLL) eseguendo Assembly Linker (Al.exe) dalla riga di comando con la seguente sintassi per la risorsa di lingua francese:The .resources files are embedded into dynamic link libraries by running assembly linker (Al.exe) from the command line for the French language resource as follows:

al /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dllal /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dll

e con la seguente sintassi per la risorsa di lingua russa:and for the Russian language resource as follows:

al /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dllal /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dll

Il codice sorgente dell'applicazione si trova in un file con nome Example1.cs o Example1.vb.The application source code resides in a file named Example1.cs or Example1.vb. Include l'attributo NeutralResourcesLanguageAttribute per indicare che la risorsa di applicazione predefinita si trova nella sottodirectory fr.It includes the NeutralResourcesLanguageAttribute attribute to indicate that the default application resource is in the fr subdirectory. Crea un'istanza di Resource Manager, recupera il valore della risorsa Greeting e lo visualizza nella console.It instantiates the Resource Manager, retrieves the value of the Greeting resource, and displays it to the console.

using System;
using System.Reflection;
using System.Resources;

[assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)]

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("resources", 
                                               typeof(Example).Assembly);
      string greeting = rm.GetString("Greeting");
      Console.WriteLine(greeting); 
   }
}
Imports System.Reflection
Imports System.Resources

<Assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)>
Module Example
   Public Sub Main()
      Dim rm As New ResourceManager("resources", GetType(Example).Assembly)
      Dim greeting As String = rm.GetString("Greeting")
      Console.WriteLine(greeting) 
   End Sub
End Module

È quindi possibile compilare il codice sorgente C# dalla riga di comando come segue:You can then compile C# source code from the command line as follows:

csc Example1.cs

Il comando per il compilatore Visual Basic è molto simile:The command for the Visual Basic compiler is very similar:

vbc Example1.vb

Poiché nell'assembly principale non sono incorporate risorse, non è necessario compilare con l'opzione /resource.Because there are no resources embedded in the main assembly, you do not have to compile by using the /resource switch.

Quando si esegue l'esempio da un sistema la cui lingua è diversa dal russo viene visualizzato il seguente output:When you run the example from a system whose language is anything other than Russian, it displays the following output:

Bon jour!

Proposta alternativa per la creazione dei pacchettiSuggested Packaging Alternative

Vincoli di tempo o di budget potrebbero rendere difficile la creazione di un set di risorse per ogni subset di impostazioni cultura supportato dall'applicazione.Time or budget constraints might prevent you from creating a set of resources for every subculture that your application supports. In alternativa è possibile creare un solo assembly satellite per impostazioni cultura padre usabili da tutte le impostazioni cultura secondarie correlate.Instead, you can create a single satellite assembly for a parent culture that all related subcultures can use. Ad esempio è possibile offrire un singolo assembly satellite inglese (en) che viene recuperato da utenti che richiedono risorse di regioni specifiche di lingua inglese e un singolo assembly satellite tedesco (de) per gli utenti che richiedono risorse di regioni specifiche di lingua tedesca.For example, you can provide a single English satellite assembly (en) that is retrieved by users who request region-specific English resources, and a single German satellite assembly (de) for users who request region-specific German resources. Le richieste per il tedesco parlato in Germania (de-DE), in Austria (de-AT) e in Svizzera (de-CH) avranno come fallback l'assembly satellite tedesco (de).For example, requests for German as spoken in Germany (de-DE), Austria (de-AT), and Switzerland (de-CH) would fall back to the German satellite assembly (de). Le risorse predefinite sono il fallback finale e come tali sono quelle richieste dalla maggior parte degli utenti dell'applicazione, perciò vanno scelte con attenzione.The default resources are the final fallback and therefore should be the resources that will be requested by the majority of your application's users, so choose these resources carefully. Questo approccio consente di distribuire risorse meno specifiche a livello di impostazioni cultura, ma in grado di ridurre notevolmente i costi di localizzazione dell'applicazione.This approach deploys resources that are less culturally specific, but can significantly reduce your application's localization costs.

Vedere ancheSee also