AntonioGanci

Il blog di Antonio Ganci
posts - 201, comments - 578, trackbacks - 27

Applicazioni Multilingua utilizzando le Windows Forms

Sto sviluppando un'applicazione che utilizza le Windows Forms e dovrà supportare più lingue. Vorrei condividere la soluzione che sto progettando/implementando.

L'idea è quella di utilizzare la classe ResourceManager la quale si occupa di leggere le stringhe in base alla lingua corrente. Vediamolo in pratica:

Per prima cosa creiamo un progetto che chiameremo MultilingualWindowsApplication ed aggiungiamo due resources file di nome:

  • Local.en.resx
  • Local.it.resx

Il primo conterrà le stringhe in lingua inglese ed il secondo quelle in italiano, quindi se un domani dovremmo aggiungere il tedesco basterà creare il file di risorse (Local.de.resx).

MultilingualWindowsApplication Solution Explorer

Nella Form1 aggiungiamo un MenuStrip che in base alla lingua del sistema operativo visualizzerà le varie voci nella lingua corretta:

MenuStrip

Ora aggiungiamo una variabile membro alla Form1 di tipo ResourceManager:

  public partial class Form1 : Form

  {

    private ResourceManager _resources;

 

    public Form1()

    {

      InitializeComponent();

      _resources = new ResourceManager("MultilingualWindowsApplication.Local",

        Assembly.GetExecutingAssembly());

    }

  }

Impostiamo la traduzione nelle due lingue utilizzando il resource editor:

Resources Editor

Per leggere la stringa nella lingua corretta utilizzeremo il metodo GetString:

    private void LocalizeUITexts()

    {

      fileToolStripMenuItem.Text = _resources.GetString("Menu_File");

      apriToolStripMenuItem.Text = _resources.GetString("Menu_Apri");

      salvaToolStripMenuItem.Text = _resources.GetString("Menu_Salva");

      salvaConNomeToolStripMenuItem.Text = _resources.GetString("Menu_SalvaConNome");

      esciToolStripMenuItem.Text = _resources.GetString("Menu_Esci");

      modificaToolStripMenuItem.Text = _resources.GetString("Menu_Modifica");

      tagliaToolStripMenuItem.Text = _resources.GetString("Menu_Taglia");

      copiaToolStripMenuItem.Text = _resources.GetString("Menu_Copia");

      incollaToolStripMenuItem.Text = _resources.GetString("Menu_Incolla");

    }

   Modifichiamo la lingua corrente per vedere se tutto funziona correttamente anche in inglese:

      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

Per evitare di gestire la sincronizzazione dei file di risorse nelle varie lingue consiglio l'utilizzo di RESX Synchronizer è una piccola utility che impostando il file di risorse sorgente es (Local.en.resx) e destinazione crea o cancella tutte le stringhe che mancano o sono in più.

Un'altra tecnica è quella di far generare il file di risorse dall'IDE. Per far questo occorre impostare a true la property Localizable della Form, come spiegato in questo post delle MSDN.

Non ho usato quell'approccio perchè avrei un file di risorse per ogni form da localizzare, inoltre se ho la stessa stringa in diverse form devo duplicare la traduzione in tutte le form, infine le chiavi delle stringhe hanno nomi poco chiari (per chi non fa lo sviluppatore di mestiere) come:

salvaToolStripMenuItem.Text

Nel mio caso la traduzione nelle varie lingue è fatto da altre persone e quindi sarebbe complicato anche la sincronizzazione di tutti questi resx a fronte di uno solo per tutte le form.

Print | posted on lunedì 28 aprile 2008 14.22 | Filed Under [ Tips ]

Feedback

Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

Ciao Antonio,

c'è una ragione particolare per cui fai tutto a mano? Io utilizzo i file di risorse solo per evitare di inserire stringhe hard-coded, mentre per quanto riguarda i controls il tutto è assistito dal designer: basta impostare la proprietà localizable a true, scegliere una lingua, impostare le etichette, scegliere un'altra lingua, reimpostare le etichette e così via...

http://msdn2.microsoft.com/en-us/library/y99d1cd3(VS.71).aspx
28/04/2008 14.31 | Marco De Sanctis
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

L'ho scritto al fondo. La ragione principale è che le traduzioni nelle varie lingue non verrà fatta dagli sviluppatori, ma da dei traduttori e non abbiamo la possibilità di fare usare visual studio ai traduttori.
28/04/2008 14.59 | Antonio Ganci
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

Beh, se il motivo è quello potresti pensare di far utilizzare ai traduttori questo tool

http://msdn2.microsoft.com/en-us/library/8bxdx003(VS.71).aspx

Ciao :)
28/04/2008 15.08 | Marco De Sanctis
Gravatar

# Re: Applicazioni Multilingua utilizzando le Windows Forms

Antonio, puoi seguire i consigli di Marco - che condivido - ma far fare comunque a terzi il lavoro di traduzione. A design-time metti Localizable = false ed imposti le label con la lingua che vuoi che la tua app abbia quando non vengono trovate le risorse di una lingua. Poi metti Localizable = true: in questo modo se vengono trovate risorse per una lingua specifica, vengono usate quest'ultime. Questo non vieta cmq che i files .resx vengano creati da terze parti.
28/04/2008 15.28 | Igor Damiani
Gravatar

# Re: Applicazioni Multilingua utilizzando le Windows Forms

> le traduzioni nelle varie lingue non verrà fatta dagli sviluppatori, ma da dei traduttori

trovo questo è un requisito determinante

ad esempio i traduttori come faranno la traduzione:
- manderanno in esecusione il programma ?
- o avranno accesso a un testo / db con le parole da tradurre ?
- cope potranno distinguere 2 parole in 2 contesti diversi che in italiano si dicono con la stessa parola ma ad es. in francese la traduzione varia dal contesto in cui viene usata?
- che strumento avranno per validare il risultato finale della loro traduzione ?
- quando modifichi una traduzione sei disposto a fare un nuovo rilascio o vuoi aggiornare a caldo la traduzione nella installazione dell'utente ?
- l'utente in che modo potrà segnalare che una traduzione non è corretta/chiara dando le giuste coordinate al traduttore ?

credo che la scelta della soluzione tecnica si basa anche su questi punti
28/04/2008 15.53 | Luca Minudel
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

> - manderanno in esecusione il programma ?
No, l'idea è di dargli un software tipo resource editor con solo le frasi da tradurre dall'italiano

> - come potranno distinguere 2 parole in 2 contesti diversi che in italiano si dicono con la stessa parola ma ad es. in francese la traduzione varia dal contesto in cui viene usata?

Su questo non ti so rispondere, non abbiamo ancora riscontrato questo problema.

> - che strumento avranno per validare il risultato finale della loro traduzione ?
Le frasi da tradurre non sono complicatissime, questa è una cosa che chiederò al cliente.

> - l'utente in che modo potrà segnalare che una traduzione non è corretta/chiara dando le giuste coordinate al traduttore ?

Penso lo segnalerà al cliente.

28/04/2008 17.05 | Antonio Ganci
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

X Marco: L'avevo già vista, la farò provare per vedere se è abbastanza usabile.
Comunque la soluzione con localizable = true mi sembra un pò macchinosa far modificare tanti resx, ho paura della possibilità di errori.
Preferirei averne uno solo.
28/04/2008 17.13 | Antonio Ganci
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

Usi un'approccio MVC/MVP ? (Immagino di sì)
Come testi questo comportamento delle tue view ?
28/04/2008 19.03 | makka
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

Sto facendo uno spike per approfondire gli strumenti che mette a disposizione .NET
28/04/2008 19.37 | Antonio Ganci

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 2 and 6 and type the answer here:

Powered by: