Versione sito web in diverse lingue

martedì 06 maggio 2008 - 14.52

paquito_ita Profilo | Senior Member

Ciao a tutti,

sto realizzando un sito web con asp.net e accanto alla versione "default" in italiano dovrebbe essere presente anche la versione inglese cui l'utente puo' passare cliccando su un'icona che riporta la relativa bandiera.

Cè un modo più intelligente per automatizzare tale processo oppure l'alternativa è "copiare" ogni pagina del sito e tradurre i relativi contenuti e label di link/button?

Ho letto alcuni articoli su asp.net localization e ho anche creato il relativo file Resources.en.resx, dove traduco (mantenendo lo stesso rodine) gli elementi presenti nel file Resources.resx di default (in italiano).
Tuttavia se creo una cartella "en" nella root e provo a copiarci dentro i vari file (con l'intenzione poi di associare i vari link e button al file Resources.en.resx) ottento un errore circa la creazione non permessa da IIS di una cartella virtuale.

Come potrei risolvere tale problema?

Brainkiller Profilo | Guru

>Ho letto alcuni articoli su asp.net localization e ho anche creato
>il relativo file Resources.en.resx, dove traduco (mantenendo
>lo stesso rodine) gli elementi presenti nel file Resources.resx
>di default (in italiano).

E' proprio questa la via giusta.

>Tuttavia se creo una cartella "en" nella root e provo a copiarci
>dentro i vari file (con l'intenzione poi di associare i vari
>link e button al file Resources.en.resx) ottento un errore circa
>la creazione non permessa da IIS di una cartella virtuale.

Allora io di solito procedo così. All'interno della cartella App_GlobalResources creo tutti i file di risorse nelle rispettive lingue. Un WebResources.resx generico che è quello di default dove non è specificata nessuna lingua e puoi quelli specifici esempio WebResources.en.resx o WebResources.de.rex ecc. Non creare la cartella en ma metti tutti i file assieme dentro pp_GlobalResources.

A quel punto colleghi le varie risorse ai controlli. ASP.NET automaticamente in base alla Culture impostata nel Thread corrente ti va a leggere le risorse adeguate e ti valorizza i controlli nella lingua prescelta.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

paquito_ita Profilo | Senior Member

>Allora io di solito procedo così. All'interno della cartella
>App_GlobalResources creo tutti i file di risorse nelle rispettive
>lingue. Un WebResources.resx generico che è quello di default
>dove non è specificata nessuna lingua e puoi quelli specifici
>esempio WebResources.en.resx o WebResources.de.rex ecc. Non creare
>la cartella en ma metti tutti i file assieme dentro pp_GlobalResources.
>
>A quel punto colleghi le varie risorse ai controlli. ASP.NET
>automaticamente in base alla Culture impostata nel Thread corrente
>ti va a leggere le risorse adeguate e ti valorizza i controlli
>nella lingua prescelta.

Ciao David, ho fatto esattamente come mi hai detto tu. Ho creato un file di risorse con tutte le chiavi già inserite in maniera completamente automatica attraverso "TOOL >> Generate Local Resources" e le modifiche fatte sul file di risorse di deafult Resources.resx (ovvero Italiano) me le vede. Ho quindi copiato tale file chiamandolo Resources.en.resx e ho tradotto i valori delle chiavi in inglese.

Uso poi un comando imageButton (bandiera inglese) per fare lo switch fra le lingue cui associo l'evento:
protected void eng_flag_Click(object sender, ImageClickEventArgs e) { Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en"); }

Tuttavia quando clicco sulla bandiera non succede nulla Non dovrebbe cambiare il testo dei comandi associati andando a prelevare i valori dal file Resources.en.resx?

Grazie per la pazienza

Brainkiller Profilo | Guru

>Tuttavia quando clicco sulla bandiera non succede nulla
>Non dovrebbe cambiare il testo dei comandi associati andando
>a prelevare i valori dal file Resources.en.resx?

E' giusto.
Se vai in debug il codice passa all'interno dell'evento click ?

Prova a usare anche questa istruzione:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lingua);

Io di solito per inglese uso la cultura en-US e per l'italiano it.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

paquito_ita Profilo | Senior Member

>>Tuttavia quando clicco sulla bandiera non succede nulla
>>Non dovrebbe cambiare il testo dei comandi associati andando
>>a prelevare i valori dal file Resources.en.resx?
>
>E' giusto.
>Se vai in debug il codice passa all'interno dell'evento click?

Sì, ci entra e imposta i valori: CurrentCulture {en-Us}, CurrentUICulture {en} mentre InstalledUICulture {it-IT} e InvariantCUlture è vuota {}.

Questo usando il seguente codice:
protected void eng_flag_Click(object sender, ImageClickEventArgs e) { Thread.CurrentThread.CurrentUICulture = new CultureInfo("en"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); }

Non so proprio da cosa dipenda....

Brainkiller Profilo | Guru

Mia dimenticanza. Devi metterli dentro InitializeCutlure()
Prova così, inserisci questo codice nella pagina:

protected override void InitializeCulture() { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); // e/o Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); base.InitializeCulture(); }

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

paquito_ita Profilo | Senior Member

Ho provato ma mi dà il seguente errore: "no suitable method to override" ...

Il codice della classe è:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Threading; using System.Globalization; public partial class Default_master : System.Web.UI.MasterPage { protected void eng_flag_Click(object sender, ImageClickEventArgs e) { this.InitializeCulture(); /* Thread.CurrentThread.CurrentUICulture = new CultureInfo("en"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); */ } protected override void InitializeCulture() { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); // e/o Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); base.InitializeCulture(); } }

Abbia pazienza....

Brainkiller Profilo | Guru

>Ho provato ma mi dà il seguente errore: "no suitable method
>to override" ...
>Abbia pazienza....

Ho dimenticato di aggiungere qualcosa io.
Quel codice, inseriscilo in una pagina .aspx e non in una master page.
Seconda cosa non devi richiamarlo tu a mano come hai fatto nell'onClick ma viene automaticamente richiamato da ASP.NET nella costruzione della pagina.
Ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

paquito_ita Profilo | Senior Member

>Quel codice, inseriscilo in una pagina .aspx e non in una master
>page.

Tuttavia diversi elementi (links e altro) appartengono alla MasterPage e dovrebbero essere tradotti

>Seconda cosa non devi richiamarlo tu a mano come hai fatto nell'onClick
>ma viene automaticamente richiamato da ASP.NET nella costruzione
>della pagina.

Tuttavia cosi' facendo quando viene creata la pagina in questione la cultureInfo viene settata subito a "en", mentre cio' dovrebbe avvenire solo dopo che l'utente clicca sulla flag inglese.
Inoltre ho provato a fare il debug e tutto viene settato a dovere: i valori (quando culture {it-IT}) vengono correttamente presi dal file di fallback Resources.resx, mentre poi tramite quei metdi che mi hai suggerito si vede che culture viene settata a {en-US}, ma i valori dei campi non cambiano sulla pagina web, ma rimangono in Italiano, anche se nel file Resources.en.resx sono tradotti in inglese.

Sembrerebbe cosi' semplice eppure non capisco perché non funziona, anche perché da Debug tutto torna....

Brainkiller Profilo | Guru

>Tuttavia diversi elementi (links e altro) appartengono alla MasterPage
>e dovrebbero essere tradotti

Ma tu hai creato i controlli Label e Literal che vanno a recuperare le risorse dai file di risorsa ?

>Tuttavia cosi' facendo quando viene creata la pagina in questione
>la cultureInfo viene settata subito a "en", mentre cio' dovrebbe
>avvenire solo dopo che l'utente clicca sulla flag inglese.

Naturalmente qui devi intervenire tu non è che ti ho fatto tutto io. Dovrai inserire la lingua prescelta in una session o in un cookie e poi settarla a runtime in base a quella scelta.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

paquito_ita Profilo | Senior Member

>Ma tu hai creato i controlli Label e Literal che vanno a recuperare
>le risorse dai file di risorsa ?

Ho degli asp:Hyperlink che associo al file delle risorse locale in modo automatico. In teoria anche con questi potrei sfruttare la localizzazione dato che vengono riconosciuti in automatico da VS. Ad ogni modo ho provato ad inserire un comando literal, giusto per fare una prova. Ma anche in questo caso dopo aver settato la culteureInfo in seguito al click sulla flag non cambia il testo

>Naturalmente qui devi intervenire tu non è che ti ho fatto tutto io. Dovrai inserire la lingua prescelta in una session
>o in un cookie e poi settarla a runtime in base a quella scelta.

Ok E? che nn avendole mai usate nn sono molto ferrato! Grazie dei consigli!

Brainkiller Profilo | Guru

Tu come li associ scusa ?
Io così:
Io assegno alla proprietà Text ila risorsa in questo modo:

Text="<%$ Resources:WebResources, HomePageFooter %>"

e HomePageFooter e il nome della risorsa all'interno del file di risorse.
I file di risorse sono chiamati così:

WebResources
WebResources.en.resx
WebResources.de.resx

ecc.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

paquito_ita Profilo | Senior Member

>Io assegno alla proprietà Text ila risorsa in questo modo:
>
>Text="<%$ Resources:WebResources, HomePageFooter %>"

Tu quindi usi un file di risosrse globale. Mentre io faccio generare a VS un file delle risorse locale e lui mi aggiunge meta:resourcekey="lingua" all'interno dell'elemento considerato.

Poi nel file Resources.resx (l'estensione .resx va anche per il file di fallback, giusto?) ho la coppia chiave= lingua.Text e value= lingua mentre in Resources.en.resx chiave=lingua.Text e value=language

Tuttavia non va...l'associazione pero' dovrebbe essere corretta, dato che se imposto i valori della proprieta' Text per acuni elementi nel file di risorsa di default me li riconosce.Solamente non passa a quelli in inglese, anche se da Debug i campi culture vengono settati a {en-US}.

Mi hanno appena mandato una lettera dal vaticano....sembra stiano spianando la strada per la tua beatificazione vista la pazienza infinita

samar Profilo | Senior Member

Scusate, si è poi capito come poter creare un sito in + lingue?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5