Положение
У меня есть приложение Angular 6, которое я создаю на разных языках. При сборке для производства я использую компиляцию AOT, но в режиме разработки я использую JIT.
Угловая документация гласит, что интернационализация для JIT-компилятора должна быть настроена путем предоставления LOCALE_ID
, как показано ниже:
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 , - создать токен впрыска, как показано ниже:
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
декораторе, где я не могу применить условную логику, и он будет предоставлен как в разработке, так и в производственной сборке.