Un sito multilingua, tipicamente, utilizza degli URL in cui uno dei vari token è proprio costituito dal codice della lingua: per esempio, indirizzi validi potrebbero essere qualcosa come localhost/en, localhost/fr/home/index o ancora localhost/it/customers/detail/1.
Per poter utilizzare URL di questo tipo, è necessario modificare le regole di routing, inserendo questa nuova variabile nel pattern:
routes.MapRoute( "Default", // Route name "{language}/{controller}/{action}/{id}", new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }, new { language = "it|en|de|es|fr" } );
Il nuovo parametro language, che nell'esempio in alto assume il codice della lingua inglese come valore di default, può essere poi validato tramite un constraint basato su regular expression, così da restringere il campo ai soli valori che effettivamente supportiamo.
A questo punto, se vogliamo che le impostazioni della cultura del thread corrente riflettano questo parametro di routing, possiamo sfruttare un action filter come il seguente:
public class LanguageFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); var language = filterContext.RouteData.Values["language"] as string; Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(language); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(language); } }
In questo modo, tutte le volte che formatteremo un importo o interrogheremo un file di risorse, il risultato dipenderà dalla lingua scelta dall'utente. Se una simile logica è comune a tutti i controller dell'applicazione, possiamo semplicemente registrare la classe precedente come GlobalFilter:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new LanguageFilterAttribute()); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire attività pianificate con Azure Container Jobs
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Come migrare da una form non tipizzata a una form tipizzata in Angular
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Code scanning e advanced security con Azure DevOps
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Short-circuiting della Pipeline in ASP.NET Core
Usare un KeyedService di default in ASP.NET Core 8
Evitare la script injection nelle GitHub Actions
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)