Установите CultureInfo в Core Asp.net, чтобы иметь a. как CurrencyDecimalSeparator вместо,

Я схожу с ума. Я просто хочу, чтобы культура, используемая во всем базовом приложении Asp.net, была установлена на "en-US". Но ничего не работает. Где я могу установить культуру для всего приложения? Я не интересуюсь культурой браузера клиента и чем нет. Единственное, что, кажется, меняет его - это изменение языковых настроек Windows. Я просто хочу, чтобы культура определялась самим приложением, а не клиентом.

Что я уже пробовал:

  • Установите <system.web><globalization uiCulture="en" culture="en-US"/></system.web> в web.config
  • Установить System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; и CurrentUICulture в Startup.Configure и даже в контроллере.
  • Используйте app.UseRequestLocalization(.. как показано ниже

        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);
    

Но, похоже, ничто не меняет CurrencyDecimalSeparator с (nl-NL) на (en-US).

Как можно установить культуру?

РЕДАКТИРОВАТЬ: @soren Вот как выглядит метод конфигурации. Я установил точку останова на DetermineProviderCultureResult но он никогда не срабатывает при посещении веб-сайта.

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"));
        }
    }

Ответ 1

Это то, что решает его для меня:

Установка в StartUp.Configure

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

CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

Ответ 2

Немного поздно, но вот что сработало для меня:

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,
    }
});

Ответ 3

Ваш код выглядит отлично. Проблема заключается в том, что вы звоните в

app.UseRequestLocalization();

Необходимо выполнить до вашего вызова

app.UseMvc();

Причина, по которой ваша точка останова никогда не попадает, заключается в том, что она никогда не заходит так далеко. UseMVC завершает запрос и возвращает результат. Помните, что промежуточное ПО происходит по порядку, и любое из промежуточного программного обеспечения может сократить процесс и прекратить обработку.

Ответ 4

это сработало для меня

 Response.Cookies.Append(
         CookieRequestCultureProvider.DefaultCookieName,
         CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(lang)),
         new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
        );

Ответ 5

Я уверен, что этот код будет работать для вас:

var enUsCulture = new CultureInfo("en-US");
        System.Threading.Thread.CurrentThread.CurrentCulture = enUsCulture;

 NumberFormatInfo nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
        nfi.NumberGroupSeparator = ".";

         String Output = enUsCulture.NumberFormat.CurrencySymbol + **YourInputValue**.ToString("n", nfi);

Примечание. Я предположил, что ваше входное значение должно быть int, double или decimal. и я преобразовываю его в строку.

UPDATE

var enUsCulture = new CultureInfo("en-US");
        enUsCulture.NumberFormat.CurrencyGroupSeparator = ".";
        System.Threading.Thread.CurrentThread.CurrentCulture = enUsCulture;

ОБНОВЛЕНИЕ 2 = Приведение CulterInfo к динамической, а не жестко закодированной культуре культуры

CultureInfo enUsCulture = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.LCID);

Причина заключается в том, что вы не можете напрямую установить значение CultureInfo в качестве значений для чтения. Поэтому вам нужно создать новую CultureInfo, используя тот же поток CultureInfo, и на вновь созданном объекте вы можете установить значения. После этого вы можете назначить вновь обновленный объект обратно в текущий поток. Надеюсь, я уяснил ваши сомнения.