我曾经遇到同样的问题,并找到了一个解决方法。
我决定在资产文件夹中发布来自cldr的angular本地化数据。 Cldr数据来自node_mopdules \ @ angular \ common \ locales(您将在typescript中导入的内容)。
在引导之前,使用APP_INITIALIZER,我根据特定的locale_id从资产中加载当前文化数据。
诀窍是避免使用import
关键字,因为EC2015不支持动态导入。
为了从js文件中获取文化数据,我编写了这个“肮脏”的代码:
import { Injectable, Inject, LOCALE_ID } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class LoaderService {
constructor(protected httpClient: HttpClient,
@Inject(LOCALE_ID) protected locale: string) { }
private async loadAngularCulture(locale) {
let angularLocaleText = await this.httpClient.get(`assets/angular-locales/${locale}.js`).toPromise();
const startPos = angularLocaleText.indexOf('export default ');
angularLocaleText = 'return ' + angularLocaleText.substring(startPos + 15).replace('plural', null);
const f = new Function(angularLocaleText);
const angularLocale = f();
registerLocaleData(angularLocale);
}
这是我的主模块,使用了APP_INITIALIZER:
export function configFactory(intlLoader: SfkIntlLoaderService) {
return intlLoader.initializer();
}
export function localFunction() {
return localStorage.getItem('LANGUGAGE');
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule
)
],
providers: [
LoaderService,
{
provide: LOCALE_ID,
deps: [],
useFactory: localFunction
},
{
provide: APP_INITIALIZER,
useFactory: configFactory,
deps: [LoaderService],
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
希望这能有所帮助!