Come creare un software multilingua in C#

Come creare un software multilingua in C#

Come creare un software multilingua in C#: In questo articolo vedremo uno dei modi per poter creare un software multilingua in C#.

Un software multilingua, è un’applicazione che cambia il contenuto del testo in base alla lingua in uso nel sistema operativo o alla lingua impostata dall’utente.

In questo tutorial vedremo come modificare il nostro software per renderlo multilingua.

I modi per farlo sono diversi, ad esempio per la maggior parte dei miei progetti uso i file xml (molto utili se ci si affida a traduttori esterni che non dovranno installare nessun software particolare per modificarli).

Visual Studio ha un sistema di localizzazione interno basato su file resx, ed è questo il sistema che utilizzeremo in questo tutorial.

Come creare un software multilingua in C#

Per cominciare creiamo una cartella, non importa il nome di questa cartella, servirà solo per contenere i file con le lingue, quindi possiamo chiamarla ad esempio semplicemente lingue.

Trasciniamo quindi questa cartella sotto la voce Properties.

Ora che abbiamo la cartella in Properties, creiamo al suo interno un file di Risorse, per farlo facciamo click con il tasto destro sulla cartella, selezioniamo Aggiungi Nuovo e scegliamo File di Risorsa.

Questo file sarà quello relativo alla lingua predefinita del nostro software (che generalmente è l’inglese), teniamo conto che se una lingua non dovesse essere presente, questa sarà la lingua utilizzata per sostituirla.

possiamo chiamare il file ad esempio lang.resx

Ora inseriamo al suo interno tante stringhe quanti sono i testi da tradurre, nel campo Nome inseriamo il nome associato alla stringa e nel campo Valore il testo da visualizzare.

Dopo aver inserito tutte le stringhe, possiamo duplicare questo file nella stessa cartella, aggiungendo però il codice della lingua.

il formato corretto per il nome dei file delle localizzazioni è:

nomefileoriginale.codicelingua.resx

Quindi se il mio file originale si chiama lang.resx il mio file per la lingua italiana sarà:

lang.it.resx

oppure:

lang.it-IT.resx

Posso creare diversi file in base al paese associato, ad esempio per il portoghese posso creare un file per il Portogallo ed uno per il Brasile:

lang.pt-PT.resx e lang.pt-BR.resx

Ora che abbiamo creato i file con le risorse, andiamo a creare un nuovo elemento.

Creiamo un nuovo file di tipo Classe e chiamiamolo ad esempio localizzazione.cs.

In questo file inseriamo 2 riferimenti:

using System.Threading;
using System.Globalization;

Poi creiamo le variabili relative ai testi da tradurre e la funzione che carica il testo dai file di risorsa e lo inserisce nelle variabili:

public static class cambia_lingua
    {
        public static string testoFile = "";
        public static string button1 = "";
        public static string button2 = "";
        public static string testoEsci = "";
        public static string testoModifica = "";
        public static string testoLingua = "";
        public static string testoVisualizza = "";
        //VARIABILE LINGUA SISTEMA
        public static string LinguaSistema = CultureInfo.CurrentUICulture.ToString();

        public static void traduci(string lingua_selezionata = "")
        {
            if (lingua_selezionata == "")
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(LinguaSistema);
            }
            else
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lingua_selezionata);
            }
            //FORM 1
            testoFile = Properties.lingue.lingua.menuFile;
            testoEsci = Properties.lingue.lingua.menuEsci;
            testoModifica = Properties.lingue.lingua.menuModifica;
            testoLingua = Properties.lingue.lingua.menuLingua;
            testoVisualizza = Properties.lingue.lingua.menuVisualizza;
            button1 = Properties.lingue.lingua.button1;
            button2 = Properties.lingue.lingua.button2;
            //FORM 2
        }

Andiamo a vedere nel dettaglio gli elementi relativi proprio alla localizzazione:

        //VARIABILE LINGUA SISTEMA
        public static string LinguaSistema = CultureInfo.CurrentUICulture.ToString();
        public static void traduci(string lingua_selezionata = "")
        {
            if (lingua_selezionata == "")
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(LinguaSistema);
            }
            else
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lingua_selezionata);
            }

In questo esempio abbiamo prima la creazione di una variabile che va a prendere il codice relativo alla lingua in uso (il risultato in Italia è: “it-IT”.

La funzione traduci invece va ad assegnare al Thread corrente la lingua che passiamo, quindi se l’utente passa una lingua in particolare verrà usata quella, altrimenti verrà passata quella del sistema operativo in uso.

Ora che abbiamo salvato tutte le localizzazioni all’interno delle variabili, dal Form non ci resta che richiamare questa funzione e poi associare le variabili come testo degli elementi presenti.

Per una spiegazione più dettagliata e completa vi consiglio di seguire il video presente a fine articolo.

Per chi volesse vedere il risultato finale, è possibile scaricare il progetto presente nel video.

author avatar
Claudio Masci
Sono innanzitutto un appassionato di informatica e tecnologia in generale. Lavoro in ambito informatico da circa 16 anni, spaziando in diversi campi, andando dalla programmazione web, allo sviluppo di software, dalla grafica alla modellazione 3d ed al video editing, ho sempre voluto approfondire ogni aspetto e questo mi ha permesso di lavorare in diversi ambiti informatici.