web-dev-qa-db-ja.com

.AspNetCore2.0でブラウザ言語を取得しますか?

ブラウザからデフォルトの言語を取得しようとしています。次のコードを使用して取得します。

var languages = HttpContext.Request.UserLanguages;

上記は.NET Core 2ではサポートされていないため、以下でテストしました。

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

ただし、nullを返します。言語を取得する正しい方法または代替手段は何ですか?

13
Sajeetharan

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>();
    }
}
_
8
Evgeni Nabokov

IRequestCultureFeature機能を取得するには、ローカリゼーションミドルウェアを追加する必要があります。

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

    //Add this:
    app.UseRequestLocalization();

    //...
}

コントローラで、次のような機能をリクエストできます。

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

ブラウザ言語は Request Headers から取得できます

コントローラに書き込みます。

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

カルチャヘッダーの解析を有効にするローカリゼーションミドルウェアを追加してから、IRequestCultureFeatureを通じて値を取得する必要があります。

このリンクを確認してください: https://github.com/aspnet/Mvc/issues/3549

0
FrqSalah