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
Creazione di componenti personalizzati in React.js con Tailwind CSS
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Assegnare un valore di default a un parametro di una lambda in C#
Eseguire query verso tipi non mappati in Entity Framework Core
Evitare la command injection in un workflow di GitHub
Utilizzare la session affinity con Azure Container Apps
Sfruttare lo streaming di una chiamata Http da Blazor
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Specificare il versioning nel path degli URL in ASP.NET Web API
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Miglioramenti nelle performance di Angular 16
Supportare il sorting di dati tabellari in Blazor con QuickGrid
I più letti di oggi
- C# 4
- Spaziatura tra i caratteri in Silverlight 5
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Segui in tempo reale il TechEd 2004
- da oggi è possibile fare login velocemente con LinkedIn e Google. a questi si aggiunge il supporto già attivo per Facebook, Twitter, Microsoft Account, Windows Hello e OpenID, per darvi sempre più possibilità di accedere semplicemente alla nostra community! #aspitalia
- Migrare una service connection a workload identity federation in Azure DevOps
- Evitare postback multipli in un UpdatePanel