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

Saj*_*ran 12 c# localization azure asp.net-core-2.0

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

var languages = HttpContext.Request.UserLanguages;
Run Code Online (Sandbox Code Playgroud)

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

var requestContext = Request.HttpContext.Features.Get<IRequestCultureFeature>();
Run Code Online (Sandbox Code Playgroud)

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

Evg*_*kov 9

IRequestCultureFeature提供第一种匹配的语言,您的应用程序支持该语言。在Startup类的Configure()中定义的受支持语言的声明(请参阅示例)。如果您仍然需要所有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>();
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这很有用。我不明白的是为什么 Core 中的事情要复杂得多? (2认同)

Dav*_*idG 7

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

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

    //Add this:
    app.UseRequestLocalization();

    //...
}
Run Code Online (Sandbox Code Playgroud)

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

var requestCulture = Request.HttpContext.Features.Get<IRequestCultureFeature>();
Run Code Online (Sandbox Code Playgroud)

  • @DavidG 首先,从您的示例中,不清楚如何从 IRequestCultureFeature 获取任何语言。请提供更多信息示例。其次,IRequestCultureFeature 不能替代 UserLanguages。我有使用用户语言作为字符串 [] 的接口。我无法更改接口,也不能仅从 Culture 或 UICulture(与第一个支持的语言相匹配)创建 1 元素数组,因为我需要所有接受的语言才能进一步传递它们。我得出的结论是我必须手动解析 accept-languages 标头(由 Carlos Tenorio 编写)。这很可悲。 (2认同)

Car*_*rez 7

您可以从请求标头获取浏览器语言

在你的控制器上写下:

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

  • 丢弃优先级参数“q”是一个坏主意。 (4认同)