asp.net 核心网站 api angular 7 种多语言支持

asp.net core web api with angular 7 multi language support

我正在开发具有 asp.net 核心网络 API 的 angular 7 应用程序。我的应用程序支持多语言(英语和阿拉伯语)。当用户从 angular 应用程序中选择一种语言时,我会将他的语言偏好保存在本地存储中。现在如何将选定的语言发送到网络 API,以便根据选定的语言,我可以 return 来自服务器的数据,并以他从网络 API 选定的语言显示通知.

您必须确保语言 header Accept-Language 随每个请求发送到服务器。

由于可能有许多 API,并且确保选择的语言 header 与每个 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 的 header HttpRequest object。

像这样将 HttpInterceptor 添加到根模块的提供程序数组中

providers: [{ provide: HTTP_INTERCEPTORS, useClass: HTTPListener, multi: true }],

在 ASP.NET Core 端,在 Startup 的 Configure 方法中 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();
    });
}

谢谢。