Quando dobbiamo realizzare siti che supportino differenti culture, tipicamente dobbiamo affrontare diverse sfide, che ad esempio coinvolgono la localizzazione dei contenuti statici della pagina.
Contenuti statici tramite file di risorse
In .NET lo strumento che abbiamo per gestire stringhe a seconda della cultura è costituito dai file di risorse (.resx), che possiamo aggiungere, ad esempio, all'interno della cartella App_GlobalResources, avendo l'accortezza di impostarne la build action a Embedded Resource
Come possiamo notare dall'immagine, l'idea è quella di creare un file per ogni cultura che vogliamo supportare, catalogandole ad esempio a seconda del nome della View. Man mano che modifichiamo questi file, Visual Studio genera in background una classe c# che espone un metodo statico per ognuna delle chiavi che abbiamo inserito.
Ciascuno di questi metodi ritorna un risultato che dipende dalla UI Culture del thread corrente: se ad esempio la cultura è impostata a "it-IT", la chiave viene cercata preventivamente nel file Home.it-IT.resx, successivamente su Home.it.resx (se presenti) e infine all'interno di Home.resx.
Quanto abbiamo appena descritto è un comportamento standard del .NET Framework, che possiamo facilmente integrare all'interno di una view Razor semplicemente sfruttando questi file di risorse al posto delle usuali stringhe di testo.
<h2> @Global.Home.WelcomeMessage </h2>
Affinché il messaggio venga visualizzato nella lingua corretta, è necessario impostare la seguente chiave all'interno del file web.config:
<system.web> <globalization culture="auto" uiCulture="auto" /> </system.web>
In questo modo, infatti, ASP.NET sfrutterà l'informazione della culture inviata dal browser dell'utente per impostare la UI Culture del thread che processerà la richiesta, così da selezionare, in ultima analisi, il file di risorse corretto.
Localizzazione tramite data annotation
Quando realizziamo delle form di input, però, tipicamente sfruttiamo gli html helper LabelFor e ValidationMessageFor per produrre del testo in base alle data annotation che abbiamo posto sul model:
<div class="editor-label"> @Html.LabelFor(m => m.Name) </div> <div class="editor-field"> @Html.EditorFor(m => m.Name) @Html.ValidationMessageFor(m => m.Name) </div>
Anche in questo caso possiamo sfruttare dei file di risorse, che dovranno però essere inseriti all'interno di App_LocalResources. I file di risorse globali, infatti, generano classi internal a cui, pertanto, il runtime di ASP.NET non può accedere. Per i file presenti all'interno di App_LocalResources, invece, possiamo specificare il livello di visibilità desiderato.
A questo punto, tramite le data annotation, possiamo specificare le chiavi e i file di risorse da utilizzare come nell'esempio in basso, così che possano essere sfruttati dall'engine di data template di ASP.NET MVC.
[Required(ErrorMessageResourceType=typeof(PersonResources), ErrorMessageResourceName="NameRequired")] [Display(Name="NameField", ResourceType=typeof(PersonResources))] public string Name { get; set; } [Display(Name = "BirthDateField", ResourceType = typeof(PersonResources))] public DateTime BirthDate { get; set; }
Quanto abbiamo visto fino ad ora non è, ovviamente, sufficiente a realizzare siti multilingua, visto che dobbiamo comunque gestire tutta una serie di altre problematiche, che coinvolgono ad esempio la validazione dell'input utente secondo le regole delle diverse culture. Nel prossimo script vedremo come soddisfare anche questo requisito.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Cancellare una run di un workflow di GitHub
Utilizzare i primary constructor di C# per inizializzare le proprietà
Change tracking e composition in Entity Framework
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Gestione degli stili CSS con le regole @layer
Creare una libreria CSS universale - Rotazione degli elementi
Il nuovo controllo Range di Blazor 9
Usare una container image come runner di GitHub Actions
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Creare un'applicazione React e configurare Tailwind CSS
Utilizzare una qualunque lista per i parametri di tipo params in C#
I più letti di oggi
- Codemotion 2012 - Roma
- Tutto ok al webb.it
- Windows Azure SDK si aggiorna alla versione 1.3
- Le foto del Webb.it
- ASP.NET Guida completa
- Microsoft Security Bulletin MS05-028
- Nasce Silverlight: l'alternativa a Flash
- Accesso ai dati con Entity Framework Core 1
- Remote validation con ASP.NET MVC 3
- Convertire l'indirizzo IP di una richiesta in un valore numerico