我有一个提供全局应用语言的服务,如下所示:
export class LanguageService {
private currentLanguage$ = new ReplaySubject < string > ();
getCurrentLanguage(): Observable < string > {
return this.currentLanguage$.asObservable();
}
}
我使用这项服务在整个应用程序中提供动态的语言切换。所有组件都遵循上述函数提供的语言('en‘、'fr’等)我希望CurrencyPipe
也能这么做。
据我所知,我可以通过LOCALE_ID
提供这一点,但我在文档中找不到关于如何做到这一点的示例或指导,尤其是关于如何使用可观察对象提供它的示例或指导。
发布于 2017-06-25 20:09:55
根据Angular的解决方案是使用i18n创建多个构建。当然,由于某些原因,这可能是不可能的。
我几乎得到了与日期管道相同的问题,唯一的区别是我使用的是局部变量。
首先,我尝试在我的appModule中提供以下内容:
{
provide: LOCALE_ID, deps: [WindowRef], useFactory(windowRef: WindowRef) {
return windowRef.ln;
}
}
服务:
@Injectable()
export class WindowRef {
get nativeWindow(): any {
return _window();
}
public ln = 'en';
constructor() {
try {
if (!isNullOrUndefined(this.nativeWindow.navigator.language) && this.nativeWindow.navigator.language !== '') {
this.ln = this.nativeWindow.navigator.language;
}
}finally {}
}
}
但在使用AOT时,这对我不起作用。我的解决方案是创建自己的日期管道,它扩展了角度日期管道。
这就是结果:
@Pipe({name: 'datepipe', pure: true})
export class MyDatePipe extends DatePipe implements PipeTransform {
constructor(private win: WindowRef) {
super(win.ln);
}
transform(value: any, pattern?: string): string | null {
return super.transform(value, pattern);
}
}
您可以执行几乎相同的操作,但需要扩展currencyPipe。
发布于 2017-06-25 18:38:19
只需将此声明添加到提供程序的列表中。
{
provide: LOCALE_ID,
deps: [LanguageService],
useFactory: (languageService) => languageService.getLanguage()
}
另外,您可能需要从您的getLanguage方法返回一个Promise,因为它们不支持Observable (据我所知)。
https://stackoverflow.com/questions/44748461
复制相似问题