in effetti hai ragione, con i nuovi framework non mantiene la cultura, ho verificato...
si deve fare per tutte le richieste, in un evento (l'uno vale l'altro) del global in cui la sessione è visibile...(se vuoi usare la sessione per memorizzare la scelta dell'utente).
altrimenti ci sono le personalizzazioni che includono la lingua, ma e' tutto un altro mondo...
Ho fatto un esempio ora:
WEB.Config:
codice:
<system.web>
<globalization culture="en-US" uiCulture="en-US" />
....
GLOBAL.asax
codice:
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
if (System.Web.HttpContext.Current.Session != null)
{
if (HttpContext.Current.Session["selectedLanguage"] != null)
{
//
// Setta la lingua selezionata dall'utente (messa in sessione nella pagina di login)
//
string selectedLanguage = HttpContext.Current.Session["selectedLanguage"].ToString();
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
}
}
}
LOGIN.aspx
codice:
<form id="form1" runat="server">
<div>
<div style="background-color:blue; color: white; text-shadow:initial; text-align:center; vertical-align:central;">
<h1><span>Culture (Club)</span></h1>
<br />
Culture disponibili nel sistema:
<asp:DropDownList ID="ddlanguagesAvailable" runat="server"></asp:DropDownList>
<br />
<br />
</div>
<hr /><br />
Seleziona la cultura/linguaggio desiderato:
<asp:DropDownList Width="100px" ID="ddlanguages" runat="server"></asp:DropDownList> <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" />
</div>
</form>
LOGIN.aspx.cs
codice:
protected void Page_Load(object sender, EventArgs e)
{
string defaultLanguage = string.Empty;
// ---------------------------------------------------------------
// Tutte le lingue disponibili nel SO (per elencarle, per info)
// ---------------------------------------------------------------
CultureInfo[] cinfo = CultureInfo.GetCultures(CultureTypes.AllCultures); // & ~CultureTypes.NeutralCultures -- non associate
foreach (CultureInfo culture in cinfo)
ddlanguagesAvailable.Items.Add(new ListItem(culture.DisplayName + " " + culture.Name, culture.Name));
// -----------------------------------------------------------------------------------------------------------------------------
if (!IsPostBack)
{
// Inizialmente, è settata la Culture di configurazione, presente in Web.Config
// <system.web>
// <globalization culture = "en-US" uiCulture = "en-US" />
defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();
// Dropdown Init
//
ddlanguages.Items.Add(new ListItem("", ""));
ddlanguages.Items.Add(new ListItem("it-IT", "it-IT"));
ddlanguages.Items.Add(new ListItem("en-US", "en-US"));
ddlanguages.Items.Add(new ListItem("es-MX", "es-MX"));
}
else
{
if (ddlanguages.SelectedValue != String.Empty)
{
// Setta la lingua selezionata dall'utente
//
String selectedLanguage = ddlanguages.SelectedValue;
UICulture = selectedLanguage;
Culture = selectedLanguage;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
System.Web.HttpContext.Current.Session.Add("selectedLanguage", selectedLanguage.ToString());
}
else
{
// Lingua definita nel Web.Config
//
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(defaultLanguage);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(defaultLanguage);
}
}
}
protected void btnLogin_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
DEFAULT.aspx
codice:
<form id="form1" runat="server">
<div>
<h2><span id="sp_welcome" runat="server"></span></h2>
<br />
<asp:Button ID="btChangeCulture" OnClick="btChangeCulture_Click" Text="<%$ Resources:Resource, btChangeCultureText %>" runat="server" />
</div>
</form>
DEFAULT.aspx.cs
codice:
protected void Page_Load(object sender, EventArgs e)
{
// la cultura è settata nel global.asax, nell'evento <Application_PreRequestHandlerExecute>
sp_welcome.InnerText = Resources.Resource.lbl_welcome;
sp_welcome.InnerText += " " + Resources.Resource.lbl_today + " " + DateTime.Now;
}
protected void btChangeCulture_Click(object sender, EventArgs e)
{
Response.Redirect("Login.aspx");
}
...e nella cartella App_GlobalResources i files:
Resource.it-IT.resx
Resource.resx // ( quello di default)
Resource.es-MX.resx
con (all'interno) le label diversificate per lingua:
codice:
/.... omissis/
<data name="btChangeCultureText" xml:space="preserve">
<value>Cambiar idioma</value>
</data>
<data name="lbl_today" xml:space="preserve">
<value>Hoy es el</value>
</data>
<data name="lbl_welcome" xml:space="preserve">
<value>Bienvenida !</value>
</data>
</root>