Globalizzazione

martedì 29 novembre 2005 - 09.33

eddyG Profilo | Junior Member

Ciao a tutti

ho un quesito da porre alla vostra attenzione,sperando che almeno uno di voi mi possa aiutare dandomi una risposta corretta.

Io ho un programma in italiano e vorrei poter creare la possibilità di visualizzarlo anche in lingua straniera(es. Inglese).

Sapete indicarmi:

1-Dove posso esempi di questa cosa?
2-Qualcuno di voi ha già avuto a che fare con questo tipo di problema?se si,è riuscito a risolverlo?come?

Grazie

Klaus-zanini Profilo | Senior Member

In che senso?
Intendi dire che vuoi che un utente possa scegliere la lingua e che il programma possa in automatico cambiare tutte le sue etichette?
Il programma che cos'é? Una windows application?
Spiega meglio il problema per favore.

eddyG Profilo | Junior Member

Il programma non è sviluppato in visual studio .NET,ma visual basic 6.
vorrei che il risultato finale fosse:premendo un pulsante tutte le label dovrebbero cambiare automaticamente,senza dover passarle una per volta.




Bruno

Klaus-zanini Profilo | Senior Member

Ti consiglierei di crearti un file xml che abbia come tag gli identificativi di ogni etichetta in lingua ed il tuo programma potrebbe (una volta premuto il pulsante) leggere tale file e memorizzare in un array bidimensionale le informazioni. Poi potresti fare un ciclo che per ogni controllo della tua form verifica se a quale valore corrisponde l'etichetta nel tuo array.

Esempio del XML
<Gestione lingue>
<Lingua>Italiano</Lingua>
<Etichette>
<label1>Benvenuti al programma...</label1>
<label2>utente</label2>
<label3>identificativo personale</label3>
</Etichette>
</Gestione lingue>
<Gestione lingue>
<Lingua>Inglese</Lingua>
<Etichette>
<label1>Welcome to the application...</label1>
<label2>username</label2>
<label3>password</label3>
</Etichette>
</Gestione lingue>


L'array dovrebbe essere composto da un campo stringa che memorizza il tag (label1, label2 ecc) e uno che memorizza il valore.
Potrebbe andarti bene come idea?

Klaus

eddyG Profilo | Junior Member

si,potrebbe andare bene...

Il programma sorgente è in visual basic,ma ora voglio fare questa modifica utilizzando ".NET" e non più visual basic 6.

Il procedimento è più o meno uguale?

Il TAG devo assegnarlo io ad ogni controllo che utilizzo sulla Form o li assegna lui automaticamente appena rilascio il tasto del mouse dopo aver trascinato il controllo sulla Form?

Bruno

Klaus-zanini Profilo | Senior Member

Se utilizzi questo metodo devi essere tu che crei il file XML quindi i vari tag li dovrai inserire manualmente nel file per ogni controllo che inserirai nella tua form. Poi il tuo programma si occuperà di recuperarli automaticamente utilizzando un ciclo come questo

For Each MyControl As Control In MyContainer.Controls
MyControl.Text=GetLabel(MyControl.Name)
Next

'dove se MyArray è il tuo array che contiene i campi e le loro descrizioni allora GetLabel è

Private Function GelLabel(ByVal Controllo As String) As String
For i As Integer=0 To MyArray.length-1
if MyArray(i).NomeControllo=Controllo
return MyArray(i).EtichettaControllo
exit Function
End if
Next
return String.Empty
End Function


Se utilizzi .NET anziché crearti l'array potresti usare uno StringDictionary che è più comodo.

Klaus

eddyG Profilo | Junior Member

Grazie per la disponibilità che mi stai offrendo.

Ora provo a mettere in pratica quello che mi hai appena detto poi,appena vedo se funziona o meno,sarà mia premura contattarti.

Grazie ancora

Ciao

Bruno

Klaus-zanini Profilo | Senior Member

Nessun problema :o)

Questo è ciò che faccio io per gestire il multilingua, non è detto che sia il metodo migliore.

Kla

eddyG Profilo | Junior Member

Il tuo suggerimento lo tengo sempre valido.

Ho provato a guardare un pochino in giro su internet e sono capitato su questo sito

http://www.ugidotnet.org/articles/articles_read.aspx?ID=31

mi sembra abbastanza esauriente,solo che mi lascia senza una risposta ad un mio problema...è possibile poter scegliere la lingua direttamente dalla form principale quando viene eseguito il programma?Se si,come posso fare?

Grazie

Bruno

Klaus-zanini Profilo | Senior Member

Premetto che non ho mai messo mano a Globalization ma spero di poterlo fare al più presto (sembra molto carino dall'articolo di Corrado Cavalli).
Penso che il tuo problema si potrebbe risolvere facendo sì che prima della tua windows form tu faccia selezionare la lingua e in base alla scelta tu possa recuperare la stringa della cultureInfo ("it" o "fr" o "en" ecc.).

Quindi puoi modificare la New che ti propone l'articolo che mi hai citato in questo modo:

Public Sub New(ByVal Lingua As String)
MyBase.New()
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(Lingua)

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

Kla

eddyG Profilo | Junior Member

in che modo e dove assegno un valore alla variabile "Lingua"?

Bruno

Klaus-zanini Profilo | Senior Member

Dipende da come intendi proporre il tuo programma. Se prima di iniziare mostri una combobox con le lingue che gestisci potresti usare come datasource una datatable con datatext "italiano", "inglese" ecc. e come datafield "it", "en" ecc.
A questo punto quando l'utente selziona italiano il tuo selectedValue sarà "it" e pertanto lo potrai passare come parametro alla new.

Ma ci sono anche altre possivilità, tutto sta nel come vuoi che funzioni la tua form.

Kla

eddyG Profilo | Junior Member

Ho provato ad eseguire il programma e mi viene visualizzato,appena premo il tasto di "AVVIA",il seguente errore:

Impossibile trovare "Sub Main" in "WindowsApplication2.Form1".

Mi visualizza automaticamente una finestra nella quale mi viene chiesto di scegliere quale form visualizzare per prima,io scelgo l'unioca presente,ma lui nulla rimane fermo alla finestra.

Bruno

Klaus-zanini Profilo | Senior Member

Fai un controllo:
seleziona il progetto e clicka col tasto destro del mouse. Scegli proprietà.
Una volta selezionato in Proprietà comuni la voce Generale assicurati che a destra Oggetto di Avvio sia il nome della tua form e non Sub Main.
Credo sia questo il problema.

eddyG Profilo | Junior Member

Il controllo ha dato esito negativo.

è già corretto come mette lui di default.

Bruno

Klaus-zanini Profilo | Senior Member

Che IDE stai utilizzando? Visual Studio?
Se sì che tipo di progetto hai creato?

eddyG Profilo | Junior Member

visual studio ed ho creato una WindowsApplication con una Form

Bruno

Klaus-zanini Profilo | Senior Member

Strano...posso consigliarti di creare un nuovo progetto windowsApplication con una form e lanciare l'Avvia prima di inserire qualsiasi riga di codice?

eddyG Profilo | Junior Member

Ho già provato questa opzione ed ho notato che funziona.

Ma siamo sempre al punto di partenza...se io lascio invariato il codice di avvia,come posso far avviare il programma non in italiano ma,che ne sono in Tedesco?


Klaus-zanini Profilo | Senior Member

Non capisco esattamente cosa intendi: tu vuoi che il programma all'avvio carichi le etichette in una lingua diversa dall'italiano, ma questa lingua tu quando gliela vuoi impostare al programma?

eddyG Profilo | Junior Member

Buongiorno

Sono sempre qui a darti fastidio.
Il mio intento è quello di aprire,all'inizio del programma,una form nella quale posso scegliere partendo da un Combobox,la lingua desiderata,poi avvio il progetto vero e proprio.

Klaus-zanini Profilo | Senior Member

Ciao
nessun fastidio, spero solo di riuscire ad aiutarti...
dunque io penso che potresti agire in 2 modi: il primo più semplice ma meno elegante è quello di creare 2 form, la prima che contiene la combobox delle lingue e che una volta scelta la lingua crea un oggetto di tipo Form2 (quella contenente il tuo programma) la quale ha un metodo new con un parametro Lingua (o una Property pubblica) che associa ad una tua variabile globale il valore che ti invia la Form1 (ad esempio "en" o "fr" ecc.). La Form2 a questo punto nella Load richiamerà la funzione che utilizza il cultureInfo per associare le nuove etichette.

Il secondo metodo (a mio avviso più elegante) è avere una sola form, gestire tutti i controlli con l'uso di panel in modo tale da poterli visualizzare o nascondere in base alle tue esigenze. All'inizio visualizzi il panel con dentro la combobox delle lingue, poi, una volta scelta la lingua, rendi invisibile quel panel e rendi visibili quelli dei controlli del tuo programma.

Kla

eddyG Profilo | Junior Member

Con il termine "Panel" intendi dire una Combobox oppure...cosa altro?

Klaus-zanini Profilo | Senior Member

Il panel è un controllo che può contenere altri controlli.
Lo trovi negli strumenti (dove trovi la combobox, la textbox, la label ecc.)

Lo puoi trascinare dentro alla tua form ed infilarci dentro la tua combobox. Poi quando vuoi rendere invisibili tutti i controlli contenuti nel panel ti limiti a rendere invisibile solo quello.
Bello no?

eddyG Profilo | Junior Member

Sapere che ci sono cose che posso aiutarti a semplificare il tuo compito è molto bello...ma il saperle usare,secondo me è ancora più bello,e soprattutto importante.

eddyG Profilo | Junior Member

Piano piano sto riuscendo a venirne fuori da questo problema.

Ora mi sono "incagliato" nel punto in cui,dopo aver scelto la lingua con la quale voglio visualizzare tutti i componenti del form.

Dopo averla scelta tra tutte quelle presenti nella combobox,come posso fare per "tradurre" tutte le parole dall'italiano alla lingua scelta(ex. Inglese)?

Klaus-zanini Profilo | Senior Member

Se stai usando il metodo che hai letto nell'articolo non so aiutarti perché come ti dicevo non ho mai usato la Globalization. Da quello che avevo letto (di sfuggita) la imposti nella new quindi prima di inizializzare i componenti e quelli dovrebbero già risentire della tua modifica...

eddyG Profilo | Junior Member

No,non sto seguendo l'esempio che ti avevo fatto leggere,ma il tuo.

Klaus-zanini Profilo | Senior Member

Quindi utilizzi il file xml con i valori anziché globalization?
Beh in quel caso mi sembrava di averti già descritto come procedere...comunque ripetere aiuta ;o)

Una volta che hai scelto la lingua procedi alla lettura (nel file xml) dei nodi figli del nodo che ha per valore la tua lingua. Creati uno StringDictionary in cui associ alla key il nome del tag del nodo e al value innertext del nodo.

Poi cicli su tutti i controlli della tua form (occhio che se usi i pannelli devi fare una funzione che sia ricorsiva al loro interno) e se trovi un controllo il cui nome corrisponde ad una key del tuo stringdictionary, associ il value corrispondente a quella key al text del tuo controllo.

Gli esempi te li ho scritti nei primi post.
Kla

eddyG Profilo | Junior Member

Si,è vero,non mi ricordavo più...scusami


Ora procedo in questo modo e,se ne avrò bisogno(sono sicuro che ti chiamerò presto),ti ricontatterò.


eddyG Profilo | Junior Member

Io ho creato un nuovo file xml in questo modo:

<?xml version="1.0" encoding="utf-8" ?>
<Lingue>
<Lingua>Inglese</Lingua>
<Lingua>Tedesco</Lingua>
<Lingua>Spagnolo</Lingua>
<Lingua>Francese</Lingua>
.........
.........
.........
.........
</Lingue>

riesco a leggere ogni nodo del file in modo distinto l'uno dall'altro,e riesco a visualizzarlo a video tramite un textbox.

Secondo te se,al posto di

MessageBox.Show(node.InnerText)

scrivo

ArrayLingue=MessageBox.Show(node.InnerText)

mi crea un array in questo modo:

ArrayLingue(0)=Inglese
ArrayLingue(1)=Tedesco
ArrayLingue(2)=Spagnolo
ArrayLingue(3)=Francese

????



Klaus-zanini Profilo | Senior Member

Direi proprio di no, anche perché messagebox.show è un metodo che non ha un ritorno...

piuttosto cicla sui nodi e incrementa una variabile intera x in modo da scrivere

ArrayLingue(x)=node.innertext


eddyG Profilo | Junior Member

Si,mi sono accorto dopo di aver scritto una cavolata e mi sono corretto subito.

Ora,però,mi trovo in questo punto:

Dim i As Integer
i = 0
Try
For Each node In element.ChildNodes
ArrayLingue(i) = node.InnerText
i = i + 1
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try

nel momento in cui il puntatore arriva sull'istruzione di inserirlo nell'array mi viene visualizzato una finestra di errore con scritto al suo interno:

"Riferimento a un oggetto non impostato su un'istanza di oggetto."


Klaus-zanini Profilo | Senior Member

Hai dato una dimensione all'array?

dim ArrayLingue(4) As String

Nel tuo caso per avere esattamente tante righe quanti sono le lingue dovresti fare così credo:

dim ArrayLingue(element.ChildNodes.Count) As String

eddyG Profilo | Junior Member

Ciao,sai indicarmi dove posso trovare il .NET Framework SDK?

Grazie

Klaus-zanini Profilo | Senior Member

Dovresti trovare tutto a questo link
http://msdn.microsoft.com/downloads/default.aspx

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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5