Risolvere i problemi di localizzazione di ASP.NET Core

Di Hisham Bin Ateya

Questo articolo include istruzioni per la diagnostica di problemi di localizzazione delle app ASP.NET Core.

Problemi di configurazione della localizzazione

Ordine del middleware di localizzazione
L'app potrebbe non essere localizzata perché il middleware di localizzazione non è ordinato come previsto.

Per risolvere questo problema assicurarsi che il middleware di localizzazione sia registrato prima del middleware MVC. In caso contrario il middleware di localizzazione non viene applicato.

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddMvc();
}

Percorso delle risorse di localizzazione non trovato

Le impostazioni cultura supportate in RequestCultureProvider non corrispondono con quelle registrate

Problemi di denominazione dei file di risorse

ASP.NET Core include regole predefinite e linee guida per la denominazione dei file di risorse di localizzazione, descritte in dettaglio qui.

Risorse mancanti

Le cause comuni per le quali non è possibile trovare le risorse sono:

  • I nomi delle risorse presentano errori di ortografia nel file resx o nella richiesta del localizzatore.
  • La risorsa non è presente in resx per alcune lingue, ma è presente per altre.
  • Se si verificano ancora problemi, controllare i messaggi del log di localizzazione (al livello di log Debug) per altre informazioni sulle risorse mancanti.

Hint: quando si usa CookieRequestCultureProvider, verificare che le virgolette singole non vengano usate con le impostazioni cultura all'interno del valore di localizzazione cookie . Ad esempio, c='en-UK'|uic='en-US' è un valore non valido cookie , mentre c=en-UK|uic=en-US è valido.

Problemi con le risorse e le librerie di classi

ASP.NET Core per impostazione predefinita consente alle librerie di classi di trovare i file di risorse tramite ResourceLocationAttribute.

I problemi comuni con le librerie di classi includono:

CustomRequestCultureProvider non funziona come previsto

La classe RequestLocalizationOptions dispone di tre provider predefiniti:

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

CustomRequestCultureProvider Consente di personalizzare il modo in cui le impostazioni cultura di localizzazione vengono fornite nell'app. CustomRequestCultureProvider viene usato quando i provider predefiniti non soddisfano i requisiti.

  • Un motivo comune per cui i il provider personalizzato non funziona correttamente è che non è il primo provider nell'elenco RequestCultureProviders. Per risolvere il problema:

  • Inserire il provider personalizzato nella posizione 0 dell'elenco RequestCultureProviders come illustrato di seguito:

options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
    {
        // My custom request culture logic
        return new ProviderCultureResult("en");
    }));
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
    {
        // My custom request culture logic
        return new ProviderCultureResult("en");
    }));
  • Usare il metodo di estensione AddInitialRequestCultureProvider per impostare il provider personalizzato come provider iniziale.

Problemi con lo spazio dei nomi radice

Quando lo spazio dei nomi radice di un assembly è diverso dal nome dell'assembly, la localizzazione non funziona per impostazione predefinita. Per evitare questo problema usare RootNamespace, descritto in dettaglio qui.

Avviso

Ciò può verificarsi quando il nome di un progetto non è un identificatore .NET valido. Ad esempio my-project-name.csproj , userà lo spazio dei nomi my_project_name radice e il nome my-project-name dell'assembly che genera questo errore.

Risorse e azione di compilazione

Se si usano file di risorse per la localizzazione, è importante che questi dispongano di un'azione di compilazione appropriata. Vanno impostati come Risorsa incorporata; in caso contrario ResourceStringLocalizer non è in grado di trovare tali risorse.

Problemi di GitHub con suggerimenti utili per la risoluzione dei problemi