59 messaggi dal 22 giugno 2001
Ciao a tutti,

Scenario:

Applicazione ASP.NET 4 che utilizza dei file di risorse per la localizzazione. Su App_GlobalResources ho alcuni file nelle varie versioni, es.

Menu.resx (en = fallback)
Menu.it.resx

La lingua viene scelta tramite DDL al Login e la scelta viene memorizzata su un cookie.

Su global.asax ho poi il codice seguente:

Protected Sub Application_BeginRequest(sender As Object, e As EventArgs)
Dim uiCulture As HttpCookie = Request.Cookies("UICulture")
If Not (uiCulture Is Nothing) AndAlso uiCulture.Value <> "" Then
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(uiCulture.Value)
End If
End Sub

che mi consente di impostare la "uiCulture" per la richiesta corrente.

Fino a qui tutto OK, l'applicazione viene visualizzata nella lingua scelta senza nessun problema.

Questa applicazione utilizza una libreria di classi, per tutta una serie di funzionalità aggiuntive che richiedono, tra l'altro, l'inoltro di testi nella lingua scelta dall'utente.

Nella libreria ho quindi creato una cartella Resources ed aggiunto dei file nel formato:

risorsa.resx
risorsa.it.resx

Nelle proprietà dei file di risorsa ho selezionato "Risorsa incorporata" come azione di compilazione.

Accedo al codice utilizzando Resources.NomeFile.NomePlaceHolder e riesco ad ottenere senza problemi la risorsa.

Il problema:

Ho avuto modo di notare che la cultura non cambia nel momento in cui viene scelta dall'utente, ma dopo che la sessione è scaduta. Es. passo dalla versione italiana a quella inglese, vedo tutto il sito in inglese a meno degli elementi che provengono dalla libreria. Faccio scadere la session (e la application, dato che sono l'unico utente sulla macchina di test) e la lingua sulla libreria sembra finalmente allinearsi.

Immagino che il problema sia nella:

System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(uiCulture.Value)

che sembra agire sulla libreria solo dopo che l'applicazione è stata riavviata.

Consigli?

Grazie!
Sebastiano
Modificato da sem il 11 luglio 2017 09.21 -
Alcune idee:
1. In generale, se le risorse servono su più progetti, conviene mantenerle in una libreria separata
2. Nella maggior parte dei miei progetti ho le risorse nel progetto web e le passo come parametri ai metodi di libreria.
3. Non penso sia un problema di risorse in libreria: fino alla fine del primo postback, dopo il cambio lingua, la culture non cambia. Al click di cambio lingua ti conviene fare il redirect alla pagina stessa in modo da essere sicuro.

Ormai programmano tutti... ma la professionalità appartiene a pochi
59 messaggi dal 22 giugno 2001
Ciao Manuel,

grazie per la risposta.

No, non è una questione di postback, la pagina in cui si definisce la selezione della lingua è la pagina di login dell'applicativo. La pagina esegue poi un redirect alla dashboard. Ciò nonostante le risorse non vengono caricate nella lingua corretta.

La lingua cambia solo quando eseguo un riciclaggio dei WP o si genera un Session/Application End. Empiricamente mi pare quindi di capire che la dll viene eseguita su un thread differente e che questa eredita le impostazioni del thread "padre" (l'applicazione che chiama la dll) solo all'avvio della sessione/applicazione.

Non ho la necessità di condividere le risorse su più progetti, in realtà la DLL contiene poche risorse legate alla lingua. Talmente poche che, inizialmente, non mi ero nemmeno reso conto del problema. Il problema è che devono stare lì :-)

Suppongo si debba agire in qualche modo sul thread della DLL, ma non saprei dire come. O, magari, c'è qualche impostazione da settare per modificare questo comportamento nella DLL.

Ciao
Sebastiano

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.