AntonioGanci

Il blog di Antonio Ganci
posts - 201, comments - 420, trackbacks - 31

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 17:22 | Filed Under [ Tips ]

Feedback

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 17: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 18: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 18:28 | Igor Damiani
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 20:13 | Antonio Ganci
Gravatar

# re: Applicazioni Multilingua utilizzando le Windows Forms

Sto facendo uno spike per approfondire gli strumenti che mette a disposizione .NET
28/04/2008 22:37 | Antonio Ganci
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET