所以,我们正在使用APP_INITIALIZER在app load上加载一些设置(通过http)....但问题是这些设置取决于语言路径
所以 mydomain.com/en 获得不同的设置 mydomain.com/it
我们如何(安全地)从应用程序路径中确定语言?
这是我们现在的逻辑
site.service.ts
load(): Promise<SiteConfiguration> {
const promise = this.getSiteSettings().toPromise();
promise.then(config => {
this.config = config;
return config;
}
return promise;
}
getSiteSettings(): Observable<any> {
// language logic supposed to be
const langId = 'en';
return this.http.get(`${environment.apiPath}/${langId}.siteconfiguration.json`)
.map(res)
.catch((error: any) => Observable.throw(error || 'Server error'));
}
假设语言始终是路径中的第一个参数
答案 0 :(得分:1)
假设您在后端使用express / nodejs
在后端服务器上,从快速请求中识别语言ID
let languageId = req.path.split('/')[1];
在后端服务器上,提供语言URL
renderModuleFactory(AppServerModuleNgFactory, {
// Our index.html
document: template,
url: url,
extraProviders: [
provideModuleMap(LAZY_MODULE_MAP),
{
provide: 'languageId',
useValue: languageId
}
]
修改初始化服务以注入语言
constructor(private http: HttpClient, @Inject(PLATFORM_ID) private
platformId: Object, @Optional() @Inject('languageId') protected languageId: string)
{
}
使用注入值
getSiteSettings(): Observable<any> {
const langId = isPlatformBrowser(this.platformId)? window.location.pathname.split('/')[1] : this.languageId;
return this.http.get(`${environment.apiPath}/${langId}.siteconfiguration.json`)
.map(res)
.catch((error: any) => Observable.throw(error || 'Server error'));
}