articolo di Tiziana Loporchio
Introduzione
Molte aziende puntano, ormai da tempo, ai mercati internazionali; tale politica imprenditoriale spinge le stesse a non limitarsi alla sola presenza online con siti Corporate, ma a cercare di fidelizzare i propri clienti e conquistarsi la fiducia di altri, con la fornitura di servizi verso paesi con differenti lingue e culture.
Pur essendo questa una sentita e crescente necessità, stranamente i tool necessari ad una facile gestione della localizzazione delle applicazioni sono risultati assolutamente inefficienti ed onerosi tanto che, per realizzare applicazioni localizzate, si finisce spesso per tornare ai metodi “tradizionali”, decisamente meno gravosi ma che inducono lo sviluppatore all'implementazione di applicazioni ridondanti.
La nuova release di ASP.NET 2.0 promette di migliorare il nostro approccio alla localizzazione delle applicazioni e, a tale scopo, fornisce una nuova API specifica che, oltre a rendere più facile la scrittura di codice per l’accesso a risorse localizzate, sfrutta sistemi più veloci di separazione del contenuto localizzabile rispetto alle pagine web che lo utilizzano.
ASP.NET 2.0 Localization
ASP.NET 2.0, pur mantenendo alla base le caratteristiche introdotte in ASP.NET 1.x, fornisce nuovi tool per il supporto alla generazione di risorse localizzate utili all’applicazione web, nuovi costrutti dichiarativi e di runtime per l’accesso alle stesse, che migliorano ed assicurano il supporto alle nuove caratteristiche anche nei controlli ASP.NET.
Creare e gestire risorse, oggi, è infatti più agevole tramite il nuovo “Managed Resource Editor”, un tool capace di includere nel progetto disparate tipologie di risorse inserite in file .resx, file che contengono un insieme di coppie chiave-valore (da semplici stringhe a tipi complessi o, comunque, qualsiasi tipo di oggetto serializzabile), di cui si avvale l' applicazione web in relazione alla lingua selezionata.
Con la nuova release, finalmente, viene anche introdotto il sistema di “Resource Generation”, già conosciuto agli sviluppatori di Windows Forms, creato a supporto della rapida ed automatica internazionalizzazione delle risorse.
Rifacendosi, infine, proprio al modello di programmazione Windows Forms, ma diversificandosi grazie all’introduzione di requisiti specifici per il web, ASP.NET può oggi beneficiare di caratteristiche di programmazione che facilitano la gestione e l’utilizzo di risorse localizzate.
Local Resources generate automaticamente in ASP.NET 2.0
Il sistema di “Resource Generation” di ASP.NET 2.0 fornisce un semplice approccio alla generazione automatica delle risorse per elementi HTML, attributi dei tag, Server Controls e contenuto statico in Web Forms, User Controls e Master Pages.
La presenza obbligata dell’attributo “runat=server” nei tag, permetterà, per i controlli server side che espongono proprietà marcate come <Localizable(true)> di default, la conversione automatica in risorsa (“Local Resource”).
Le “Local Resources” sono automaticamente generate basandosi, infatti, proprio sulle proprietà localizzabili esposte da elementi server side della pagina.
Per creare le risorse locali è sufficiente selezionare la pagina web (.aspx), la master page (.master) o lo user control (.ascx) in Design Mode, e cliccare nell’ area di Menù Tools di Visual Studio 2005 la voce ”Generate Local Resource” come nella (figura 1.)

figura 1. Area di Menù "Generate Local Resource" (se non presente in elenco aggiungerla dal menù Customize…)
La cartella dedicata "\App_LocalResources" del progetto ASP.NET, a questo punto, presenterà un set di file XML (.resx) (figura 2.) e verranno aggiunte, nella dichiarazione dei singoli controlli, delle espressioni dichiarative implicite che ci permettono di non scrivere alcun codice aggiuntivo per applicare le risorse localizzate ai server controls come nell’esempio di codice seguente :
<asp:LinkButton id="lnkSelectCulture" PostBackUrl="selectculture.aspx" runat="server"
Text="Language Preference" meta:resourcekey="lnkSelectCultureResource1" >
</asp:LinkButton>

figura 2. File di risorse locali autogenerato per lo user control CultureInfo.ascx
Tutte le proprietà del controllo con attributo <Localizable(true)>, inoltre, sono facilmente riconoscibili tramite una icona rossa presente nella finestra delle proprietà (figura 3.).

figura 3. La proprietà Text distinta da un icona di Localizzazione
Per quelle proprietà, invece, che non implementano la possibilità di essere automaticamente localizzate, esiste la possibilità di associare espressioni esplicite di localizzazione in maniera dichiarativa.
L’Espression dialog box (figura 4.), infatti, in maniera visuale ed intuitiva permette di eseguire il mapping delle risorse disponibili alle proprietà e automaticamente di generare espressioni esplicite di localizzazione come nell’esempio che segue:
<asp:Image ID="Image1" runat="server" AlternateText="<%$ Resources:l1Resource1.Text %>" />
figura 4.Expression Dialog Box
L’automatismo nella creazione di risorse fatto su ogni pagina però, può portare alla duplicazione di termini già tradotti in altre pagine con sforzi ed inutili perdite di tempo e difficoltà di aggiornamento.
L’uso di Master Pages, di controlli che condividono intestazioni, di menù ed altre sezioni HTML con le altre pagine, pur permettendo un implicito riuso ed una riduzione della duplicazione delle risorse, non risolvono il problema.
Pensiamo, infatti, alla necessità di gestire tutti i messaggi d’errore nelle diverse lingue, alla volontà di concentrare le risorse in maniera globale per riutilizzarle in altre applicazioni.
La metodologia che utilizza risorse locali, fino ad ora analizzata, inizia ad essere laboriosa e controindicata.
Vengono in aiuto a tal proposito le “Global Resourses” già presenti in precedenza, ma che oggi, nella versione 2.0 di ASP.NET, beneficiano di nuove caratteristiche.
Le Global Resources in ASP.NET 2.0
Anche se costretti alla creazione manuale dei file di risorse globali, un nuovo “Managed Resource Editor” (figura 5.) sulla scia di Windows Forms, facilita la creazione e la gestione delle risorse localizzate.
Beneficio maggiore, nell’utilizzo delle risorse globali, è la compilazione in una classe tipizzata che permette il facile accesso da codice, tramite l’Intellisense, direttamente richiamando l’oggetto Resources.
Ipotizzando, infatti, la presenza di un file di risorse localizzate di nome “Flags.resx”, le stesse sono accessibili a runtime scrivendo semplicemente Resources.Flags.Canada piuttosto che Resources.Flags.Spain.
In tal modo, e diversamente dalle precedenti versioni di asp.net, allo sviluppatore è notevolmente facilitata la gestione del lifecycle dell’accesso alle risorse a runtime, grazie soprattutto all’istanza automatica e all’inserimento nella cache della classe ResourceManager.
figura 5. Managed Resource Editor con le differenti tipologie di risorse gestibili
L’uso visuale dell’Espression dialog box già visto in precedenza per Local Resources è altresì disponibile per l’associazione alle proprietà di “Global resources” (figura 6) richiamando, questa volta, la classe tipizzata.
L’impostazione della proprietà ClassKey genererà espressioni esplicite di localizzazione, come nell’esempio che segue:
<asp:Image ID="Image2" runat="server"
AlternateText="<%$ Resources:Glossary, CompanyName %>" ImageUrl="…" />
figura 6. Expression Dialog Box e ClassKey
Come impostare le differenti Cultures
Create le risorse localizzate necessarie, esistono due differenti approcci per selezionare la lingua corrente nell’applicazione web.
Il primo approccio prevede la sola configurazione dichiarativa del web.config, tramite il tag xml <globalization>, dove viene specificata la Culture e la UI Culture corrente, utilizzata dal thread del runtime per la richiesta delle relative risorse come nell’esempio che segue:
<globalization culture=”auto:it-IT” uiCulture=”auto:it”>
Nota : Nell’esempio viene utilizzato il nuovo valore “auto” che imposta la lingua corrente basandosi sull’eventuale valore ACCEPT_LANG passato negli HTTP Headers o in caso contrario l’Italiano.
Il secondo approccio, invece, prevede l’utilizzo di codice che sostituisca il valore automatico settato a runtime con quello desiderato, utilizzando la classe CultureInfo (System.Globalization).
Verranno quindi gestite le informazioni su una lingua specifica, impostandola a runtime, al fine di individuare le risorse relative alla lingua scelta. Questo approccio viene scelto, per esempio, quando si desidera permettere la selezione della lingua tramite una lista di selezione a discesa nel sito o associarla ad un profilo utente. Di seguito un esempio di codice per l’impostazione a runtime dell’italiano:
[C# code]
CultureInfo ci = new CultureInfo(“it-IT”);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Conclusioni
Queste nuove caratteristiche di localizzazione di ASP.NET 2.0 rendono più semplice la definizione di una strategia di localizzazione dell’applicazione, grazie all’introduzione di nuovi tool, nuove espressioni dichiarative ed un nuovo e flessibile modello di runtime.
Definire una nuova strategia di localizzazione per la creazione di applicazioni web, renderà possibile pertanto la riduzione, rispetto al passato, di costi e sforzi di sviluppo con l’apertura anche a scenari di personalizzazione, come potremo vedere nel prossimo articolo.