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();
});
}
谢谢。
我正在开发具有 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();
});
}
谢谢。