Versione per la stampa       Invia     
Valuta il contenuto e lascia un commento
MSDN
MSDN Library
Articoli tecnici
Sviluppo Web
ASP.NET
 Applicazioni multi lingua nel mondo...
Applicazioni multi lingua nel mondo Web

Di Andrea Zocca

In questa pagina

Introduzione Introduzione
Descrizione dei concetti di internazionalizzazione Descrizione dei concetti di internazionalizzazione
Definizione delle culture Definizione delle culture
Binding tra risorse e pagine web Binding tra risorse e pagine web
Uso degli Oggetti Resource Manager e CultureInfo Uso degli Oggetti Resource Manager e CultureInfo
Resource Manager Resource Manager
Creazione di culture personalizzate Creazione di culture personalizzate
Conclusioni Conclusioni

Introduzione

Lo sviluppo di un’applicazione web richiede, sempre più frequentemente, di potere essere utilizzata da una moltitudine di utenti di lingue e culture diverse.

La soluzione a questa esigenza è di consentire a questi utenti di poter scegliere la lingua con cui desiderano navigare le pagine dell’applicazione stessa.

In queste brevi note verranno descritte le problematiche e le possibili soluzioni per la gestione dell’internazionalizzazione delle applicazioni web con l’uso di Microsoft .NET Framework 2.0 e con Microsoft Visual Studio 2005.

Descrizione dei concetti di internazionalizzazione

Descriviamo innanzi tutti i concetti da tenere presente nello sviluppo di un’applicazione multi lingua:La già citata Internazionalizzazione si compone di 3 processi di sviluppo (Figura 1):

  1. La Globalizzazione: è il processo mediante il quale vengono eliminati dal codice sorgente i preconcetti culturali quali il formato della data, la formattazione dei numeri, la visualizzazione di immagini raffiguranti elementi tipici di un determinato paese (autobus, cassette della posta, ecc.).

  2. La Localizzazione: è il processo di adattamento di un’applicazione per permetterle di poter cambiare dinamicamente le risorse presenti nelle pagine: principalmente stringhe ma anche file di testo, immagini, file audio e ogni altro tipo di contenuto inseribile in una pagina web.
    Quindi codice del tipo:

    lblMessaggio.Text = “Ciao Mondo!”

    deve essere riscritto in modo che la stringa “Ciao Mondo!” non sia statica, ma possa variare in modalità runtime secondo la lingua scelta dall’utente.

  3. La Personalizzazione: è il processo di adattamento dell’applicazione alle funzionalità specifiche di una cultura: ad esempio, nel calcolo dell’IVA per un importo bisogna prevedere che ogni nazione ha una percentuale diversa oltre che un nome diverso per questo tipo di imposta.

Definizione delle culture

In .NET Framework, le culture sono i blocchi presenti nel framework che determinano la formattazione di date e numeri.

Esse sono presenti nella classe System.Globalization.CultureInfoe sono rappresentate da stringhe che identificano la lingua e la regione di appartenenza.

Ecco alcuni esempi di stringhe di culture:

  • “it-IT”: identifica la cultura italiana

  • “it-CH”: identifica la cultura italiana per la Svizzera.

  • “en-US”: identifica la cultura inglese per gli Stati Uniti

  • “en-GB”: identifica la cultura inglese per la Gran Bretagna

  • “en”: identifica la cultura inglese senza specificare una regione

Esistono tre modi di rappresentare una cultura

  1. Modalità invariante: la stringa di rappresentazione è vuota e quindi non viene specificata né la lingua né la regione.

  2. Modalità neutrale (es “en”, “fr”,...): in questo caso viene rappresenta la lingua ma non viene. specificata alcuna regione

  3. Modalità specifica (es “it-IT”): in questo caso vengono specificate sia la lingua che la regione.

Binding tra risorse e pagine web

Mostriamo ora come creare una pagina globalizzata che in base alla cultura del server rileva automaticamente il suo contenuto.

La soluzione è quella di utilizzare i file di risorse (file .resx) gestiti da Microsoft .NET Framework 2.0 e da Microsoft Visual Studio 2005.

Partendo dalla pagina Default.aspx di un’applicazione web, inseriamo nella stessa un controllo di tipo Label avente ID lblMessaggio.

Dalla visualizzazione della pagina in modalità “Design”, cliccare sul “Tools” e poi su “Generate Local Resource”.

Verrà creata una cartella App_LocalResource con all’interno la risorsa di default della pagina, nella cartella delle LocalResources avremo ora il file Default.aspx.resx contenente i valori di tutti i controlli contenuti nella pagina: lblMessaggioResource1.Text, lblMessaggioResource1.ToolTipe PageResource1.Title.

Duplichiamo nella cartella App_LocalResource il file appena creato e rinominiamolo in Default.aspx.en-US.resx.

Inseriamo i valori “Ciao Mondo!” e “Hello World!” per gli elementi lblMessaggioResource1.Text di entrambi i file.

Se esaminiamo la Default.aspx noteremo che Visual Studio ha cambiato il codice sorgente nella seguente maniera:

<asp:Label ID="lblMessaggio" runat="server"meta:resourcekey="lblMessaggioResource1" ></asp:Label>

Questo metodo si chiama Localizzazione Statica e consiste nell’inserimento automatico dell’attributo “meta:resourcekey="...” per ogni controllo presente sulla pagina. Tali attributi sono degli shortcut verso le risorse collegate alla pagina.

Notiamo come nel file .resx siano stati inseriti questi collegamenti solo sulle proprietà dell’oggetto che hanno impatti nel processo di localizzazione (Text e Tooltip).

E’ anche possibile collegare la pagina alla propria risorsa locale attraverso una Localizzazione implicita:

<asp:Label ID="lblMessaggio" runat="server" BackColor=”<%$ resources:lblBackColor%>”></asp:Label>

Nell’esempio precedente l’attributo BackColor viene riempito col valore presente nell’elemento lblBackColor della risorsa locale.

Un’ulteriore possibilità è quella di definire delle risorse che siano visibili da tutte le pagine, in questo caso, da Microsoft Visual Studio 2005, cliccando il tasto destro sulla solution e selezionando “Add New Item...” e “Resource File” (Figura 2) è possibile inserire un file di risorse specificandone il nome.

Il file generato verrà inserito in una cartella denominata App_GlobalResources.

Questi tipi di file sono particolarmente utili, ad esempio, per contenere messaggi d’errore che in genere vengono riutilizzati in più pagine dell’applicazione.

Gli elementi inseriti nelle risorse globali devono essere collegati in maniera esplicita ai controlli di una pagina.

L’espressione di binding esplicito che va inserita come valore dell’attributo di un controllo della pagina è la seguente: <%$ Resources:<nome classe risorsa>, <nome dell’elemento> %> . Di seguito viene presentato il codice di esempio che cambia l’attributo BackColor di una Label prendendo il valore dalla risorsa globale “Styles”

<asp:Label ID="lblMessaggio" runat="server" BackColor=”<%$ Resources:Styles, lblBackColor%>”></asp:Label>

Se necessario i file .resx possono essere compilati esternamente da Microsoft Visual Studio 2005 usando il tool del .NET Framework resgen.exe.

Compilando il file risorsa con questa modalità viene generato un file binario (con estensione .resources) e un file di testo (.restext) su cui vengono riassunte le risorse contenute nel file binario.

Uso degli Oggetti Resource Manager e CultureInfo

In .NET Framework 2.0 gli oggetti principali che consentono l’implementazione di applicazioni multi lingua sono:

  • ResourceManager contenuto nella classe System.Resources.ResourceManager, che consente di accedere alle risorse (stringhe, immagini, ecc.) definite per una lingua.

  • CultureInfo contenuto nella classe System.Globalization.CultureInfo, che contiene informazioni e metodi correlati con una cultura

CultureInfo

Le due proprietà che determinano la lingua usata in un’applicazione sono: CurrentCulture e CurrentUICulture. Entrambe queste proprietà possono essere lette dall’oggetto CultureInfo ma possono essere modificate solo con l’uso dell’oggetto Thread.

Per poter usare l’oggetto CultureInfo, nel codice della pagina sarà necessario l’uso delle seguenti direttive:

using System.Globalization;

using System.Threading;

Le seguenti righe forniscono lo stesso risultato:

Response.Write(Thread.CurrentThread.CurrentCulture.DisplayName);

Response.Write(CultureInfo.CurrentCulture.DisplayName);

Response.Write(Thread.CurrentThread.CurrentUICulture.DisplayName);

Response.Write(CultureInfo.CurrentUICulture.DisplayName);

La proprietà CurrentCulture contiene la stringa che rappresenta la cultura di default per tutte le classi del namespace System.Globalization ed è la cultura che viene impostata dal menu “Regional Options” del pannello di controllo di Windows.

Essa è sempre rappresentata in modalità specifica, in fase di assegnazione non saranno quindi accettate culture espresse in altro formato.

Questa necessità è data dal fatto che il valore della CurrentCulture impatta sul formato di rappresentazione di date, numeri, ecc., e quindi non è sufficiente inserire solo la lingua ma è necessario specificare la regione di riferimento (se consideriamo, ad esempio, il formato della data, “en-GB” e “en-US” hanno due rappresentazioni diverse e quindi non è sufficiente assegnare alla CurrentCulture il valore “en”).

La proprietà CurrentUICulture rappresenta la cultura di default usata dai metodi del ResourceManager per la gestione dei contenuti delle pagine.

Tale proprietà determina, quindi, la lingua usata dal sistema operativo e non può essere cambiata dall’utente a meno che non sia installato sul PC il Multi User Interface Pack (MUI).

I valori ammessi dalla proprietà CurrentUICulture sono le culture di tipo neutrale (“it”), specifico (“it-IT”) e invariante (“”).

Dovendo quindi rendere multi lingua un’applicazione web avremo bisogno di inserire nella home page del nostro sito dei controlli che permettano all’utente di scegliere la lingua dei contenuti delle pagine (ad esempio attraverso dei radio button o dei link button), tale azione sarà gestita nel codice dell’evento che gestisce il click di scelta, dalla seguente istruzione:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr");

Tale linea di codice crea una nuova cultura di tipo neutrale e la assegna alla proprietà CurrentUICulture del thread corrente, in questo specifico esempio la cultura di riferimento del Resource Manager sarà la lingua francese.

È possibile anche reimpostare il valore della CurrentCulture:

Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT");

Un caso particolare che vale la pena analizzare è dato dal seguente codice:

Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

In questo caso il Resource Manager userà le risorse dell’assembly principale ignorando gli assembly satellite.

I concetti di assembly principale e satellite verranno spiegati nel paragrafo successivo

Resource Manager

La classe Resource Manager, come già detto, viene usata per la gestione delle risorse.

Tale gestione prevede un meccanismo per il reperimento della cultura più appropriata nel caso le risorse di una cultura non siano disponibili, tale operazione prende il nome di “processo di fallback”.

Grazie a questo processo, se alla proprietà CurrentUICulture è stata assegnata una specifica cultura (“en-US”) le cui risorse non siano disponibili, il Resource Manager ricercherà tali risorse in una cultura più generica (“en”).

Se non dovessero essere ancora disponibili verrà ulteriormente aumentato il grado di genericità della cultura e quindi la ricerca verrà fatta nelle file di risorse relativo alla cultura invariante. Tutto ciò ha il vantaggio di non dover replicare le risorse ma definire negli assembly “figli” solo le differenze rispetto al “padre”.

Consideriamo, ad esempio, la pagina default.aspx, contenente la label lblMessaggio, supponiamo di avere già creato un file di risorse globale messaggi.resx; creiamo ora un altro file di risorse messaggi.it.resx destinato a contenere le risorse relative alla lingua italiana.

Creiamo in entrambi i file una stringa avente nome “Test” con valore “Welcome” nel file messaggi.resx e “Benvenuto in Italia” nel file messaggi.it.resx.

Creiamo ora un terzo file di risorse (messaggi.en-GB.resx) dove per la risorsa “Test” inseriremo il valore “Welcome in UK”.

Proviamo ad assegnare alla CurrentUICulture valori diversi e vediamo quale effetto produce il metodo ResourceManager.GetString applicato alla proprietà lblMessaggio.Text:

  • Se, alla CurrentUICulture, viene assegnato il valore “en-GB”, sarà visualizzato il messaggio “Welcome in UK” in quanto esiste un assembly previsto per tale cultura

  • Se il valore della cultura è “it-IT”, il resource manager non troverà una risorsa per questa cultura e quindi la cercherà nel file di risorse relativo alla cultura padre: “it”. Quindi, in questo caso, il risultato della ricerca produrrà il valore: “Benvenuto in Italia”.

  • Se il valore della cultura è “en-US”, il resource manager ricercherà le risorse nell’assembly messaggi.en-US, e, non trovandolo, lo ricercherà nell’assembly relativo alla cultura padre (messaggi.en), a questo punto, non trovandolo nemmeno qui, questo sarà cercato nell’assembly relativo alla cultura invariante (messaggi).

  • La proprietà text della label avrà quindi valore “Welcome”.

Creazione di culture personalizzate

.NET Framework 2.0 ha introdotto una funzionalità importante nell’ambito dell’internazionalizzazione delle applicazioni: la creazione di culture personalizzate.

Una cultura personalizzata è una cultura non definita da Microsoft ma creata dallo sviluppatore.

Una volta creata, questa nuova cultura sarà trattata dal Framework come tutte le altre culture predefinite.

Dato il continuo mescolarsi di varie culture all’interno della nostra società, lo sviluppo di applicazioni web rivolte ad una specifica nazione deve tener conto di questo fenomeno ed è da questo che nasce l’esigenza di dare la possibilità al programmatore di poter creare nuove culture destinate a queste “minoranze” etniche di numero sempre più consistente (ad esempio la massiccia presenza di persone di cultura ispanica in alcune zone degli Stati Uniti richiede applicazioni aventi una cultura di tipo “es-US”).

La creazione di una nuova cultura con .NET Framework 2.0 è possibile mediante l’uso della classe CultureAndRegionalInfoBuilder.

Supponiamo, ad esempio, di dovere modificare la cultura italiana, cambiando il formato della data da “gg/mm/aa” a “aa/mm/gg” il codice che genera questo risultato è il seguente:

CultureAndRegionInfoBuilder cri =new CultureAndRegionInfoBuilder(“it-IT”,CultureAndRegionModifiers.Replacement);

cri.GregorianDateTimeFormat.ShortDatePattern = “yy/mm/dd”;

cri.Register();

Il costruttore della classe CultureAndRegionInfoBuilder accetta 2 parametri: la stringa rappresentante la cultura e l’enumeratore che identifica il tipo di cultura personalizzata.

Una volta registrata la modifica mediante il comando Register, sul PC verrà sempre usata la cultura “it-IT” modificata anziché quella originale.

Supponiamo invece di dover creare una nuova cultura clonandone una esistente e variando alcune proprietà:

CultureAndRegionInfoBuilder cri = null;

cri = new CultureAndRegionInfoBuilder("mio-it-IT",CultureAndRegionModifiers.None);

CultureInfo ci = new CultureInfo("it-IT");

cri.LoadDataFromCultureInfo(ci);

RegionInfo ri = new RegionInfo("IT");

cri.LoadDataFromRegionInfo(ri);

cri.RegionEnglishName = "Italy (test)";

cri.RegionNativeName = "Italia (test)";

cri.NumberFormat.CurrencySymbol = "E";

cri.Register();

cri.Save(“mio-it-IT.ldml”);

Nell’esempio precedente, è stata clonata la cultura “it-IT”, ed è stato cambiato il nome della regione e il simbolo della valuta. La nuova cultura oltre che essere registrata è salvata su file (cib.Save()). In questo modo è facilmente esportabile su altri PC, senza dove eseguire il codice di creazione.

Deregistrare una cultura è possibile mediante la seguente riga di codice:

CultureAndRegionInfoBuilder.Unregister(“mio-it-IT”);

Conclusioni

Nei paragrafi precedenti abbiamo visto come, con .NET Framework 2.0 e con Visual Studio 2005, è facile rendere multi lingua le proprie applicazioni web:

  • Si deve creare i file di risorse adatti a memorizzare i contenuti delle pagine dell’applicazione;

  • Collegare il contenuto di questi file di risorse alle pagine in maniera automatica;

  • Cambiare la lingua di riferimento in modalità runtime;

  • Gestire le risorse comuni a tutte le pagine mediante l’uso dell’oggetto resource manager.


© 2009 Microsoft Corporation. Tutti i diritti riservati. Condizioni per l'utilizzo | Marchi | Informativa sulla privacy
Page view tracker