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).
Nella Form1 aggiungiamo un MenuStrip che in base alla lingua del sistema operativo
visualizzerà le varie voci nella lingua corretta:
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:
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.