ブラウザからデフォルトの言語を取得しようとしています。次のコードを使用して取得します。
var languages = HttpContext.Request.UserLanguages;
上記は.NET Core 2ではサポートされていないため、以下でテストしました。
var requestContext = Request.HttpContext.Features.Get<IRequestCultureFeature>();
ただし、nullを返します。言語を取得する正しい方法または代替手段は何ですか?
IRequestCultureFeature
は、アプリケーションでサポートされている最初に一致した言語を提供します。スタートアップクラスの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>();
ブラウザ言語は Request Headers から取得できます
コントローラに書き込みます。
//For example --> browserLang = 'en-US'
var browserLang= Request.Headers["Accept-Language"].ToString().Split(";").FirstOrDefault()?.Split(",").FirstOrDefault();
カルチャヘッダーの解析を有効にするローカリゼーションミドルウェアを追加してから、IRequestCultureFeatureを通じて値を取得する必要があります。
このリンクを確認してください: https://github.com/aspnet/Mvc/issues/3549