Установите 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, и на вновь созданном объекте вы можете установить значения. После этого вы можете назначить вновь обновленный объект обратно в текущий поток. Надеюсь, я уяснил ваши сомнения.