Localizzazione in Asp.Net Core

Ho seguito le istruzioni su questa pagina per configurare la localizzazione:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization

Tuttavia, per me non sembra funzionare. Ecco cosa ho fatto:

Startup.cs:

public class Startup { public IConfigurationRoot Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", true, true); builder.AddEnvironmentVariables(); Configuration = builder.Build(); } public void ConfigureServices(IServiceCollection services) { services.AddLocalization(o => o.ResourcesPath = "Resources"); services.AddMvc(o => { o.Filters.Add(typeof(GlobalExceptionFilter)); } ).AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix).AddDataAnnotationsLocalization(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var supportedCultures = new[] { new CultureInfo("es-MX"), new CultureInfo("en-US") }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("es-MX"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures }); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseAuthentication(); app.UseMvcWithDefaultRoute(); //app.UseMvc(routes => //{ // routes.MapRoute( // "default", "{controller=Home}/{action=Index}/{id?}"); //}); app.UseRewriter(new RewriteOptions().AddRedirectToHttps()); } } 

My Layout.cshtml contiene quanto segue:

 @await Html.PartialAsync("_SelectLanguagePartial") 

e il mio _SelectLanguagePartial.cshtml contiene:

 @using Microsoft.AspNetCore.Builder @using Microsoft.AspNetCore.Localization @using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.Extensions.Options @inject IViewLocalizer Localizer @inject IOptions LocOptions @{ var requestCulture = Context.Features.Get(); var cultureItems = LocOptions.Value.SupportedUICultures .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName }) .ToList(); var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}"; } 

Oltre a questo, ho creato 2 file di risorse, ErrorMessages.ex-MX.resx e ErrorMessages.resx .

Nel mio HomeController ho aggiunto questa riga ViewBag.Test = ErrorMessages.Test; e nella vista Indice ho aggiunto

@ViewBag.Test

Quando guardo la pagina vedo il menu a discesa con le lingue e solo l’inglese è elencato lì. Il testo che ho visualizzato sulla pagina è quello proveniente da ErrorMessages.resx .

Mi manca un passaggio? Come mai lo spagnolo non viene preso da nessuna parte? Come vedrai più avanti, ho persino provato a impostare lo spagnolo come cultura principale, ma nessuna differenza.

MODIFICARE:

Ho provato a rimuovere eglish dall’elenco e il risultato che ho ottenuto il menu a discesa era ancora lì e questa volta era elencato in spagnolo. Tuttavia, il testo era ancora in inglese.

Poi ho provato ad aggiungere l’inglese come seconda lista dell’elemento e impostare l’inglese come lingua principale e il menu a discesa mostrava solo 1 lingua e lo spagnolo adesso non c’era più.

Ho avuto lo stesso problema circa una settimana fa. L’ho risolto con questo:

 public void ConfigureServices(IServiceCollection services) { services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddMvc() .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) .AddDataAnnotationsLocalization(); services.Configure(options => { var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("es") }; options.DefaultRequestCulture = new RequestCulture(culture: "en", uiCulture: "en"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var locOptions = app.ApplicationServices.GetService>(); app.UseRequestLocalization(locOptions.Value); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvcWithDefaultRoute(); } 

Un altro commento, però. In ASP.NET Core, la risorsa cultura predefinita non deve essere creata, ma solo specifiche:

Quindi, dato

 Views/Shared/Layout.cshtml 

Crea solo

 Resources/Views/Shared/Layout.es-MX.resx 

Notare, inoltre, che stai limitando lo spagnolo al messicano con questo, quindi dovresti avere un fallback, o aggiungere entrambi es e es-MX .