Creare siti web multilingua con le Master Page
Vediamo come utilizzare i controlli Master Page di ASP.NET per creare pagine in varie lingue.
Nello sviluppo dei siti web, può capitarci di dover affrontare il discorso del multilingua. Ovvero creare le stesse pagine non solo in italiano ma anche in altri linguaggi. Una delle novità introdotte da ASP.NET 2.0 è la possibilità di usare le Master Page, controlli realizzati allo scopo di contenere elementi che con molta probabilità si ripeteranno su più pagine. L'inizializzazione della lingua della pagina avviene nel metodo InitializeCulture che viene eseguito prima che i controlli siano inizializzati. Infatti tutte le funzioni associate agli eventi generati dai controlli vengono richiamate dopo che la pagina è stata completamente inizializzata. Per la selezione della lingua utilizziamo un menù a tendina (DropDownList).
<form id="form1" runat="server"> <div><asp:DropDownList ID="ddlLingue" runat="server" AutoPostBack="True" OnSelectedIndexChanged=" ddlLingue_SelectedIndexChanged"> <asp:ListItem Value="it-IT">Italiano</asp:ListItem> <asp:ListItem Value="en-US">English</asp:ListItem> <asp:ListItem Value="fr-FR">Francais</asp:ListItem> </asp:DropDownList> <asp:ContentPlaceHolder ID="mph" runat="server"/> </div></form>
Salviamo il linguaggio selezionato in un oggetto Cookie in modo da renderlo disponibile da una richiesta all'altra e venire correttamente applicato a tutti i controlli della pagina:
protected override void InitializeCulture() { HttpCookie cultureCookie = Request.Cookies["Culture"]; string cultureCode = (cultureCookie != null) ? cultureCookie.Value : null; if (!string.IsNullOrEmpty(cultureCode)){ this.UICulture = cultureCode; this.Culture = cultureCode; CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureCode); System.Threading.Thread.CurrentThread.CurrentCulture = culture; System.Threading.Thread.CurrentThread.CurrentUICulture = culture;} base.InitializeCulture(); }
Il controllo DropDownList e il codice ad esso associato fanno parte della Master Page e non verranno ripetuti, mentre la funzione InitializeCulture è unicamente dell'oggetto Page ed il cui codice andrebbe ripetuto per ogni pagina. Lo svantaggio di ripetere il codice, può essere risolto creando una classe che chiamiamo BaseIniziale da cui fare ereditare tutte le nostre pagine:
public class BaseIniziale : System.Web.UI.Page { protected override void InitializeCulture() {… } }
Dal momento che la chiamata alla funzione InitializeCulture viene effettuata prima che i controlli siano inizializzati, ciò comporta che la scelta del linguaggio non potrà essere applicata immediatamente ma si richiede da parte del visitatore un aggiornamento della pagina stessa. Per automatizzare il tutto ragioniamo nel seguente modo: nell’evento SelectedIndexChanged memorizziamo la “Culture” nell’oggetto Cookie e subito dopo effettuiamo un aggiornamento della pagina tramite un Response.Redirect.
protected void ddlLingue_SelectedIndexChanged(object sender, EventArgs e) { //Salvo il CULTURE in un cookieResponse.Cookies.Add(new HttpCookie("Culture", ddlLingue.SelectedValue)); //Reload della pagina Response.Redirect(Request.Url.AbsolutePath); }
Infine, impostiamo la proprietà SelectedValue della DropDownList al linguaggio scelto, nell’evento Page_Load della Master Page in modo che il visitatore, navigando tra le varie pagine, sappia sempre qual è il linguaggio che ha selezionato.
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { HttpCookie cultureCookie = Request.Cookies["Culture"]; string cultureCode = (cultureCookie != null) ? cultureCookie.Value : null; if (!string.IsNullOrEmpty(cultureCode)) { ddlLingue.SelectedValue = cultureCode; } } }
Nel nostro esempio abbiamo fatto ricorso ai cookie ma potevamo utilizzare l’oggetto Session per contenere il linguaggio scelto. Il vantaggio di avere adoperato i cookie ci ha permesso di memorizzare e mantenere la selezione fatta dal visitatore anche per future visite dello stesso al medesimo sito.
- Articolo precedente Caching con ASP.NET
- Articolo successivo Immagini Random con ASP.NET per rotazione banner, vetrina prodotti, fotogallery