import {HttpClient} from '@angular/common/http'; import {TranslateLoader} from '@ngx-translate/core'; import {Observable, forkJoin} from 'rxjs'; import {map} from 'rxjs/operators'; // 这种语法只有在tsconfig.json中新增"esModuleInterop": true, 才不会报错 import merge from 'deepmerge'; import { Injector, InjectionToken } from '@angular/core'; export interface ITranslationResource { prefix: string; suffix: string; } /** * 其他翻译资源 */ export const NA_TRANSLATE_RESOURCES = new InjectionToken( 'NA_TRANSLATE_RESOURCES' ); export class MultiTranslateHttpLoader implements TranslateLoader { constructor( private http: HttpClient, private resources: ITranslationResource[], private injector: Injector ) {} /** * 获取翻译资源 * * @param lang 语言 */ public getTranslation(lang: string): Observable { const obs: Observable[] = []; const translateResources = this.injector.get(NA_TRANSLATE_RESOURCES, []); translateResources.forEach(tr => { obs.push(tr.getTranslation(lang)); }); const requests = this.resources.map(resource => { return this.http.get(resource.prefix + lang + resource.suffix); }); obs.push(...requests); // const merge = require('deepmerge').default; return forkJoin(obs).pipe(map(response => { const mergeResponse = []; response.forEach(item => { if (item) { mergeResponse.push(item); } }); // 如果response数组内存在null,这里会报错 return merge.all(mergeResponse); })); } }