2017-06-14 64 views
2

我已經通過以下實現RequestLocalizationes-ES與單個MVC視圖(注:此代碼冷凝,只有最相關的片段):.NET核心MVC RequestLocalization忽略DefaultRequestCulture

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, 
            opts => 
            { 
             opts.ResourcesPath = "Resources"; 
            }); 
} 


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    var english = "en-US"; 
    var englishRequestCulture = new RequestCulture(culture: english, uiCulture: english); 
    var supportedCultures = new List<CultureInfo> 
         { 
          new CultureInfo("en-US"), 
          new CultureInfo("es-ES") 
         }; 

    var options = new RequestLocalizationOptions 
      { 
       DefaultRequestCulture = englishRequestCulture, 
       SupportedCultures = supportedCultures, 
       SupportedUICultures = supportedCultures 
      }; 

    app.UseRequestLocalization(options); 
    app.UseMvc(); 
} 

當通過culture=en-USculture=es-ES作爲查詢字符串參數時,這可以很好地工作。我的期望是,當沒有文化提供時,默認文化應該是en-US。但是,當我不提供文化參數時,我的觀點默認爲es-ES。我已確認所有其他本地化提供商也默認爲en-US

我也應該注意到,我通過ConfigureServices()試圖本地化,但未能得到這所有功能:

   services.Configure<RequestLocalizationOptions>(
      options => 
      { 
       var supportedCultures = new List<CultureInfo> 
        { 
         new CultureInfo("en-US"), 
         new CultureInfo("es-ES") 
        }; 

       options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"); 
       options.SupportedCultures = supportedCultures; 
       options.SupportedUICultures = supportedCultures; 
      }); 

回答

2

大量的試驗和錯誤之後,我決定設置DefaultRequestCulture屬性沒有影響,並因此,CookieRequestCultureProvider實際上是默認爲es-ES(儘管我不完全確定爲什麼,這臺機器運行的機器設置爲英語和美國語言環境)。

作爲一種變通方法我修改了現有的Configure()方法來刪除其它(當前未使用)供應商:

private void ConfigureApplicationLocalization(IApplicationBuilder app) 
    { 
     var english = "en-US"; 
     var englishRequestCulture = new RequestCulture(culture: english, uiCulture: english); 
     var supportedCultures = new List<CultureInfo> 
        { 
         new CultureInfo("en-US"), 
         new CultureInfo("es-ES") 
        }; 

     var options = new RequestLocalizationOptions 
     { 
      DefaultRequestCulture = englishRequestCulture, 
      SupportedCultures = supportedCultures, 
      SupportedUICultures = supportedCultures 
     }; 

     //RequestCultureProvider requestProvider = options.RequestCultureProviders.OfType<AcceptLanguageHeaderRequestCultureProvider>().First(); 
     //requestProvider.Options.DefaultRequestCulture = englishRequestCulture; 

     RequestCultureProvider requestProvider = options.RequestCultureProviders.OfType<CookieRequestCultureProvider>().First(); 
     options.RequestCultureProviders.Remove(requestProvider); 

     app.UseRequestLocalization(options); 
    } 
2

我有同樣的問題我自己。看看你的HTTP請求!他們是否包含設置爲es-ES(或其他)的Accept-Language標題?然後你的本地化中間件工作得很好。三個默認RequestCultureProvider之一,即AcceptLanguageHeaderRequestCultureProvider,試圖通過做你做的事情來確定文化 - 尋找Accept-Language標題。

因此,不,本地化中間件確實不是忽略DefaultRequestCulture,因爲您和以前的答案建議。

+0

這是不是這樣對我,我證實了沒文化的值都設置在管道的任何一點。 – alan