如何仅在开发模式下为Angular JIT提供语言环境?

时间:2018-08-29 10:29:27

标签: angular typescript angular-services angular-providers angular-i18n

情况

我有Angular 6应用,正在使用不同的语言构建。为生产而构建时,我正在使用AOT编译,但是在开发模式中,我正在使用JIT。

Angular documentation指出,需要通过提供LOCALE_ID来配置JIT编译器的国际化,如下所示:

import { LOCALE_ID, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from '../src/app/app.component';

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ AppComponent ],
  providers: [ { provide: LOCALE_ID, useValue: 'fr' } ],
  bootstrap: [ AppComponent ]
})
export class AppModule {}

问题

该方法很好用,但是由于在生产构建区域设置中由--configuration=<locale>标志设置,我希望仅在开发模式下提供上述{ provide: LOCALE_ID, useValue: 'fr' }提供程序,而不覆盖我的生产配置。理想情况下,它也可以摇树并且完全不包含在生产代码中。

问题

如何仅在开发模式下提供LOCALE_ID?我可以使它成为摇摇欲坠的提供者吗?

可能的解决方案

创建Angular documentation中提到的条件树可摇值提供者的唯一方法是创建注入令牌,如下所示:

import { InjectionToken } from '@angular/core';
import { environment } from '../../environment';

if (environment.production) {
  const LOCALE_TOKEN = new InjectionToken(
    'LOCALE', 
    { providedIn: 'root', factory: () => 'fr' }
  );
}

但是我无法自己创建注入令牌,因为它已经由Angular(LOCALE_ID)创建。

对我来说,似乎只剩下在@NgModule装饰器中提供此令牌了,在这里我无法应用任何条件逻辑,开发和生产版本中都将提供它。

0 个答案:

没有答案