AntonioGanci

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

lunedì 28 aprile 2008

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.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (5) | Filed Under [ Tips ]

Powered by:
Powered By Subtext Powered By ASP.NET