在Asp.net Core中设置CultureInfo有一个.作为CurrencyDecimalSeparator而不是,

Mik*_*erk 29 c# asp.net-core

我疯了.我只想将整个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);
    
    Run Code Online (Sandbox Code Playgroud)

但似乎没有任何东西可以将CurrencyDecimalSeparator从(nl-NL)更改为(en-US).

如何设定文化?

编辑: @soren这是configure方法的样子.我已经设置了一个断点,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"));
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mik*_*erk 69

这就是为我解决的问题:

在中设置以下内容 StartUp.Configure

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

CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
Run Code Online (Sandbox Code Playgroud)

  • 此评论对于该线程来说有点偏离主题,但对于在欧洲使用“en-US”作为线程文化的任何人来说值得一提:请不要将 US 设置为文化,因为它将所有日期放入月日年中格式,这不是美国以外所有其他国家/地区使用的格式,而且只会造成混乱。如果您在欧洲网站上使用英语,请考虑使用“en-GB”以便以欧洲格式显示日期。写美国英语。如果您确实愿意,请添加到您的 en-GB 资源文件中,但请不要在欧洲网站上将 UI 区域性设置为“en-US”。 (3认同)

ben*_*aay 22

有点晚了,但这对我有用:

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,
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这里有一篇很好的文章解释了正在发生的事情:https://dotnetcoretutorials.com/2017/06/22/request-culture-asp-net-core/ (2认同)

Rez*_*abi 21

本地化在Startup.ConfigureServices方法中配置:

CultureInfo[] supportedCultures = new[]
           {
            new CultureInfo("ar"),
            new CultureInfo("fa"),
            new CultureInfo("en")
        };

        services.Configure<RequestLocalizationOptions>(options =>
        {
            options.DefaultRequestCulture = new RequestCulture("ar");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
            options.RequestCultureProviders = new List<IRequestCultureProvider>
                {
                    new QueryStringRequestCultureProvider(),
                    new CookieRequestCultureProvider()
                };

        });
Run Code Online (Sandbox Code Playgroud)

启动.配置方法

 app.UseRequestLocalization();
Run Code Online (Sandbox Code Playgroud)

然后UseRequestLocalization初始化一个RequestLocalizationOptions对象。这应该至少放在您的UseMvc调用之前

改变文化:

[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
    Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(new     RequestCulture(culture)),
    new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
    );

    return LocalRedirect(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)

当前语言:

var currentLanguage = HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;
Run Code Online (Sandbox Code Playgroud)

  • 这是全部答案的总结。并应验证为可接受的答案 (3认同)

Min*_*ata 12

你的代码看起来很好.问题是你的电话

app.UseRequestLocalization();
Run Code Online (Sandbox Code Playgroud)

需要在你打电话之前发生

app.UseMvc();
Run Code Online (Sandbox Code Playgroud)

你的断点永远不会被击中的原因是因为它从未走得那么远.UseMVC完成请求并返回结果.请记住,中间件按顺序发生,任何一个中间件都可以使进程短路并停止进一步处理.

  • 对于 .NET Core 3.x 及更高版本,我认为应该在 `app.UseRouting()` 之前添加 (2认同)