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 query verso tipi non mappati in Entity Framework Core
Creare una libreria CSS universale: Clip-path
Utilizzare database e servizi con gli add-on di Container App
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Utilizzare QuickGrid di Blazor con Entity Framework
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Creazione di componenti personalizzati in React.js con Tailwind CSS
Creare alias per tipi generici e tuple in C#
Cambiare la chiave di partizionamento di Azure Cosmos DB