我正在使用 asp.net 核心 Web API 开发一个 angular 7 应用程序。我的应用程序支持多语言(英语和阿拉伯语)。当用户从 Angular 应用程序中选择一种语言时,我将他的语言偏好保存在本地存储中。现在如何将选定的语言发送到 Web API,以便基于选定的语言我可以从服务器返回数据,并以他从 Web 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 HttpRequest 对象的 header 中。
像这样将 HttpInterceptor 添加到根模块的 providers 数组中
providers: [{ provide: HTTP_INTERCEPTORS, useClass: HTTPListener, multi: true }],
在 ASP.NET Core 端,在 Startup 类的 Configure 方法中,
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();
});
}
谢谢。
关于angular - 具有 angular 7 多语言支持的 asp.net 核心 web api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712197/