有办法同时在 angular 库和根项目中使用 ngx-translate 吗?
There is a way to use ngx-translate in angular library and in root project at the same time?
我有 angular 库,其中包含一个使用 ngx-translate 进行翻译的组件:
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: WebpackTranslateLoader,
deps: [HttpClient],
},
isolate: true
}),
],
...
})
export class LibraryModule {
...
}
如果我在一个简单的项目中使用这个库 - 它会按预期工作。
但是如果我在一个有自己的 ngx-translate 配置的项目中使用它:
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: WebpackTranslateLoader,
deps: [HttpClient],
},
}),
],
...
那么项目翻译就不行了。翻译取自共享库。
如果我不使用该库,它会按预期工作。
我尝试在库模块中使用 TranslateModule.forChild 并得到这个错误:
AppComponent.html:1 错误 NullInjectorError: StaticInjectorError(AppModule)[TranslateService -> TranslateStore]:
我使用:
"@angular/core": "^9.1.4",
"@ngx-translate/core": "^12.1.2",
"@ngx-translate/http-loader": "^4.0.0",
组件根构造函数中的强制赋值解决了这个问题。
this._translateService.currentLoader = new WebpackTranslateLoader();
但是缺少子库翻译。通过手动合并翻译解决了这个问题:
getTranslation(lang: string): Observable<any> {
const result = forkJoin(
[
from(<rootTranslation>),
new ChildLibraryTranslateLoader().getTranslation(lang)]
).pipe(map(translations => {
return { ...translations[0], ...translations[1] };
}));
return result;
我有 angular 库,其中包含一个使用 ngx-translate 进行翻译的组件:
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: WebpackTranslateLoader,
deps: [HttpClient],
},
isolate: true
}),
],
...
})
export class LibraryModule {
...
}
如果我在一个简单的项目中使用这个库 - 它会按预期工作。 但是如果我在一个有自己的 ngx-translate 配置的项目中使用它:
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: WebpackTranslateLoader,
deps: [HttpClient],
},
}),
],
...
那么项目翻译就不行了。翻译取自共享库。 如果我不使用该库,它会按预期工作。
我尝试在库模块中使用 TranslateModule.forChild 并得到这个错误: AppComponent.html:1 错误 NullInjectorError: StaticInjectorError(AppModule)[TranslateService -> TranslateStore]:
我使用:
"@angular/core": "^9.1.4",
"@ngx-translate/core": "^12.1.2",
"@ngx-translate/http-loader": "^4.0.0",
组件根构造函数中的强制赋值解决了这个问题。
this._translateService.currentLoader = new WebpackTranslateLoader();
但是缺少子库翻译。通过手动合并翻译解决了这个问题:
getTranslation(lang: string): Observable<any> {
const result = forkJoin(
[
from(<rootTranslation>),
new ChildLibraryTranslateLoader().getTranslation(lang)]
).pipe(map(translations => {
return { ...translations[0], ...translations[1] };
}));
return result;