asp. net core web api с поддержкой angular 7 многоязычности - PullRequest
0 голосов
/ 13 января 2020

Я занимаюсь разработкой приложения angular 7 с базовым веб-API asp. net. Мое приложение поддерживает несколько языков (Engli sh и Arabi c). Когда пользователь выбирает язык из приложения angular, я сохраняю его предпочтения в локальном хранилище. Теперь о том, как отправить выбранный язык в веб-API, чтобы на основе выбранного языка я мог возвращать данные с сервера и отображать уведомление на своем выбранном языке из веб-API.

1 Ответ

1 голос
/ 13 января 2020

Необходимо убедиться, что языковой заголовок 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();
    });
}

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...