Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Siti multilingua con le Master Page

Come il ciclo di vita delle Master Page influenza le impostazioni per visualizzazioni multilingua
Come il ciclo di vita delle Master Page influenza le impostazioni per visualizzazioni multilingua
Link copiato negli appunti

In un precedente tutorial ci siamo occupati della localizzazione delle nostre pagine tramite i file di risorsa, speciali contenitori in cui memorizzare coppie di valori. Abbiamo poi visto diversi sistemi per accedere a questi file da ASP.NET realizzando una semplice pagina di esempio e implementando un meccanismo per cambiare la lingua della pagina a seconda della selezione dell'utente.

In questo articolo invece vediamo come modificare questo meccanismo per renderlo compatibile con le master page, particolari controlli di ASP.NET pensati per contenere elementi che con molta probabilità si ripeteranno su più pagine.

Master Page: un caso particolare

Nel tutorial avevamo utilizzato il seguente sistema per recuperare la lingua scelta dall'utente:

string culture = Request.Form["DropDownList1"];

La lingua viene estratta dalla collection Request.Form ed in particolare dal valore di un controllo DropDownList dichiarato come segue:

<asp:DropDownList ID="DropDownList1" runat="server">
  <asp:ListItem Value="default">Default</asp:ListItem>
  <asp:ListItem Value="it-IT">it-IT</asp:ListItem>
</asp:DropDownList>

Questo sistema si basa sul fatto che l'ID HTML del controllo, se posizionato direttamente all'interno della pagina, rimarrà DropDownList1. Se però proviamo ad aggiungere una master page ed a posizionare di conseguenza il menu a discesa all'interno di un controllo Content, l'ID risultante sarà qualcosa di simile a:

ctl00_ContentPlaceHolder1_DropDownList1

Visto che la chiamata alla funzione InitializeCulture, che si occupa di caricare la lingua per la pagina, viene effettuata molto prima che i controlli siano inizializzati non possiamo ricorrere neanche alla proprietà Control.ClientID che normalmente può essere utilizzata per accedere da codice all'ID HTML dei nostri controlli: é quindi necessario cambiare approccio per risolvere il problema.

La soluzione consiste nel cambiare la lingua all'interno dell'evento SelectedIndexChanged generato dal controllo DropDownList quando l'utente cambia la selezione:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
  string culture = DropDownList1.SelectedValue;

  Session["Culture"] = new CultureInfo(culture);
  Session["UICulture"] = new CultureInfo(culture);

  Server.Transfer(Request.Path);
}

Per prima cosa recuperiamo il valore selezionato dalla proprietà SelectedValue della DropDownList e poi salviamo l'oggetto Culture corrispondente in una variabile di sessione. Questo si rende necessario, come pure l'istruzione Server.Transfer successiva, a causa del ciclo di vita della pagina ASP.NET.

Come già detto la lingua della pagina può essere selezionata soltanto all'interno della funzione InitializeCulture che però viene invocata molto prima dell'evento SelectedIndexChanged. Tutte le funzioni associate agli eventi generati dai controlli vengono infatti richiamate dopo che la pagina è stata completamente inizializzata.

Salvando la lingua scelta nell'oggetto Session la rendiamo disponibile da una richiesta all'altra, per cui, quando la pagina verrà completamente ricaricata a causa dell'istruzione Server.Transfer, avremo comunque accesso alla lingua scelta che verrà correttamente applicata a tutti i controlli della pagina:

protected override void InitializeCulture()
{
  CultureInfo c;

  // Culture
  if (Session["Culture"] != null)
    c = (CultureInfo)Session["Culture"];
  else
    c = new CultureInfo("en-US");

  Thread.CurrentThread.CurrentCulture = c;


  // UI Culture
  if (Session["UICulture"] != null)
    c = (CultureInfo)Session["UICulture"];
  else
    c = new CultureInfo("en-US");

  Thread.CurrentThread.CurrentUICulture = c;

  base.InitializeCulture();
}
 

Invece dell'oggetto Session avremmo potuto utilizzare i cookie memorizzando così la scelta dell'utente anche per le visite successive.

Per far si che la DropDownList venga inizializzata con la lingua corrente selezionata basta aggiungere questo codice nell'evento OnLoad della master page:

protected override void OnLoad(EventArgs e)
{
  if (!Page.IsPostBack)
    DropDownList1.SelectedValue = Thread.CurrentThread.CurrentCulture.Name;
  
  base.OnLoad(e);
}

Ottimizzare il codice

Mentre il controllo DropDownList e il codice associato faranno parte della master page e non verranno quindi ripetute, la funzione InitializeCulture è propria unicamente dell'oggetto Page, da cui le nostre pagine ASP.NET devono forzatamente ereditare.

Per evitare tutti gli evidenti svantaggi derivanti dalla ripetizione del codice, creiamo una classe (che chiameremo PageBase) da cui fare ereditare tutte le nostre pagine:

using System.Globalization;
using System.Threading;
using System.Web.UI;

public class PageBase : Page
{
  protected override void InitializeCulture()
  {
    //  ..........
  }
}

Il code behind della pagina Default.aspx sarà quindi:

public partial class _Default : PageBase
{
  //  ..........
}

Conclusioni

Abbiamo visto come migliorare il sistema presentato nel precedente tutorial sui siti multilingua in modo da estendere il supporto anche alle master page. Per ulteriori informazioni sulla localizzazione delle pagine ASP.NET è consigliabile la lettura della sezione dedicata su MSDN.

Ti consigliamo anche