在.AspNetCore2.0中获取浏览器语言?

时间:2018-03-20 10:31:41

标签: c# localization asp.net-core-2.0

我正在尝试从浏览器中获取默认语言,并使用以下代码来获取它:

var languages = HttpContext.Request.UserLanguages;

由于.NET Core 2不支持上述内容,我测试了:

var requestContext = Request.HttpContext.Features.Get<IRequestCultureFeature>();

但是,它返回null。获得该语言的正确方法或替代方法是什么?

4 个答案:

答案 0 :(得分:5)

您需要添加本地化中间件才能获得IRequestCultureFeature功能:

public void Configure(IApplicationBuilder app)
{
    //...

    //Add this:
    app.UseRequestLocalization();

    //...
}

现在,您可以在控制器中请求如下功能:

var requestCulture = Request.HttpContext.Features.Get<IRequestCultureFeature>();

答案 1 :(得分:5)

IRequestCultureFeature提供了第一个匹配的语言,您的应用程序支持该语言。在Startup类的Configure()中定义的受支持语言的声明(请参见example)。如果仍然需要像旧的string[]属性一样简单的Request.UserLanguages接受的所有语言,请使用HeaderDictionaryTypeExtensions.GetTypedHeaders()命名空间中定义的Microsoft.AspNetCore.Http扩展名:

// In your action method.
var languages = Request.GetTypedHeaders()
                       .AcceptLanguage
                       ?.OrderByDescending(x => x.Quality ?? 1) // Quality defines priority from 0 to 1, where 1 is the highest.
                       .Select(x => x.Value.ToString())
                       .ToArray() ?? Array.Empty<string>();

数组languages包含根据优先级参数q接受的语言的列表。具有最高优先级的语言是第一位的。要获取默认语言,请使用数组languages的第一个元素。

作为扩展方法:

using System.Collections.Generic;
using System.Linq;

using Microsoft.AspNetCore.Http;

public static class HttpRequestExtensions
{
    public static string[] GetUserLanguages(this HttpRequest request)
    {
        return request.GetTypedHeaders()
            .AcceptLanguage
            ?.OrderByDescending(x => x.Quality ?? 1)
            .Select(x => x.Value.ToString())
            .ToArray() ?? Array.Empty<string>();
    }
}

答案 2 :(得分:2)

您可以从Request Headers

获取浏览器语言

在您的控制器上写:

//For example --> browserLang = 'en-US'
var browserLang= Request.Headers["Accept-Language"].ToString().Split(";").FirstOrDefault()?.Split(",").FirstOrDefault();

答案 3 :(得分:0)

您必须添加本地化中间件才能启用解析文化标头,然后通过IRequestCultureFeature获取值。

点击此链接:https://github.com/aspnet/Mvc/issues/3549