Here is my custom request culture provider which returns \"en\" as a default culture if no culture specified in url (for example http://sypalo.com/ru or http://sypalo.com/en). M
as an additional option, Here is a full solution: Handle culture in route (URL) via RequestCultureProviders
as an option as well, here is a simplified code for 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));
}));
You can get Accept-Language
header from the current Request
and set default language. Your code should be something like this:
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));
}));
});
Inside your 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": //allowed
case "ru": //allowed
lang = firstLang;
break;
default:
//client language not supported
lang = "en"; //use our default
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..
}
Another way to get the Accept-Language header with a framework call (ASP.NET Core):
HttpContext.Request.GetTypedHeaders().AcceptLanguage