2017-06-14 67 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