Recently I was tackling a problem with localization in asp.net core. I wanted to get the culture in every request from API and respond based on the requested culture. So I created the following middleware as it's not possible to have access HttpContext in asp.net core by default.
public class CultureValidationMiddleware { private readonly RequestDelegate _next; public CultureValidationMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext) { IHeaderDictionary headers = httpContext.Request.Headers; var culture = CultureManager.GetImplementedCulture(headers["culture"]); var supportedCultures = CultureManager.GetSupportedCultures(); var localizationOptions = new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture(culture), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures }; await _next.Invoke(httpContext); } }
In order to use the above middleware I had to create an extension method like below:
public static class ApplicationBuilderExtensions { public static IApplicationBuilder SetCultureValue(this IApplicationBuilder app) { return app.UseMiddleware<CultureValidationMiddleware>(); } }
The point was this that I couldn’t use app.UseRequestLocalization(); in the startup as I wanted to get the culture in every request! After tackling a lot I found another way to solve the issue.
public class UserProfileRequestCultureProvider : RequestCultureProvider { public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext) { if (httpContext == null) { throw new ArgumentNullException(nameof(httpContext)); } IHeaderDictionary headers = httpContext.Request.Headers; var culture = CultureManager.GetImplementedCulture(headers["culture"]); return Task.FromResult(new ProviderCultureResult(culture)); } }
By configuring the above provider in services of Startup class I solved the issue!
services.Configure<RequestLocalizationOptions>(options => { options.DefaultRequestCulture = new RequestCulture(culture: "fa-ir"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; options.RequestCultureProviders.Clear(); options.RequestCultureProviders.Add(new UserProfileRequestCultureProvider()); });
If you know a better way, please help me!