net iviewlocalizer example asp and c# asp.net-core

c# - iviewlocalizer - globalization and localization asp net core



Establezca CultureInfo en Asp.net Core para tener un archivo. como CurrencyDecimalSeparator en lugar de, (3)

Esto es lo que me resuelve:

Configurando lo siguiente en StartUp.Configure

var cultureInfo = new CultureInfo("en-US"); cultureInfo.NumberFormat.CurrencySymbol = "€"; CultureInfo.DefaultThreadCurrentCulture = cultureInfo; CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

Me estoy volviendo loco. Solo quiero que la cultura utilizada en toda la aplicación central de Asp.net se establezca en "en-US". Pero nada parece funcionar. ¿Dónde establezco la cultura para toda la aplicación? No estoy interesado en las culturas del navegador del cliente y lo que no. Lo único que parece cambiarlo es cambiar la configuración de idioma de Windows. Solo quiero que la cultura sea determinada desde dentro de la aplicación en sí, no por el cliente.

Lo que he intentado hasta ahora:

  • Establecer <system.web><globalization uiCulture="en" culture="en-US" /></system.web> en web.config
  • Establecer System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; y CurrentUICulture en Startup.Configure e incluso en el controlador.
  • Use app.UseRequestLocalization(.. como se muestra a continuación

    var enUsCulture = new CultureInfo("en-US"); var localizationOptions = new RequestLocalizationOptions() { SupportedCultures = new List<CultureInfo>() { enUsCulture }, SupportedUICultures = new List<CultureInfo>() { enUsCulture }, DefaultRequestCulture = new RequestCulture(enUsCulture), FallBackToParentCultures = false, FallBackToParentUICultures = false, RequestCultureProviders = null }; app.UseRequestLocalization(localizationOptions);

Pero nada parece cambiar el MonedaDecimalSeparador de (nl-NL) a (en-US).

¿Cómo se puede establecer la cultura?

EDIT: @soren Así es como se ve el método de configuración. He puesto un punto de interrupción en DetermineProviderCultureResult pero nunca se ha alcanzado al visitar el sitio web.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, FinOsDbContext context) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseIdentity(); // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); //TODO: Clean up //var cultureInfo = new CultureInfo("en-US"); //System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; //System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; app.UseRequestLocalization(); // UseCookieAuthentication.. // UseJwtBearerAuthentication.. //add userculture provider for authenticated user var requestOpt = new RequestLocalizationOptions(); requestOpt.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US") }; requestOpt.SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US") }; requestOpt.RequestCultureProviders.Clear(); requestOpt.RequestCultureProviders.Add(new SingleCultureProvider()); app.UseRequestLocalization(requestOpt); FinOsDbContext.Initialize(context); FinOsDbContext.CreateTestData(context); } public class SingleCultureProvider : IRequestCultureProvider { public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext) { return Task.Run(() => new ProviderCultureResult("en-US", "en-US")); } }


Tu código se ve bien. El tema es tu llamada a

app.UseRequestLocalization();

Tiene que suceder antes de su llamada a

app.UseMvc();

La razón por la que nunca se alcanza tu punto de ruptura es porque nunca llega tan lejos. UseMVC completa la solicitud y devuelve el resultado. Recuerde, el middleware sucede en orden y cualquiera de los middleware puede provocar un cortocircuito en el proceso y detener el procesamiento.


Un poco tarde pero aquí es lo que funcionó para mí:

var defaultDateCulture = "fr-FR"; var ci = new CultureInfo(defaultDateCulture); ci.NumberFormat.NumberDecimalSeparator = "."; ci.NumberFormat.CurrencyDecimalSeparator = "."; // Configure the Localization middleware app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture(ci), SupportedCultures = new List<CultureInfo> { ci, }, SupportedUICultures = new List<CultureInfo> { ci, } });