【问题标题】:ASP.NET Core Request Localization OptionsASP.NET Core 请求本地化选项
【发布时间】:2016-12-24 16:55:27
【问题描述】:

这是我的自定义请求文化提供程序,如果 url 中没有指定文化(例如 http://sypalo.com/ruhttp://sypalo.com/en),它将返回“en”作为默认文化。 我的想法是以用户浏览器中默认的语言显示网站,所以我正在寻找一种方法来确定它并返回它而不是:return Task.FromResult(new ProviderCultureResult("en", "en"));

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

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

    options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
    {                    
        var pathSegments = context.Request.Path.Value.Split('/');
        if (pathSegments.Count() > 0)
        if (supportedCultures.Select(x => x.TwoLetterISOLanguageName).Contains((pathSegments[1])))
            return Task.FromResult(new ProviderCultureResult(pathSegments[1], pathSegments[1]));
       return Task.FromResult(new ProviderCultureResult("en", "en"));
   }));
});

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core


    【解决方案1】:

    您可以从当前的Request 获取Accept-Language 标头并设置默认语言。你的代码应该是这样的:

    services.Configure<RequestLocalizationOptions>(options =>
    {
        //...
    
        options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
        {                    
           //...
           var userLangs = context.Request.Headers["Accept-Language"].ToString();
           var firstLang = userLangs.Split(',').FirstOrDefault();
           var defaultLang = string.IsNullOrEmpty(firstLang) ? "en" : firstLang;
           return Task.FromResult(new ProviderCultureResult(defaultLang, defaultLang));
       }));
    });
    

    【讨论】:

    • 非常感谢 Adem,这正是我想要的!
    【解决方案2】:

    另一种通过框架调用(ASP.NET Core)获取 Accept-Language 标头的方法:

    HttpContext.Request.GetTypedHeaders().AcceptLanguage

    【讨论】:

    • 不要忘记按优先级排序语言q,例如OrderByDescending(x =&gt; x.Quality ?? 1).
    【解决方案3】:

    在你的public class Startup

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //...
    
        app.Use((context, next) =>
        {
            //get client prefered language
            var userLangs = context.Request.Headers["Accept-Language"].ToString();
            var firstLang = userLangs.Split(',').FirstOrDefault();
    
            //set allowed alanguage
            var lang = "en"; //default
            switch (firstLang)
            {
                case "hy": //allowed
                case "ru": //allowed
                    lang = firstLang; 
                    break;
                default:
                    //client language not supported
                    lang = "en"; //use our default
                    break;
            }
    
            //switch culture
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(lang);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
    
            //save for later use
            context.Items["ClientLang"] = lang;
            context.Items["ClientCulture"] = Thread.CurrentThread.CurrentUICulture.Name;
            
            // Call the next delegate/middleware in the pipeline
            return next();
        });
    
        //... then goes app.UseMvc etc..
    
    }
    

    【讨论】:

      【解决方案4】:

      作为附加选项,这是一个完整的解决方案:Handle culture in route (URL) via RequestCultureProviders

      作为一个选项,这里是 CustomRequestCultureProvider 的简化代码:

      options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
      {
          var lang = context.Request.GetTypedHeaders().AcceptLanguage.FirstOrDefault()?.Value.Value ?? Constants.Languages.EN_US;
      
          return Task.FromResult(new ProviderCultureResult(lang, lang));
      
      }));
      

      【讨论】:

        猜你喜欢
        • 2020-06-16
        • 2017-01-06
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-10-01
        • 1970-01-01
        • 2020-11-29
        相关资源
        最近更新 更多