web-dev-qa-db-ja.com

ASP.NET Coreリクエストローカリゼーションオプション

以下は、カスタムリクエストカルチャープロバイダーです。URLでカルチャーが指定されていない場合、デフォルトのカルチャーとして "en"を返します(例 http://sypalo.com/r または http:// sypalo.com/en )。ユーザーのブラウザーのデフォルトであるその言語でWebサイトを表示するという私の考えなので、代わりにそれを特定して返す方法を探しています。return Task.FromResult(new ProviderCultureResult( "en"、 "en"));

services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en"),
        new CultureInfo("ru")                            
    };

    options.DefaultRequestCulture = new RequestCulture(culture: "en", uiCulture: "en");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

    options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
    {                    
        var pathSegments = context.Request.Path.Value.Split('/');
        if (pathSegments.Count() > 0)
        if (supportedCultures.Select(x => x.TwoLetterISOLanguageName).Contains((pathSegments[1])))
            return Task.FromResult(new ProviderCultureResult(pathSegments[1], pathSegments[1]));
       return Task.FromResult(new ProviderCultureResult("en", "en"));
   }));
});
12
Sergey Sypalo

現在のRequestからAccept-Languageヘッダーを取得して、デフォルトの言語を設定できます。コードは次のようになります。

services.Configure<RequestLocalizationOptions>(options =>
{
    //...

    options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
    {                    
       //...
       var userLangs = context.Request.Headers["Accept-Language"].ToString();
       var firstLang = userLangs.Split(',').FirstOrDefault();
       var defaultLang = string.IsNullOrEmpty(firstLang) ? "en" : firstLang;
       return Task.FromResult(new ProviderCultureResult(defaultLang, defaultLang));
   }));
});
16
adem caglin

フレームワーク呼び出しでAccept-Languageヘッダーを取得する別の方法(ASP.NET Core):

HttpContext.Request.GetTypedHeaders().AcceptLanguage

13
Dennis de Laat

public class Startup

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //...

    app.Use((context, next) =>
    {
        //get client prefered language
        var userLangs = context.Request.Headers["Accept-Language"].ToString();
        var firstLang = userLangs.Split(',').FirstOrDefault();

        //set allowed alanguage
        var lang = "en"; //default
        switch (firstLang)
        {
            case "hy":
                lang = "hy"; //allowed
                break;
            case "ru":
                lang = "ru"; //allowed
                break;
        }

        //switch culture
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(lang);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        //save for later use
        context.Items["ClientLang"] = lang;
        context.Items["ClientCulture"] = Thread.CurrentThread.CurrentUICulture.Name;

        // Call the next delegate/middleware in the pipeline
        return next();
    });

    //... then goes app.UseMvc etc..

}
1
Nick Kovalsky

追加オプションとして、ここに完全なソリューションがあります: ルート(URL)のカルチャーをRequestCultureProvidersで処理する

オプションとして、CustomRequestCultureProviderの簡略化されたコードは次のとおりです。

options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
{
    var lang = context.Request.GetTypedHeaders().AcceptLanguage.FirstOrDefault()?.Value.Value ?? Constants.Languages.EN_US;

    return Task.FromResult(new ProviderCultureResult(lang, lang));

}));
0
Dongdong