Questo articolo è tratto dal capitolo 18 (Localizzazione e globalizzazione di applicazioni web) del libro ASP.NET 2.0 per tutti di Daniele Bochicchio, Cristian Civera, Riccardo Golia e Stefano Mostarda.
Acquista la tua copia col 10% di sconto!
L'articolo è la continuazione della prima parte pubblicata il 5 dicembre 2006.
Localizzazione dei controlli
Di default, i controlli HTML non sono localizzabili a meno che non vengano dichiarati come controlli server inserendo l'attributo runat="server". In questo caso, essi possono essere internazionalizzati come qualunque altro controllo server ASP.NET.
La direttiva @Page nell'HTML contiene alcune proprietà che possono essere localizzabili come Title e Theme. Anche qui si può ricorrere alla sintassi sia implicita, tramite risorse locali, che esplicita, tramite risorse globali, come per qualunque altro controllo.
<%@ Page ... meta:resourcekey="Page" %> <%@ Page ... title="<%$Resources: PrimaryRes, Titolo %>" %>
Come si è avuto modo di vedere nel corso del capitolo 8, il provider di default di ASP.NET per la generazione di menu prevede l'inserimento delle voci all'interno del file web.sitemap. L'utilizzo di questo file da parte di un controllo di navigazione, sia esso un Menu o una Treeview, prevede la creazione di un oggetto datasource collegato al file. Questo significa che non è il controllo a dover essere localizzato, dal momento che di fatto non contiene dati, ma la sorgente che deve già essere tradotta. Per questo motivo è stata inserita la possibilità di internazionalizzare le voci di menu direttamente dal file web.sitemap.
Per prima cosa si deve impostare la proprietà enableLocalization a true nel nodo root del file. Successivamente, ogni nodo può essere localizzato tramite la proprietà resourceKey, che ha il medesimo funzionamento dell'attributo meta:resourcekey per i controlli, oppure sfruttando le risorse globali utilizzando la stessa sintassi vista per i controlli, con la sola differenza che non si utilizzano i simboli per i blocchi di codice server <% %>.
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true"> <siteMapNode url="http://books.aspitalia.com/ASP.NET-2.0/" title="" description=""> <siteMapNode url="http://www.aspitalia.com" title="ASPItalia.com Web Site" description="" resourceKey="ASPITALIA" /> <siteMapNode url="http://www.microsoft.com/net" title="$Resources: PublicRes, NETWEBSITE" description="" /> </siteMapNode> </siteMap>
Nell'esempio 18.8 sono utilizzati entrambi i meccanismi per localizzare i dati. Il nodo con il link ad ASPItalia.com prende i dati localmente, mentre quello successivo sfrutta le risorse globali.
Quando si crea un'applicazione che non necessità di traduzioni, le etichette vengono inserite direttamente nell'HTML come testo statico. Diversamente si deve utilizzare un controllo server che possa essere localizzato all'occorrenza.
Ricorrere ad un controllo Label non è spesso la soluzione ideale, in quanto esso presenta molte proprietà che spesso non servono. In questi casi il Literal può rappresentare una scelta migliore. Tuttavia, dato che questo controllo non può essere modificato in fase di design-time visuale, è stata introdotta una nuova versione derivata da Literal che non aggiunge proprietà o metodi al tipo base, ma semplicemente ne modifica il comportamento a design-time: si tratta del controllo Localize.
<asp:localize id="loc" runat="server" Text="<%$Resources: PrimaryRes, Chiave%>" />
Selezione della cultura
Sin dalla prima versione di ASP.NET si è potuta configurare l'applicazione per fare in modo che i thread che eseguono le richieste rispecchiassero una specifica cultura.
<system.web> <globalization uiCulture="it"> </system.web>
In questo modo, i file di risorse che vengono presi in considerazione sono quelli in italiano poichè il motore di ASP.NET utilizza l'attributo uiCulture per selezionare il file corretto (esempio 18.10). Tuttavia, se l'utente decide di visualizzare il sito in un'altra lingua, bisogna ricorrere al codice per impostare la corretta cultura del thread.
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("en")
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.