Estendibilità della localizzazione

Di Hisham Bin Ateya

Questo articolo:

  • Elenca i punti di estendibilità nelle API di localizzazione.
  • Include le istruzioni per estendere la localizzazione delle app ASP.NET Core.

Punti estendibili nelle API di localizzazione

Le API di localizzazione di ASP.NET Core sono estendibili. L'estendibilità consente agli sviluppatori di personalizzare la localizzazione in base alle esigenze. OrchardCore, ad esempio, ha POStringLocalizer. POStringLocalizer descrive in dettaglio l'uso della localizzazione degli oggetti portabili per usare file PO per archiviare le risorse di localizzazione.

Questo articolo elenca i due punti di estendibilità principali forniti dalle API di localizzazione:

Provider di impostazioni cultura per la localizzazione

Le API di localizzazione di ASP.NET Core hanno quattro provider predefiniti che possono determinare le impostazioni cultura correnti di una richiesta in esecuzione:

I provider precedenti sono descritti in dettaglio nella documentazione del middleware di localizzazione. Se i provider predefiniti non rispondono alle proprie esigenze, compilare un provider personalizzato usando uno degli approcci seguenti:

Usare CustomRequestCultureProvider

CustomRequestCultureProvider fornisce una classe RequestCultureProvider personalizzata che usa un semplice delegato per determinare le impostazioni cultura correnti per la localizzazione:

options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
    var currentCulture = "en";
    var segments = context.Request.Path.Value.Split(new char[] { '/' }, 
        StringSplitOptions.RemoveEmptyEntries);

    if (segments.Length > 1 && segments[0].Length == 2)
    {
        currentCulture = segments[0];
    }

    var requestCulture = new ProviderCultureResult(currentCulture);

    return Task.FromResult(requestCulture);
}));
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
    var currentCulture = "en";
    var segments = context.Request.Path.Value.Split(new char[] { '/' }, 
        StringSplitOptions.RemoveEmptyEntries);

    if (segments.Length > 1 && segments[0].Length == 2)
    {
        currentCulture = segments[0];
    }

    var requestCulture = new ProviderCultureResult(currentCulture);

    return Task.FromResult(requestCulture);
}));

Usare una nuova implementazione di RequestCultureProvider

Si può creare una nuova implementazione di RequestCultureProvider che determina le informazioni sulle impostazioni cultura della richiesta da un'origine personalizzata. L'origine personalizzata, ad esempio, può essere un file o un database di configurazione.

Nell'esempio seguente viene illustrato AppSettingsRequestCultureProvider, che estende per RequestCultureProvider determinare le informazioni sulle impostazioni cultura della richiesta da appsettings.json:

public class AppSettingsRequestCultureProvider : RequestCultureProvider
{
    public string CultureKey { get; set; } = "culture";

    public string UICultureKey { get; set; } = "ui-culture";

    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException();
        }

        var configuration = httpContext.RequestServices.GetService<IConfigurationRoot>();
        var culture = configuration[CultureKey];
        var uiCulture = configuration[UICultureKey];

        if (culture == null && uiCulture == null)
        {
            return Task.FromResult((ProviderCultureResult)null);
        }

        if (culture != null && uiCulture == null)
        {
            uiCulture = culture;
        }

        if (culture == null && uiCulture != null)
        {
            culture = uiCulture;
        }
        
        var providerResultCulture = new ProviderCultureResult(culture, uiCulture);

        return Task.FromResult(providerResultCulture);
    }
}

Risorse di localizzazione

La localizzazione di ASP.NET Core fornisce ResourceManagerStringLocalizer. ResourceManagerStringLocalizerè un'implementazione di che usa resx per archiviare le risorse di IStringLocalizer localizzazione.

Non è obbligatorio usare file resx. Implementando IStringLocalizer, si può usare qualsiasi origine dati.

I progetti di esempio seguenti implementano IStringLocalizer: