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转换方法的管道,就像上面的文章所示。到目前为止运气好吗?这将设置语言一次,如果用户更改设置,它不会传播到应用程序。