12 messaggi dal 23 aprile 2008
Ciao a tutti
Ho trovato un piccolo problema in un mio progetto in fase di traduzione delle pagine.

Ho una pagina chiamata masterpage.master al cui interno ce ne sta un'altra chiamata defaults.aspx.
Nella master page ho 2 bottoni per impostare la lingua (italiano e inglese) e, sia per la master page sia per la default.aspx ho creato delle i file resx relativi alle due lingue (rispettivamente masterpage.master.it.resx e masterpage.master.en.resx per la masterpage, e defaults.it.resx e defaults.en.resx per la pagina figlio ).

al click sul bottone eseguo questo codice nella masterpage

protected void ImageButton5_Click(object sender, ImageClickEventArgs e)
{
string Lang = "en";
LoadTranslatetdPage(Lang);
}

private void LoadTranslatetdPage(string Lang)
{
Session.Add("Lang", Lang);
Response.Redirect(Request.Url.ToString());
}

Mentre al Page_Init eseguo questo codice

protected void Page_Init(object sender, EventArgs e)
{
if (Session["Lang"] != null)
{
Page.UICulture = Session["Lang"].ToString();
}
else
{
Page.UICulture = "auto";
}
}

Il risultato è che la pagina master viene correttamente tradotta mentre la figlia no.
Ho dato un occhiata in giro e ho scoperto che:
1) La pagina figlia viene caricata prima della master
2) non eredita le impostazioni della culture.

E' possibile fare in modo che la pagina figlia erediti la UICulture dalla masterpage senza andare a scrivere del codice nella Defaults.aspx?
Grazie per l'eventuale aiuto

Matteo
652 messaggi dal 21 gennaio 2007
Contributi
Per modificare la culture di una pagina aspx devi effettuare l'overload del metodo InitializeCulture(). Al suo interno puoi prelevare dalla sessione il valore della lingua precedentemente impostato e modificare la culture del web corrente.

protected override void InitializeCulture()
{
string lang = String.Format("{0}", Session["Lang"]);
if(!String.IsNullOrEmpty(lang))
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
}

Leggiti questo:
http://www.peppedotnet.it/Articoli/Localization.aspx
12 messaggi dal 23 aprile 2008
Si avevo letto anche di quello ma, visto che dovrò fare ben più di una pagina figlia, volevo evitare di dover andare a scrivere nel codice di ciascuna l'verride.

Ho trovato la soluzione invece andando a lavora sul global.asax in particolare definendo quanto segue

void Application_PreRequestHandlerExecute (object sender, EventArgs e)
{
if (Context.Session != null && Context.Session["Lang"] != null)
{
String selectedLanguage = Context.Session["Lang"].ToString().ToLower();
String currentLanguage = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName.ToLower();
if (!currentLanguage.Equals(selectedLanguage))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
}
}
}


E così facendo funziona tutto a meraviglia.
il codice originale lo trovate su:
http://www.codeproject.com/KB/locale/MasterPage_Localization.aspx

guardate nei commenti di famous

Grazie cmq del supporto.
652 messaggi dal 21 gennaio 2007
Contributi
Per evitare di dover sovrascrivere quel metodo in tutte le tue pagine figlie, basta che crei una classe che eredita da Page, fai l'overload del metodo InitializeCulture e poi tutte le pagine le fai ereditare dalla tua classe al posto che da page.
note al margine


quando dici:


1) La pagina figlia viene caricata prima della master


questo accade perche la Master è un UserControl (eredita da tale classe) ed è in realtà contenuta all'interno della pagina e non viceversa.

per il resto il consiglio di Peppe è validissimo

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
12 messaggi dal 23 aprile 2008
Grazie mille dei consigli sto implememtando la solution vi farò sapere al più presto se tutto è andato a buon fine ;-)
12 messaggi dal 23 aprile 2008
Ok tutto a posto funziona correttamente.
Grazie del supporto ;-)

Matteo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.