2016-11-05 8 views
10

Szaleję. Chcę tylko, aby kultura używana w całej podstawowej aplikacji Asp.net była ustawiona na "en-US". Ale nic nie działa. Gdzie mogę ustawić kulturę dla całej aplikacji? Nie interesują mnie kultury przeglądarek klientów, a co nie. Jedyną rzeczą, która wydaje się to zmieniać, jest zmiana ustawień językowych systemu Windows. Chcę tylko, aby kultura została ustalona z poziomu samej aplikacji, a nie klienta.Ustaw CultureInfo w Asp.net Core, aby mieć. jako CurrencyDecimalSeparator zamiast,

Co próbowałem dotąd:

  • Set <system.web><globalization uiCulture="en" culture="en-US" /></system.web> w web.config
  • Ustaw System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; i CurrentUICulture w Startup.Configure a nawet w kontrolerze.
  • Zastosowanie app.UseRequestLocalization(.. jak pokazano poniżej

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

Ale nic nie wydaje się, aby zmienić CurrencyDecimalSeparator od (nl-NL), do (en-US).

Jak można ustawić kulturę?

EDIT: @soren ten sposób metoda configure wygląda. Wprowadziłem punkt przerwania na DetermineProviderCultureResult, ale nigdy nie jest trafiony podczas odwiedzania strony.

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

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

.net rdzeń nie patrzeć na web.config już, ale wszystko, co uczynił było tak dobrze Mike. Mam kilka wielojęzycznych projektów w rdzeniu .net 1.0.1. mógłbyś udostępnić więcej kodu z twojego Startup.cs ... – Soren

Odpowiedz

22

To co rozwiązuje to dla mnie:

Ustawianie podążając StartUp.Configure

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

CultureInfo.DefaultThreadCurrentCulture = cultureInfo; 
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; 
+0

Pracowałem z CsvHelper, gdy zgłosiłem ten problem. Ta sztuczka się udała. Dzięki! – Abhi

+0

Mike widział odpowiedź od użytkownika mindingdata? Wygląda na to, że to jest ... – Pascal

+0

@Pascal Nie próbowałem tego sam. Jeśli więcej osób przegłosuje komentarz lub inną odpowiedź, jestem oczywiście skłonny do przyjęcia tej akceptowanej odpowiedzi. Osądź mnie, ale nie mam teraz żadnej motywacji, aby samemu to wypróbować: $. –

-1

Jestem pewien, że ten kod będzie pracować dla Ciebie:

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

Uwaga: Mam założyć swoją wartość wejściowa powinna być int, podwójne lub dowolny dziesiętny. i zamieniam go na ciąg.

UPDATE

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

UPDATE 2 = Dokonywanie CulterInfo wziąć Kultura dynamicznie zamiast zakodowane

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

Powodem jest to, że nie można bezpośrednio ustawić wartość CultureInfo jako jego tylko do odczytu wartości. Musisz więc utworzyć nową CultureInfo, korzystając z CultureInfo tego samego wątku, a na nowo utworzonym obiekcie możesz ustawić wartości. Po tym czasie możesz przypisać nowo zaktualizowany obiekt do bieżącego wątku. Mam nadzieję, że rozwiałem twoje wątpliwości.

+0

Myślę, że nie powinienem formatować każdego dziesiętnego, który jest wystawiony. Konieczna jest konfiguracja kultury w jednym miejscu. Problem polega na tym, że nie wiem gdzie i jak w rdzeniu asp.net –

+0

@MikedeKlerk Mam zaktualizowaną odpowiedź i działa ona dla mnie w mojej aplikacji testowej. Mam nadzieję, że działa również dla Ciebie! –

+0

Jestem pewien, że wybiera właściwy format. Chodzi o to, że nie widzę, jak to jest rozwiązanie o zasięgu projektowym. Jeśli rozumiem odpowiedź, którą podałeś, należy to zrobić dla każdego zgaszonego numeru. –

3

Twój kod wygląda wszystko jest w porządku.Zagadnienie to wezwanie do

app.UseRequestLocalization(); 

musi się zdarzyć przed wywołaniem

app.UseMvc(); 

Powodem Twój punkt przerwania nigdy nie jest to hit, bo nigdy nie idzie tak daleko. UseMVC wypełnia żądanie i zwraca wynik. Pamiętaj, że oprogramowanie pośredniczące dzieje się w odpowiedniej kolejności, a dowolne oprogramowanie pośredniczące może skrócić proces i zatrzymać przetwarzanie dalej.

6

Trochę późno, ale tutaj jest to, co pracował dla mnie:

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

Bardzo dobrze, zaimplementowałem go w ubuntu 16.04 i działałem dobrze –