Integrazione risorse lato server

Questo articolo descrive come integrare le risorse lato server in un'applicazione ASP.NET Core.

 

Inizializzazione delle risorse lato server
Per abilitare il recupero delle risorse lato server, è necessario attivare il servizio ResourceHostedService nella configurazione di avvio dell'applicazione. Questo servizio si occuperà di caricare tutte le risorse dal backend e di memorizzarle in un dizionario in memoria.

 

// Startup.cs
services.AddHostedService<ResourceHostedService>();

 

Il ResourceHostedService popola il dizionario chiave-valore CachedResources, presente nel servizio singleton LocalizationService. Dopo che le risorse sono state caricate in memoria, lo storage non viene più interrogato, salvo una nuova inizializzazione manuale da backend.

 

Configurazione delle opzioni di localizzazione

Per disabilitare il caricamento delle risorse all'avvio, è possibile modificare il file appsettings.json:

 

// appsettings.json 
"AppSettings":
{ 
	"Localization": { 
		"IsResourceInitDisabled": false
 	} 
}

 

Se l'opzione IsResourceInitDisabled è impostata su true, le risorse non verranno caricate durante l'avvio dell'app.

 

Configurazione delle Data Annotation
È necessario configurare ASP.NET MVC Core per utilizzare le risorse localizzate nelle annotazioni dei dati (Data Annotation), come le validazioni dei model.

 

// Startup.cs
IMvcBuilder builder = services.AddControllersWithViews()
	.AddDataAnnotationsLocalization(options => 
	{ 
		options.DataAnnotationLocalizerProvider = (type, localizerFactory) => { return localizerFactory.Create(type); }; 
	});

 

A questo punto, le risorse localizzate saranno disponibili in tutte le classi lato server tramite LocalizationService e Localizer.

 

Localizer

Localizer è una classe che estende la classe nativa IStringLocalizer di ASP.NET MVC Core, personalizzando i metodi di recupero delle risorse. Questa classe consente di ottenere stringhe localizzate e interpolare i valori.

Esempio di utilizzo:

 

public class HomeController(IStringLocalizer localizer) : Controller
{
   public async Task<IActionResult> Home(CancellationToken cancellationToken)
   {
       var value = localizer["App.Header.Hello"];
       return View();
   }
}

 

Interpolazione dei valori

Localizer supporta l'interpolazione di valori nelle risorse tramite i consueti placeholder a graffe {}.

Esempio:

 

var value = localizer["App.Header.WelcomeUser", "Roby", "Consoli"];
// Output: "Welcome Roby Consoli!"

 

Gestione delle culture
Il valore della cultura corrente viene recuperato automaticamente da HttpContext.Items["Culture"]. Tuttavia, è possibile recuperare una risorsa in una cultura specifica utilizzando un localizer dedicato:

 

var localizerIT = ((Localizer)localizer).WithCulture("it-IT");
var valueIT = localizerIT["App.Header.WelcomeUser", "Roby", "Consoli"];
// Output: "Benvenuto Roby Consoli!"

 

Utilizzo di Localizer nelle view Razor

Per utilizzare Localizer nelle view Razor, è necessario aggiungere la classe nel file _ViewImports.cshtml:

 

// _ViewImports.cshtml
@inject IStringLocalizer localizer

 

E successivamente utilizzarlo nelle view:

 

<div>@localizer["App.Header.Hello"]</div>

 

Culture di fallback

Localizer permette di utilizzare una cultura di fallback quando il valore della risorsa non è disponibile nella cultura corrente. La cultura di fallback può essere configurata nel file appsettings.json:

 

// appsettings.json 
"AppSettings": {
   "Localization": {
     "FallbackCultures": [
       {
         "Culture": "zh-Hans",
         "Fallback": "it-IT"
       },
       {
         "Culture": "default",
         "Fallback": "en-US"
       }
     ]
   }
 }

 

Se la risorsa non è disponibile nella cultura corrente, il sistema cercherà di recuperare la risorsa nella cultura di fallback specificata. Se anche in quella cultura non è disponibile, verrà utilizzata la cultura di fallback predefinita (en-US in questo esempio).