Angular 从可观察服务设置区域设置\u ID

Angular 从可观察服务设置区域设置\u ID,angular,observable,currency-pipe,Angular,Observable,Currency Pipe,我有一项提供全球应用程序语言的服务,如下所示: 导出类语言服务{ 私有currentLanguage$=新的ReplaySubject(); getCurrentLanguage():可观察{ 返回此.currentLanguage$.asObservable(); } }只需将此声明添加到提供者列表中即可 { provide: LOCALE_ID, deps: [LanguageService], useFactory: (languageService) => la

我有一项提供全球应用程序语言的服务,如下所示:

导出类语言服务{
私有currentLanguage$=新的ReplaySubject();
getCurrentLanguage():可观察<字符串>{
返回此.currentLanguage$.asObservable();
}

}
只需将此声明添加到提供者列表中即可

{
  provide: LOCALE_ID,
  deps: [LanguageService],   
  useFactory: (languageService) => languageService.getLanguage() 
}

另外,您可能需要从getLanguage方法返回一个承诺,因为它们不支持Observable(据我所知)。

Angular的解决方案是使用i18n创建多个构建。当然,出于某些原因,这可能是不可能的

我几乎遇到了与datepipe相同的问题,唯一的区别是我使用了一个局部变量

首先,我尝试在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时不起作用。我的解决方案是创建我自己的datepipe,它扩展了角度datepipe

结果是:

@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。

关于你的期望是什么,这个问题还不够清楚。在应用程序的生命周期内,语言是否应该更改?谢谢,为了清晰起见,我编辑了我的问题。Angular内置i18n不适合在运行中更改语言。与任何其他提供程序一样,
LOCALE\u ID
是一个单例(在根注入器中),实例化后不能更改其值。为动态语言使用第三方解决方案,如ngx translate。请参阅示例。但我使用的是ngx翻译!!我只希望CurrencyPipe尊重当前用户语言,而不是始终将浏览器区域设置作为默认设置,即使用户明确更改了他们的语言。然后,您需要创建一个包装CurrencyPipe转换方法的管道,就像上面的文章所示。到目前为止运气好吗?这将设置语言一次,如果用户更改设置,它不会传播到应用程序。