Creazione del package e distribuzione delle risorse

.NET Framework utilizza un modello hub e spoke per creare il package delle risorse e distribuirle. L'hub è l'assembly principale che contiene il codice eseguibile non localizzabile e le risorse relative a una singola lingua, denominata neutra o predefinita. La lingua predefinita è la lingua di fallback dell'applicazione. Ciascuno spoke si collega a un assembly satellite che contiene le risorse relative a una singola lingua, ma non contiene codice.

Questo modello presenta diversi vantaggi:

  • Una volta distribuita un'applicazione, sarà possibile aggiungere risorse per nuove lingue in modo incrementale. Poiché lo sviluppo successivo di risorse specifiche della lingua può richiedere molto tempo, questa soluzione consente di rilasciare l'applicazione principale e distribuire successivamente le risorse specifiche della lingua.

  • È possibile aggiornare e modificare gli assembly satellite di un'applicazione senza ricompilare l'applicazione.

  • L'applicazione può limitarsi a caricare solo gli assembly che contengono le risorse necessarie per una particolare lingua. In tal modo è possibile ridurre notevolmente l'utilizzo delle risorse di sistema.

Questo modello presenta tuttavia anche alcuni svantaggi:

  • È necessario gestire più insiemi di risorse.

  • Il costo iniziale del test di un'applicazione aumenta, perché è necessario verificare diverse configurazioni. Si osservi però che a lungo termine sarà più semplice e meno costoso eseguire il test di un'applicazione centrale con vari satelliti, piuttosto che verificare e gestire diverse versioni internazionali parallele.

Convenzioni di denominazione delle risorse

Quando si crea il package delle risorse dell'applicazione, è necessario denominarle utilizzando le convenzioni di denominazione delle risorse richieste da Common Language Runtime. Il runtime identifica una risorsa in base al nome o alla firma della lingua. A ciascuna lingua è assegnato un nome univoco costituito da una sigla di due caratteri minuscoli che identifica una lingua e, se necessario, da una sigla di due caratteri maiuscoli che identifica una lingua secondaria associata a un paese o un'area geografica specifica. La seconda sigla è separata dalla prima tramite un trattino (-). Sono esempi validi ja-JP per il giapponese del Giappone, en-US per l'inglese degli Stati Uniti, de-DE per il tedesco della Germania e de-AT per il tedesco dell'Austria. Per un elenco completo dei nomi delle lingue, vedere la classe CultureInfo.

Processo di fallback delle risorse

Nel modello hub e spoke per la creazione del package e la distribuzione delle risorse viene utilizzato un processo di fallback per l'individuazione delle risorse appropriate. Se un utente dell'applicazione richiede un ResourceSet non disponibile, Common Language Runtime cerca nella gerarchia delle lingue una risorsa di fallback appropriata che corrisponda il più possibile alla richiesta dell'utente e, solo in ultima analisi, genera un'eccezione. A ciascun livello della gerarchia, se viene individuata una risorsa appropriata, questa viene utilizzata dal runtime. In caso contrario, la ricerca continua al livello successivo. Il processo di fallback delle risorse viene descritto nei passaggi riportati di seguito.

  1. Il runtime esegue la ricerca nella Global Assembly Cache di un assembly che corrisponde alla lingua richiesta dall'applicazione.

    La Global Assembly Cache può memorizzare assembly di risorse condivisi da più applicazioni. In tal modo non è necessario includere set di risorse specifici nella struttura di directory di ogni applicazione creata. Se il runtime trova un riferimento all'assembly, cerca nell'assembly la risorsa richiesta. Se trova la voce nell'assembly, utilizza la risorsa. Se non trova la voce, continua la ricerca.

  2. Il runtime cerca quindi nella directory dell'assembly in esecuzione una directory che corrisponda alla lingua richiesta. Se la trova, vi cerca un assembly satellite valido per la lingua richiesta. Il runtime cerca quindi nell'assembly satellite la risorsa richiesta. Se trova la risorsa, la utilizza. Se non trova la risorsa, continua la ricerca.

  3. Il runtime esegue una nuova ricerca nella Global Assembly Cache, questa volta al fine di individuare l'assembly padre della risorsa richiesta. Se la Global Assembly Cache contiene l'assembly padre, il runtime vi cerca la risorsa richiesta.

    La lingua padre viene considerata la lingua di fallback appropriata. Avvalersi del padre è la soluzione più indicata. È preferibile fornire una risorsa qualsiasi piuttosto che generare un'eccezione. Questo processo consente anche di riutilizzare le risorse. È necessario includere una risorsa particolare a livello del padre solo se la lingua del figlio non richiede la localizzazione della risorsa desiderata. Se, ad esempio, vengono forniti assembly satellite per en (inglese neutro), en-GB (l'inglese del Regno Unito) e en-US (l'inglese degli Stati Uniti), il satellite en conterrà la terminologia comune e i satelliti en-GB e en-US potranno fornire gli override per i soli termini che differiscono.

  4. Il runtime cerca quindi una directory padre nella directory dell'assembly in esecuzione. Se esiste una directory padre, il runtime vi cerca un assembly satellite valido per la lingua padre. Se trova l'assembly, il runtime vi cerca la risorsa richiesta. Se trova la risorsa, la utilizza. Se non trova la risorsa, continua la ricerca.

  5. Il runtime cerca quindi gli assembly padre, come nel passaggio precedente, in numerosi livelli. Ciascuna lingua prevede un solo padre, ma ogni padre può avere a sua volta un padre.

  6. Se la risorsa non viene trovata nella lingua originariamente specificata né in alcuno degli elementi padre, verrà utilizzata la risorsa della lingua di fallback predefinita. A partire dalla versione 2.0 di .NET Framework, è possibile specificare come percorso di fallback finale delle risorse un assembly satellite anziché un assembly principale. Per verificare se il percorso di fallback finale delle risorse è un assembly principale oppure un assembly satellite, è possibile utilizzare la classe NeutralResourcesLanguageAttribute con l'enumerazione UltimateResourceFallbackLocation.

    Nota

    La risorsa predefinita è l'unica risorsa compilata con l'assembly principale. Tale risorsa costituisce il fallback finale, ovvero l'elemento padre finale, a meno che non venga specificato un assembly satellite mediante la classe NeutralResourcesLanguageAttribute. Pertanto, si raccomanda di includere sempre un set predefinito di risorse nell'assembly principale. In tal modo si può essere certi che non verranno generate eccezioni. L'inclusione di un file di risorse predefinito assicura la disponibilità di un fallback per tutte le risorse e garantisce che per l'utente sia presente almeno una risorsa, anche se non è specifica della lingua.

  7. Infine, se il runtime non trova una risorsa per una lingua di fallback predefinita, verrà generata un'eccezione in cui viene indicato che la risorsa non è stata trovata.

A titolo esemplificativo, si consideri il caso di un utente che richiede una risorsa localizzata in spagnolo del Messico. In conformità alle convenzioni di denominazione delle risorse sopra descritte, il runtime cerca nella Global Assembly Cache l'assembly che corrisponde alla lingua richiesta, "es-MX". Se non lo trova, il runtime cerca una directory "es-MX" nella directory dell'assembly in esecuzione. Se non la trova, il runtime cerca nuovamente nella Global Assembly Cache un assembly padre che corrisponda alla lingua di fallback appropriata, in questo caso "es" (spagnolo). Se l'assembly padre non viene trovato, il runtime risale l'intera gerarchia alla ricerca dell'assembly per la lingua "es-MX", finché non trova una risorsa corrispondente. Se non trova alcuna risorsa, il runtime utilizza la risorsa della lingua predefinita.

Fallback finale in un assembly satellite

A partire dalla versione 2.0 di .NET Framework, è possibile rimuovere le risorse dall'assembly principale e specificare che le risorse di fallback finali si trovano in un assembly satellite corrispondente a una lingua specifica. Per controllare il processo di fallback, è possibile utilizzare l'oggetto NeutralResourcesLanguageAttribute. Per specificare il percorso da cui ResourceManager deve estrarre le risorse di fallback, ovvero l'assembly principale o quello satellite, è stato aggiunto un nuovo costruttore alla classe NeutralResourcesLanguageAttribute che accetta un parametro aggiuntivo UltimateResourceFallbackLocation.

Nell'esempio riportato di seguito viene illustrato come applicare l'attributo a livello di classe.

[assembly: NeutralResourcesLanguageAttribute("de" , UltimateResourceFallbackLocation.Satellite)]

L'istruzione contenuta nell'esempio indica alla classe ResourceManager che la ricerca del percorso di fallback finale delle risorse deve essere effettuata nella sottodirectory "de" della directory dell'assembly attualmente in esecuzione.

Alternativa suggerita per la creazione del package

A causa di limiti di tempo o di budget, può non essere fattibile creare un set di risorse per ciascuna lingua secondaria supportata dall'applicazione. In tal caso, è possibile creare un assembly satellite singolo per una lingua padre che verrà utilizzato anche per tutte le lingue secondarie correlate. È possibile fornire, ad esempio, un singolo assembly satellite inglese (en), che verrà recuperato dagli tutti gli utenti che richiedono risorse in inglese e un singolo assembly satellite tedesco (de) per tutti gli utenti che richiedono risorse in tedesco. In quest'ultimo caso, le richieste di risorse in tedesco della Germania (de-DE), tedesco dell'Austria (de-AT) e tedesco della Svizzera (de-CH) verrebbero tutte ricondotte all'unico assembly satellite tedesco (de). Selezionare con attenzione le risorse da compilare con l'assembly principale. Le risorse predefinite rappresentano il fallback finale e, pertanto, è possibile che siano le risorse che verranno richieste dalla maggioranza degli utenti dell'applicazione. Sebbene questa soluzione preveda la distribuzione di risorse meno specifiche in termini di lingua, essa consente di ridurre notevolmente i costi di localizzazione dell'applicazione.

Vedere anche

Concetti

Risorse nelle applicazioni
Global Assembly Cache
Creazione di assembly satellite