Необходимо убедиться, что языковой заголовок Accept-Language отправляется с каждым запросом на сервер.
Поскольку может быть много API, и проверка того, что заголовок выбранного языка отправляется вместе с каждым из них, может быть громоздкой задачей, используйте функцию HttpInterceptor Angular. Как то так
@Injectable()
export class HTTPListener implements HttpInterceptor {
constructor() {
}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
let languageRequest = req.clone({ setHeaders: { 'Accept-Language': localStorage.getItem("selectedLng") } });
return next.handle(languageRequest).pipe(
map(event => {
return event;
}),
catchError(error => {
}),
finalize(() => {
})
)
}
}
Обратите внимание, что мы читаем выбранный язык из localStorage localStorage.getItem ("selectedLng") и передаем его в заголовок объекта hte HttpRequest ,
Добавьте HttpInterceptor в массив провайдеров вашего root модуля следующим образом
providers: [{ provide: HTTP_INTERCEPTORS, useClass: HTTPListener, multi: true }],
На стороне ядра ASP. NET, внутри метода Configure Startup class,
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use((context, next) =>
{
var userLangs = context.Request.Headers["Accept-Language"].ToString();
var lang = userLangs.Split(',').FirstOrDefault();
//If no language header was provided, then default to english.
if(string.IsNullOrEmpty(lang))
{
lang = "en";
}
//You could set the environment culture based on the language.
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
//you could save the language preference for later use as well.
context.Items["SelectedLng"] = lang;
context.Items["ClientCulture"] = Thread.CurrentThread.CurrentUICulture.Name;
return next();
});
}
Спасибо.