我正在尝试从浏览器中获取默认语言,并使用以下代码来获取它:
var languages = HttpContext.Request.UserLanguages;
由于.NET Core 2不支持上述内容,我测试了:
var requestContext = Request.HttpContext.Features.Get<IRequestCultureFeature>();
但是,它返回null。获得该语言的正确方法或替代方法是什么?
答案 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获取值。