Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Programma multilinuga
Forum - C# / VB.NET - Programma multilinuga

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 5:04
Giovedì, 01/09/2016
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.
http://www.mediafire.com/download/w3ll3uh3zc6e3tb/WindowsF ...


Lupetto77
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:18
Giovedì, 01/09/2016
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

Codice sorgente - presumibilmente Java

  1. import Languague;
  2.  
  3.  
  4.  
  5. public void SetupLanguague()
  6. {
  7.  
  8. Assembly a = Assembly.Load("Languague"); //Carico L'assembly della libreria
  9.  
  10. ResourceManager rm = new ResourceManager("Languague." + Traduci._Lingua, a); //Creo un istanza al Manager delle Risorse
  11.  
  12. //Ottengo le traduzioni
  13. label1.text = rm.GetString("lbl_1");
  14. label2.text = rm.GetString("lbl_2");
  15.  
  16.  
  17. }




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 il 01/09/2016 alle 10:23


PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 15:44
Giovedì, 01/09/2016
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 il 01/09/2016 alle 15:54


Lupetto77
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 16:26
Giovedì, 01/09/2016
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.

PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:37
Giovedì, 01/09/2016
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 il 01/09/2016 alle 17:40


PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 17:39
Giovedì, 01/09/2016
Non usate database o soluzioni campate in aria per l'internazionalizzazione, il .NET framework provvede già tutto.

PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 23:44
Giovedì, 01/09/2016
Grazie a tutti per i consigli, ora provo e vi faccio sapere :k:

Ultima modifica effettuata da lupetto77 il 01/09/2016 alle 23:57


Lupetto77
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 0:23
Venerdì, 02/09/2016
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?


Lupetto77
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:33
Venerdì, 02/09/2016
Il Traduci._lingua è un elemento che contiene il tuo progetto.
Non si trova nella libreria.

Quindi l'errore e facile da capire basta usare anche il debugger per capire dove sta l'errore
inserendo un breakpoint e aprire il menu a tendina sulla variabile.

L'unica soluzione che mi viene in mente, e che fai visualizzare il MessageBox prima che venga letto il tuo file
che contiene le lingue

File.ini
1=Italiano
2=Inglese


La prima cosa da fare è:
1) Far leggere la lingua scelta
2) Caricare l'assembly ed il ResourceManager

Dopo puoi fare qualsiasi operazione


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo