我正在尝试从浏览器中获取默认语言,我使用以下代码来获取:
var languages = HttpContext.Request.UserLanguages;
由于以上内容不支持 .NET Core 2,因此我进行了测试:
var requestContext = Request.HttpContext.Features.Get<IRequestCultureFeature>();
然而,它返回了null。获取语言的正确方式或替代方法是什么?
我正在尝试从浏览器中获取默认语言,我使用以下代码来获取:
var languages = HttpContext.Request.UserLanguages;
由于以上内容不支持 .NET Core 2,因此我进行了测试:
var requestContext = Request.HttpContext.Features.Get<IRequestCultureFeature>();
然而,它返回了null。获取语言的正确方式或替代方法是什么?
IRequestCultureFeature
提供了应用程序支持的第一个匹配语言。支持的语言的声明在 Startup 类的 Configure() 方法中定义(参见示例)。如果您仍需要所有已接受的语言作为简单的 string[]
,类似于旧的 Request.UserLanguages
属性,则可以使用 Microsoft.AspNetCore.Http
命名空间中定义的 HeaderDictionaryTypeExtensions.GetTypedHeaders()
扩展。
// 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>();
}
}
您需要添加本地化中间件才能获取 IRequestCultureFeature
特性:
public void Configure(IApplicationBuilder app)
{
//...
//Add this:
app.UseRequestLocalization();
//...
}
现在你可以在你的控制器中像这样请求该功能:
var requestCulture = Request.HttpContext.Features.Get<IRequestCultureFeature>();
IRequestCultureFeature
接口的服务,就像OP在问题中使用的那样。 OP认为这是正确的,并接受了它,所以感谢你的投票! - DavidGrequestCulture
对象。所以类似于 var requestedCulture = requestCulture.RequestCulture;
这样的东西。 - DavidG//For example --> browserLang = 'en-US'
var browserLang= Request.Headers["Accept-Language"].ToString().Split(";").FirstOrDefault()?.Split(",").FirstOrDefault();
builder.Services.Configure<RequestLocalizationOptions>(config =>
{
CultureInfo en = new CultureInfo("en");
CultureInfo ru = new CultureInfo("ru");
var langs = new List<CultureInfo> { en, ru };
config.DefaultRequestCulture = new RequestCulture(en);
config.SupportedCultures = langs;
config.SupportedUICultures = langs;
});
app.UseRequestLocalization();
public IActionResult Index()
{
var languageRequest = HttpContext.Features.Get<IRequestCultureFeature>()?.RequestCulture.Culture.Name;
// use switch with languageRequest or another your logic
}
另外,您不能使用builder.Services.Configure,否则在languageRequest中您将收到语言的完整名称。例如:"en-En","ru-RU"等...
您需要添加本地化中间件以启用解析区域设置标头,然后通过IRequestCultureFeature获取值。