.NET Core MVC RequestLocalization忽略DefaultRequestCulture

ala*_*lan 6 localization asp.net-core-mvc .net-core

我已经通过以下方法使用单个MVC视图实现RequestLocalizationes-ES(注意:此代码仅压缩为最相关的部分):

启动文件

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

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

小智 5

我自己也有同样的问题。看看您的HTTP请求!它们是否包含Accept-Language设置为es-ES(或其他任何内容)的标头?这样您的本地化中间件就可以正常工作了。三个默认值之一RequestCultureProvider,即AcceptLanguageHeaderRequestCultureProvider尝试通过执行您所执行的操作(查找Accept-Language标题)来确定区域性。

所以,不,定位中间件也不能忽视DefaultRequestCulture,因为你和以前的答案建议。


ala*_*lan 3

经过多次试验和错误,我确定设置该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);
    }
Run Code Online (Sandbox Code Playgroud)