Oppure

Loading
01/09/16 3:04
lupetto77
Ciao a tutti, ho un problema stavo provando a fare un programma multilingua (per fare le prove ho usato solo inglese e italiano), ho creato un file.ini che contiene la stringa per la lingua, formata in questo modo: Lingua=Italiano.
Che vado a leggere la riga prelevando solo la parte dopo = (in questo caso Italiano), che salvo il risultato in una property che uso per fare il confronto.
La traduzione del testo dei controlli si trova in due file uno per l'italiano e uno per l'inglese che ho caricato nelle risorse, per poi leggerle e inserirle in una List<string>, che uso per prelevare gli indici corrispondenti dal file letto dalle risorse.
Infine ho fatto una funzione che traduce i testi di tutti i controlli.

Per fare i test basta modificare il file.ini nelle diverse lingue.
Il problema è che ha funzionato per una o due volte, ma provando ancora carica solo l'inglese.
Potete darmi una mano per favore?
Dato che il codice è un po lungo da scrivere posto direttamente il progetto.
mediafire.com/download/w3ll3uh3zc6e3tb/…
aaa
01/09/16 8:18
Thejuster
il codice sembra tutto apposto.
Anche se avrei evitato di utilizzare il metodo async.

Non sò il problema effettivo causato.
Ma posso consigliarti una strada migliore da percorrere senza problemi.

Vedo poco professionale il fatto che chiunque possa leggere e modificare il file della traduzione.

Per il mio progetto Mire Engine, ho realizzato una libreria contenente tutti i file della traduzione.

Anziché utilizzare un file txt, usa direttamente il file di risorse del progetto.

1) Crea un libreria di classi con nome "Languague"
2) Elimina il file .cs di default
2) Tasto destro sul progetto -> Aggiungi -> Nuovo Elemento -> [Generale] File di Risorse
e lo chiami Italian o English. Un file di risorse per ogni lungua
3) Inserisci i vari valori



File di Risorse: Italian
[ Campo | Valore ]
[ lbl_1 | Corrisponde alla label 1 ]
[ lbl_2 | Corrisponde alla label 2 ]

-----------

File di Risorse: English
[ Campo | Valore ]
[ lbl_1 | It corresponds to label 1 ]
[ lbl_2 | It corresponds to label 2 ]




Fatto questo, apri il progetto winform principale

una volta compilata basta importare il riferimento e poi lavorare in questo modo


import Languague;



public void SetupLanguague()
{

Assembly a = Assembly.Load("Languague"); //Carico L'assembly della libreria

ResourceManager rm = new ResourceManager("Languague." + Traduci._Lingua, a); //Creo un istanza al Manager delle Risorse

//Ottengo le traduzioni
label1.text = rm.GetString("lbl_1");
label2.text = rm.GetString("lbl_2");


}





Ora che sia italiano o inglese, non c'è bisogno di ripetere l'operazione per ogni lingua e leggere il file di ogni lingua un pò come hai fatto con il file ini.
Il processo è tutto automatico, sicuro e veloce.
Così si evitano anche probabili crash o malfunzionamenti causati ad un settaggio errato del file ini
Questo è il sistema migliore per quanto riguarda ad una traduzione.

Un'altra alternativa, sarebbe quella di avere un file serializzato.
Ma sconsiglio l'utilizzo di un file ini per svariati motivi.
Ultima modifica effettuata da Thejuster 01/09/16 8:23
mire.forumfree.it/ - Mire Engine
C# UI Designer
01/09/16 13:44
lupetto77
Grazie per l'aiuto e consigli, li metto in pratica ora :k:
Un'altra domanda se dovossi fare un'altra traduzione separata per le msgbox (per la stessa applicazione), cosa mi consiglieresti di fare?
Ultima modifica effettuata da lupetto77 01/09/16 13:54
aaa
01/09/16 14:26
TheDarkJuster
usa un database sqlite, crea X tabelle diverse, una per lingua. Ad ogni stringa associ un nome uguale in tutte le tabelle e ogni tabella contiene come valore la rispettiva traduzione.

Dovrai crearti una funzione per ottenere nella lingua X la stringa Y e poi avrai fatto.
aaa
01/09/16 15:37
Thejuster
puoi usare semplicemente come ho fatto nell'esempio

carichi prima tutto l'assembly ed il gestore delle risorse.
Successivamente devi ricordarti il campo che equivale al messaggio che vuoi mostrare

esempio


[Campo | testo ]
[ msg_err1 | Errore numero1 ]
[ msg_err2 | Errore numer2 ]



MessageBox.Show(rm.GetString("msg_err1";));


come prima, se è impostato in inglese, aprirà il file di risorse inglese altrimenti quello italiano.
o qualsiasi altra lingua tu inserisca.
l'importante e che il campo equivala per tutti gli errori o messaggi che vorrai mostrare.
E lo stesso procedimento.

puoi ricavare un solo elemento o più elementi

MessageBox.Show(string.format("{0} ha causato {1}",rm_GetString("msg_err1";),rm_GetString("msg_err2";));
Ultima modifica effettuata da Thejuster 01/09/16 15:40
mire.forumfree.it/ - Mire Engine
C# UI Designer
01/09/16 15:39
lumo
Non usate database o soluzioni campate in aria per l'internazionalizzazione, il .NET framework provvede già tutto.
aaa
01/09/16 21:44
lupetto77
Grazie a tutti per i consigli, ora provo e vi faccio sapere :k:
Ultima modifica effettuata da lupetto77 01/09/16 21:57
aaa
01/09/16 22:23
lupetto77
Se faccio cosi:

//Ho provato a vedere il valore della proprietà con questa msgbox
MessageBox.Show(Traduci._Lingua); //Se tolgo il commento mi da questa eccezzione

Eccezione non gestita di tipo
'System.Resources.MissingManifestResourceException' in mscorlib.dll
Ulteriori informazioni impossibile trovare risorse appropriate per le impostazioni cultura specificate...

Se tengo la msgbox funziona tutto, quindi penso che il valore alla proprietà viene impostata dopo, ma non so il motivo. eppure viene chiamata prima.

Assembly a = Assembly.Load("Language";); //Carico L'assembly della libreria
ResourceManager rm = new ResourceManager("Language." + Traduci._Lingua, a); //Creo un istanza al Manager delle Risorse

//Ottengo le traduzioni
label1.Text = rm.GetString("label_1";);
label2.Text = rm.GetString("label_2";);
label3.Text = rm.GetString("label_3";);
button1.Text = rm.GetString("button_1";);
button2.Text = rm.GetString("button_2";);
button3.Text = rm.GetString("button_3";);

qualche consiglio?
aaa