我想使用欧洲格式dd/mm/yyyy
显示日期,但使用DatePipe shortDate 格式,它只能使用美国日期样式mm/dd/yyyy
显示。
我假设默认语言环境是en_US。也许我在文档中遗漏了但是如何更改Angular2应用程序中的默认语言环境设置?或者是否有某种方法可以将自定义格式传递给DatePipe?
答案 0 :(得分:232)
从Angular2 RC6开始,您可以通过添加提供商在应用模块中设置默认语言环境:
import { LOCALE_ID } from '@angular/core';
货币/日期/数字管道应该选择区域设置。 LOCALE_ID是OpaqueToken,从angular / core导入。
{
provide: LOCALE_ID,
deps: [SettingsService], //some service handling global settings
useFactory: (settingsService) => settingsService.getLanguage() //returns locale string
}
对于更高级的用例,您可能希望从服务中获取区域设置。当创建使用日期管道的组件时,将解析(一次)区域设置:
"scripts": {
"postcompile": [ "dotnet run" ]
},
希望它适合你。
答案 1 :(得分:47)
如果您想为应用设置一次语言,那么使用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>
或查看我的简单&#34; Notes&#34;项目here。
答案 2 :(得分:40)
使用angular5
上述答案不再有效!
以下代码:
app.module.ts
@NgModule({
providers: [
{ provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
//otherProviders...
]
})
导致以下错误:
错误:缺少区域设置的区域设置数据&#34; de-at&#34;。
使用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...
]
})
答案 3 :(得分:12)
我看过date_pipe.ts,它有两位感兴趣的信息。 靠近顶部的是以下两行:
// TODO: move to a global configurable location along with other i18n components.
var defaultLocale: string = 'en-US';
靠近底部是这一行:
return DateFormatter.format(value, defaultLocale, pattern);
这告诉我,日期管道目前是硬编码为&#39; en-US&#39;。
如果我错了,请赐教。
答案 4 :(得分:4)
你做这样的事情:
{{ dateObj | date:'shortDate' }}
或
{{ dateObj | date:'ddmmy' }}
请参阅: https://angular.io/docs/ts/latest/api/common/index/DatePipe-pipe.html
答案 5 :(得分:4)
在app.module.ts上添加以下导入。这里有一个LOCALE选项的列表。
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中的管道。这是角度here。
{{ dateObject | date: 'medium' }}
答案 6 :(得分:3)
我正在努力解决同样的问题,而且使用这个
并没有为我工作{{dateObj | date:'ydM'}}
所以,我尝试过一种解决方法,而不是最好的解决方案,但它有效:
{{dateObj | date:'d'}}/{{dateObj | date:'M'}}/{{dateObj | date:'y'}}
我总是可以创建自定义管道。
答案 7 :(得分:3)
对于那些遇到AOT问题的人,你需要使用useFactory做一点点不同的事情:
export function getCulture() {
return 'fr-CA';
}
@NgModule({
providers: [
{ provide: LOCALE_ID, useFactory: getCulture },
//otherProviders...
]
})
答案 8 :(得分:1)
如果您使用TranslateService
中的@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) { ... }
答案 9 :(得分:1)
从Angular 9开始的本地化过程已更改。检出official doc。
请遵循以下步骤:
ng add @angular/localize
Angular存储库包含通用语言环境。您可以通过在应用程序的工作区配置文件(angular.json)的sourceLocale字段中设置源语言环境来更改应用程序的源语言环境。构建过程(在本指南的“将翻译合并到应用程序”中进行了描述)使用您应用程序的angular.json文件自动设置LOCALE_ID令牌并加载区域设置数据。
这样在angular.json
中设置语言环境(可以在here中找到可用的语言环境):
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"test-app": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"i18n": {
"sourceLocale": "es"
},
....
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
...
"configurations": {
"production": {
...
},
"ru": {
"localize": ["ru"]
},
"es": {
"localize": ["es"]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "test-app:build"
},
"configurations": {
"production": {
"browserTarget": "test-app:build:production"
},
"ru":{
"browserTarget": "test-app:build:ru"
},
"es": {
"browserTarget": "test-app:build:es"
}
}
},
...
}
},
...
"defaultProject": "test-app"
}
基本上,您需要在sourceLocale
部分中定义i18n
并添加具有特定语言环境(例如"localize": ["es"]
)的构建配置。 (可选)您可以在serve
部分
build
或serve
:ng serve --configuration=es
答案 10 :(得分:0)
复制谷歌管道更改了语言环境,它适用于我的国家,它是可行的,他们没有完成它的所有语言环境。以下是代码。
import {
isDate,
isNumber,
isPresent,
Date,
DateWrapper,
CONST,
isBlank,
FunctionWrapper
} from 'angular2/src/facade/lang';
import {DateFormatter} from 'angular2/src/facade/intl';
import {PipeTransform, WrappedValue, Pipe, Injectable} from 'angular2/core';
import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection';
var defaultLocale: string = 'hr';
@CONST()
@Pipe({ name: 'mydate', pure: true })
@Injectable()
export class DatetimeTempPipe implements PipeTransform {
/** @internal */
static _ALIASES: { [key: string]: String } = {
'medium': 'yMMMdjms',
'short': 'yMdjm',
'fullDate': 'yMMMMEEEEd',
'longDate': 'yMMMMd',
'mediumDate': 'yMMMd',
'shortDate': 'yMd',
'mediumTime': 'jms',
'shortTime': 'jm'
};
transform(value: any, args: any[]): string {
if (isBlank(value)) return null;
if (!this.supports(value)) {
console.log("DOES NOT SUPPORT THIS DUEYE ERROR");
}
var pattern: string = isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
if (isNumber(value)) {
value = DateWrapper.fromMillis(value);
}
if (StringMapWrapper.contains(DatetimeTempPipe._ALIASES, pattern)) {
pattern = <string>StringMapWrapper.get(DatetimeTempPipe._ALIASES, pattern);
}
return DateFormatter.format(value, defaultLocale, pattern);
}
supports(obj: any): boolean { return isDate(obj) || isNumber(obj); }
}
答案 11 :(得分:0)
好的,我使用ngx-translate
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): any {
const date = new Date(value);
const options = { weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
};
return date.toLocaleString(this.translateService.currentLang, options);
}
}
答案 12 :(得分:-1)
这可能有点晚了,但是在我的情况下(角度6),我在DatePipe的顶部创建了一个简单的管道,如下所示:
private _regionSub: Subscription;
private _localeId: string;
constructor(private _datePipe: DatePipe, private _store: Store<any>) {
this._localeId = 'en-AU';
this._regionSub = this._store.pipe(select(selectLocaleId))
.subscribe((localeId: string) => {
this._localeId = localeId || 'en-AU';
});
}
ngOnDestroy() { // Unsubscribe }
transform(value: string | number, format?: string): string {
const dateFormat = format || getLocaleDateFormat(this._localeId, FormatWidth.Short);
return this._datePipe.transform(value, dateFormat, undefined, this._localeId);
}
可能不是最好的解决方案,但简单有效。