以下は、カスタムリクエストカルチャープロバイダーです。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"));
}));
});
現在の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));
}));
});
フレームワーク呼び出しでAccept-Languageヘッダーを取得する別の方法(ASP.NET Core):
HttpContext.Request.GetTypedHeaders().AcceptLanguage
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..
}
追加オプションとして、ここに完全なソリューションがあります: ルート(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));
}));