Skip to content

Commit 3dd0d32

Browse files
committed
feat: add option to override locale
1 parent bae651a commit 3dd0d32

File tree

12 files changed

+83
-16
lines changed

12 files changed

+83
-16
lines changed

Diff for: CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Added
6+
7+
* Add option to override locale
8+
39
## 0.1.0 - 2023-02-19
410

511
### Added

Diff for: README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,11 @@ loading any locale date. This package re-implements some Angular built-in pipes
100100

101101
## Feature Roadmap
102102

103+
* Number pipe(s): decimal, currency, percentage
104+
* Performance: Prepare Intl.* object with default options, only construct new object when necessary
103105
* Country pipe
104-
* Number pipe(s)
105106
* Relative time
107+
* Migration Schematics for usages of Angular pipes
106108

107109
## Chore Roadmap
108110

Diff for: projects/angular-ecmascript-intl/src/lib/date/intl-date.pipe.spec.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,22 @@ describe('DatePipe', () => {
129129
});
130130
testUnit = TestBed.inject(IntlDatePipe);
131131

132-
expect(testUnit.transform('2023-02-19', { dateStyle: 'medium' })).toEqual('Feb 19, 2023');
132+
expect(testUnit.transform('2023-02-19', {dateStyle: 'medium'})).toEqual('Feb 19, 2023');
133133
});
134134
});
135+
136+
it('should respect locale option', () => {
137+
TestBed.configureTestingModule({
138+
providers: [
139+
IntlDatePipe,
140+
{
141+
provide: INTL_LOCALES,
142+
useValue: 'en-US',
143+
},
144+
],
145+
});
146+
testUnit = TestBed.inject(IntlDatePipe);
147+
148+
expect(testUnit.transform('2023-02-19', {locale: 'de-DE'})).toEqual('19.2.2023');
149+
});
135150
});

Diff for: projects/angular-ecmascript-intl/src/lib/date/intl-date.pipe.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {Inject, Optional, Pipe, PipeTransform} from '@angular/core';
22
import {INTL_LOCALES} from "../locale";
33
import {INTL_DATE_PIPE_DEFAULT_OPTIONS} from "./intl-date-pipe-default-options";
4+
import {IntlPipeOptions} from "../intl-pipe-options";
45

5-
export type IntlDatePipeOptions = Partial<Intl.DateTimeFormatOptions>;
6+
export type IntlDatePipeOptions = Partial<Intl.DateTimeFormatOptions> & IntlPipeOptions;
67

78
@Pipe({
89
name: 'intlDate',
@@ -24,8 +25,10 @@ export class IntlDatePipe implements PipeTransform {
2425
return null;
2526
}
2627

28+
const {locale, ...intlOptions} = options ?? {};
29+
2730
try {
28-
return new Intl.DateTimeFormat(this.locale ?? undefined, {...this.defaultOptions, ...options}).format(date);
31+
return new Intl.DateTimeFormat(locale ?? this.locale ?? undefined, {...this.defaultOptions, ...intlOptions}).format(date);
2932
} catch (e) {
3033
console.error('Error while transforming the date', e);
3134
return date.toString();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface IntlPipeOptions {
2+
locale?: string;
3+
}

Diff for: projects/angular-ecmascript-intl/src/lib/language/intl-language.pipe.spec.ts

+15
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,19 @@ describe('IntlLanguagePipe', () => {
132132
expect(testUnit.transform('de', {type: 'region'})).toEqual('Deutsch');
133133
});
134134
});
135+
136+
it('should respect locale option', () => {
137+
TestBed.configureTestingModule({
138+
providers: [
139+
IntlLanguagePipe,
140+
{
141+
provide: INTL_LOCALES,
142+
useValue: 'en-US',
143+
},
144+
],
145+
});
146+
testUnit = TestBed.inject(IntlLanguagePipe);
147+
148+
expect(testUnit.transform('en-US', {locale: 'de-DE'})).toEqual('Englisch (Vereinigte Staaten)');
149+
});
135150
});

Diff for: projects/angular-ecmascript-intl/src/lib/language/intl-language.pipe.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {Inject, Optional, Pipe, PipeTransform} from '@angular/core';
22
import {INTL_LOCALES} from "../locale";
33
import {INTL_LANGUAGE_PIPE_DEFAULT_OPTIONS} from "./intl-language-pipe-default-options";
4+
import {IntlPipeOptions} from "../intl-pipe-options";
45

5-
export type IntlLanguagePipeOptions = Partial<Intl.DisplayNamesOptions>;
6+
export type IntlLanguagePipeOptions = Partial<Intl.DisplayNamesOptions> & IntlPipeOptions;
67

78
@Pipe({
89
name: 'intlLanguage',
@@ -19,10 +20,12 @@ export class IntlLanguagePipe implements PipeTransform {
1920
return null;
2021
}
2122

23+
const {locale, ...intlOptions} = options ?? {};
24+
2225
try {
23-
return new Intl.DisplayNames(this.locale ?? undefined, {
24-
...this.defaultOptions, ...options,
25-
type: 'language'
26+
return new Intl.DisplayNames(locale ?? this.locale ?? undefined, {
27+
...this.defaultOptions, ...intlOptions,
28+
type: 'language',
2629
}).of(value) ?? null;
2730
} catch (e) {
2831
console.error('Error while transforming the language', e);

Diff for: projects/angular-intl-demo/src/app/date/date.component.html

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
<div class="fields-container">
2+
<mat-form-field>
3+
<mat-label>Locale</mat-label>
4+
<mat-select [(ngModel)]="locale">
5+
<mat-option [value]="undefined">Browser default</mat-option>
6+
<mat-option *ngFor="let language of languages" [value]="language">{{language}}</mat-option>
7+
</mat-select>
8+
</mat-form-field>
9+
210
<mat-form-field>
311
<mat-label>Date style</mat-label>
412
<mat-select [(ngModel)]="dateStyle">
5-
<mat-option [value]="undefined">-</mat-option>
13+
<mat-option [value]="undefined">Browser default</mat-option>
614
<mat-option [value]="'short'">short</mat-option>
715
<mat-option [value]="'medium'">medium</mat-option>
816
<mat-option [value]="'long'">long</mat-option>
@@ -13,7 +21,7 @@
1321
<mat-form-field>
1422
<mat-label>Time style</mat-label>
1523
<mat-select [(ngModel)]="timeStyle">
16-
<mat-option [value]="undefined">-</mat-option>
24+
<mat-option [value]="undefined">Browser default</mat-option>
1725
<mat-option [value]="'short'">short</mat-option>
1826
<mat-option [value]="'medium'">medium</mat-option>
1927
<mat-option [value]="'long'">long</mat-option>
@@ -26,4 +34,4 @@
2634
</mat-slide-toggle>
2735
</div>
2836

29-
<p>{{selectedDate | intlDate: { dateStyle, timeStyle, hour12 } }}</p>
37+
<p>{{selectedDate | intlDate: {dateStyle, timeStyle, hour12, locale} }}</p>
+4-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
import { Component } from '@angular/core';
1+
import {Component} from '@angular/core';
2+
import {languages} from '../languages';
23

34
@Component({
45
selector: 'app-date',
56
templateUrl: './date.component.html',
67
styleUrls: ['./date.component.scss']
78
})
89
export class DateComponent {
10+
languages = languages;
911
selectedDate = new Date();
1012
dateStyle: Intl.DateTimeFormatOptions['dateStyle'];
1113
timeStyle: Intl.DateTimeFormatOptions['timeStyle'];
1214
hour12: Intl.DateTimeFormatOptions['hour12'];
15+
locale?: string;
1316
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
<div class="fields-container">
22
<mat-form-field>
3-
<mat-label>Language</mat-label>
3+
<mat-label>Language to transform</mat-label>
44
<mat-select [(ngModel)]="selectedLanguage">
55
<mat-option *ngFor="let language of languages" [value]="language">{{language}}</mat-option>
66
</mat-select>
77
</mat-form-field>
88

9+
<mat-form-field>
10+
<mat-label>Locale</mat-label>
11+
<mat-select [(ngModel)]="locale">
12+
<mat-option [value]="undefined">Browser default</mat-option>
13+
<mat-option *ngFor="let language of languages" [value]="language">{{language}}</mat-option>
14+
</mat-select>
15+
</mat-form-field>
16+
917
<mat-form-field>
1018
<mat-label>Language display</mat-label>
1119
<mat-select [(ngModel)]="languageDisplay">
12-
<mat-option [value]="undefined">-</mat-option>
20+
<mat-option [value]="undefined">Browser default</mat-option>
1321
<mat-option [value]="'dialect'">dialect</mat-option>
1422
<mat-option [value]="'standard'">standard</mat-option>
1523
</mat-select>
1624
</mat-form-field>
1725
</div>
1826

19-
<p>{{selectedLanguage | intlLanguage: {languageDisplay} }}</p>
27+
<p>{{selectedLanguage | intlLanguage: {languageDisplay, locale} }}</p>

Diff for: projects/angular-intl-demo/src/app/language/language.component.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Component} from '@angular/core';
2-
import {languages} from "./languages";
2+
import {languages} from "../languages";
33
import {IntlLanguagePipeOptions} from "projects/angular-ecmascript-intl/src/lib/language/intl-language.pipe";
44

55
@Component({
@@ -11,4 +11,5 @@ export class LanguageComponent {
1111
languages = languages;
1212
selectedLanguage = 'de-DE';
1313
languageDisplay?: IntlLanguagePipeOptions['languageDisplay'];
14+
locale?: string;
1415
}

0 commit comments

Comments
 (0)