如何在 Angular 2 的 DatePipe 中设置语言环境?

IT技术 javascript angular date-pipe
2021-01-15 16:20:20

我想使用欧洲格式显示日期dd/MM/yyyy但使用 DatePipe shortDate格式它只使用美国日期样式显示MM/dd/yyyy
我假设默认语言环境是 en_US。也许我在文档中遗漏了但如何更改 Angular2 应用程序中的默认语言环境设置?或者也许有什么方法可以将自定义格式传递给 DatePipe ?

6个回答

从 Angular2 RC6 开始,您可以通过添加提供程序在应用程序module中设置默认语言环境:

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "en-US" }, //replace "en-US" with your locale
    //otherProviders...
  ]
})

Currency/Date/Number 管道应该选择区域设置。LOCALE_ID 是一个OpaqueToken,从 angular/core 导入。

import { LOCALE_ID } from '@angular/core';

对于更高级的用例,您可能希望从服务中选择语言环境。创建使用日期管道的组件时,区域设置将被解析(一次):

{
  provide: LOCALE_ID,
  deps: [SettingsService],      //some service handling global settings
  useFactory: (settingsService) => settingsService.getLanguage()  //returns locale string
}

希望对你有效。

@corolla 你能解释一下这项服务吗?我想在应用程序运行时更改语言环境,该服务可以吗?我将如何实施此类服务?
2021-03-18 16:20:20
我在这个主题上也挣扎了很多,我希望我写的关于这个的文章可以帮助一些人:medium.com/dailyjs/dynamic-locales-in-angular-dd9a527ebe1f
2021-03-21 16:20:20
要在代码中使用管道,您现在必须将其格式化为new CurrencyPipe('en-US');. 希望这对某些事情有用,因为这在谷歌搜索我的问题时显示为第一个结果。
2021-03-25 16:20:20
@MartijnvandenBergh,该服务只返回区域设置字符串 - 没什么特别的。我们在应用程序运行时尝试更改区域设置的结果好坏参半。结束重新加载页面以处理所有情况。天啊。
2021-04-03 16:20:20
我很惊讶这似乎仍然没有记录在任何地方。不在日期管道页面(angular.io/docs/ts/latest/api/common/index/DatePipe-pipe.html),不在一般管道页面(angular.io/docs/ts/latest/guide/pipes ) .html ) 而这个问题实际上是 Google 上的第一个热门 ( google.com/search?q=angular%202%20locales&rct=j )。很棒的发现。
2021-04-04 16:20:20

如果您想为您的应用设置一次语言,使用 LOCALE_ID 的解决方案非常棒。但它不起作用,如果您想在运行时更改语言。对于这种情况,您可以实现自定义日期管道。

import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Pipe({
  name: 'localizedDate',
  pure: false
})
export class LocalizedDatePipe implements PipeTransform {

  constructor(private translateService: TranslateService) {
  }

  transform(value: any, pattern: string = 'mediumDate'): any {
    const datePipe: DatePipe = new DatePipe(this.translateService.currentLang);
    return datePipe.transform(value, pattern);
  }

}

现在,如果您使用 TranslateService 更改应用程序显示语言(请参阅ngx-translate

this.translateService.use('en');

您的应用程序中的格式应该会自动更新。

使用示例:

<p>{{ 'note.created-at' | translate:{date: note.createdAt | localizedDate} }}</p>
<p>{{ 'note.updated-at' | translate:{date: note.updatedAt | localizedDate:'fullDate'} }}</p>

或者在这里查看我简单的“Notes”项目

在此处输入图片说明

您是否正确声明了 LocalizedDatePipe?请参阅我的示例项目中的pipe.module.ts
2021-03-17 16:20:20
它有效,但请注意使用“不纯”管道比“纯”管道慢。正如Angular 指南所说:Angular 在每个组件更改检测周期中都会执行一个不纯的管道。不纯的管道经常被调用,就像每次击键或鼠标移动一样频繁。考虑到这一点,请谨慎使用不纯的管道。昂贵的、长时间运行的管道可能会破坏用户体验。
2021-03-26 16:20:20
我收到模板解析错误;无法编译过滤器 'localizedDate' 我使用的方法与建议的相同。
2021-03-29 16:20:20
这显然是我正在寻找的。遗憾的是,需要自定义管道才能在运行时更改区域设置。
2021-04-02 16:20:20
是的,我之前已经解决了,@Milan Hlinak 我当时应该只回答我的评论。但无论如何感谢您的及时回复。你做得很好。
2021-04-08 16:20:20

有了angular5上面的回答不再起作用!

以下代码:

app.module.ts

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
    //otherProviders...
  ]
})

导致以下错误:

错误:缺少语言环境“de-at”的语言环境数据。

随着angular5你必须加载并注册在自己所使用的语言环境文件。

app.module.ts

import { NgModule, LOCALE_ID } from '@angular/core';
import { registerLocaleData } from '@angular/common';
import localeDeAt from '@angular/common/locales/de-at';

registerLocaleData(localeDeAt);

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
    //otherProviders...
  ]
})

文档

事实上,如果您需要使用除 en-US 之外的其他语言环境,您应该注册它。感谢您的回答,@zgue
2021-03-23 16:20:20
离子 4 的最佳答案!
2021-03-31 16:20:20
那行得通,但现在百万美元的问题是为什么 Angular 强制语言环境为 en-US 而不是使用 Chrome 或 OS 语言环境?
2021-04-09 16:20:20
好的,这让我又一次头疼了..谢谢!文档有点复杂,因为我认为这registerLocaleData已经足够了,但事实并非如此。
2021-04-11 16:20:20

如果你使用TranslateServicefrom @ngx-translate/core,下面是一个没有创建新管道的版本,它可以在运行时动态切换(在 Angular 7 上测试)。使用 DatePipe 的locale参数 ( docs ):

首先,声明您在应用程序中使用的语言环境,例如app.component.ts

import localeIt from '@angular/common/locales/it';
import localeEnGb from '@angular/common/locales/en-GB';
.
.
.
ngOnInit() {
    registerLocaleData(localeIt, 'it-IT');
    registerLocaleData(localeEnGb, 'en-GB');
}

然后,动态使用您的管道:

myComponent.component.html

<span>{{ dueDate | date: 'shortDate' : '' : translateService.currentLang }}</span>

myComponent.component.ts

 constructor(public translateService: TranslateService) { ... }
为什么你认为这是一个缺点?我有兴趣并想知道 ;)
2021-03-18 16:20:20
如果您有自定义格式怎么办?那也会被本地化吗?
2021-03-26 16:20:20
这出奇的好。你甚至不需要@ngx-translate。你能解释一下模板中的语句是做什么的吗?
2021-03-27 16:20:20
我认为最好的解决方案,但在我的情况下,如果没有 @ngx-translate 和 TranslateService,它就可以很好地工作。
2021-04-08 16:20:20
@lama,dueDate (您要格式化的任何日期) | 日期:'shortDate' (对应于'format'的日期​​管道的第一个参数) :'' (第二个参数=> timeZone,“如果未提供,则使用最终用户的本地系统时区”。)trasnlateService.currentLang (第三个参数=> 本地),选择这个DatePipe
2021-04-11 16:20:20

在 app.module.ts 上添加以下导入。有区域设置选项列表在这里

import es from '@angular/common/locales/es';
import { registerLocaleData } from '@angular/common';
registerLocaleData(es);

然后添加提供者

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "es-ES" }, //your locale
  ]
})

在 html 中使用管道。这是用于此的角度文档

{{ dateObject | date: 'medium' }}
这应该被接受的答案
2021-03-26 16:20:20
我在您的链接下找不到列表,但这里有另一个不错的列表:iteration.info/Sharing/AllAngular5Locales.rtf(取自此处:stackoverflow.com/questions/47285742/locales-in-angular-5
2021-03-27 16:20:20
Justo necesitaba esto!
2021-04-10 16:20:20