@o3r/localization 12.0.0-next.6 → 12.0.0-next.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builders/localization-extractor/index.d.ts.map +1 -1
- package/builders/localization-extractor/index.js +1 -0
- package/builders/localization-extractor/index.js.map +1 -1
- package/builders/package.json +3 -0
- package/fesm2022/o3r-localization-rules-engine.mjs +7 -7
- package/fesm2022/o3r-localization-rules-engine.mjs.map +1 -1
- package/fesm2022/o3r-localization.mjs +64 -56
- package/fesm2022/o3r-localization.mjs.map +1 -1
- package/package.json +17 -21
- package/rules-engine/package.json +3 -0
- package/schematics/package.json +3 -0
- package/tools/localization-translate.directive.d.ts.map +1 -1
- package/tools/localization-translate.pipe.d.ts.map +1 -1
- package/tools/localized-currency.pipe.d.ts.map +1 -1
- package/tools/localized-date.pipe.d.ts.map +1 -1
- package/tools/localized-decimal.pipe.d.ts.map +1 -1
- package/esm2022/annotations/index.mjs +0 -2
- package/esm2022/annotations/localization.mjs +0 -29
- package/esm2022/core/index.mjs +0 -5
- package/esm2022/core/json-localization.interface.mjs +0 -2
- package/esm2022/core/localization.configuration.mjs +0 -15
- package/esm2022/core/translatable.mjs +0 -2
- package/esm2022/core/translate-messageformat-lazy.compiler.mjs +0 -67
- package/esm2022/devkit/index.mjs +0 -7
- package/esm2022/devkit/localization-devkit.interface.mjs +0 -2
- package/esm2022/devkit/localization-devtools.console.service.mjs +0 -87
- package/esm2022/devkit/localization-devtools.message.service.mjs +0 -129
- package/esm2022/devkit/localization-devtools.module.mjs +0 -47
- package/esm2022/devkit/localization-devtools.service.mjs +0 -95
- package/esm2022/devkit/localization-devtools.token.mjs +0 -8
- package/esm2022/o3r-localization.mjs +0 -5
- package/esm2022/public_api.mjs +0 -6
- package/esm2022/rules-engine/localization.handler-action.mjs +0 -30
- package/esm2022/rules-engine/localization.interfaces.mjs +0 -3
- package/esm2022/rules-engine/localization.rules-engine.module.mjs +0 -23
- package/esm2022/rules-engine/o3r-localization-rules-engine.mjs +0 -5
- package/esm2022/rules-engine/public_api.mjs +0 -4
- package/esm2022/stores/index.mjs +0 -7
- package/esm2022/stores/localization-override/localization-override.actions.mjs +0 -8
- package/esm2022/stores/localization-override/localization-override.module.mjs +0 -39
- package/esm2022/stores/localization-override/localization-override.reducer.mjs +0 -17
- package/esm2022/stores/localization-override/localization-override.selectors.mjs +0 -7
- package/esm2022/stores/localization-override/localization-override.state.mjs +0 -5
- package/esm2022/stores/localization-override/localization-override.sync.mjs +0 -11
- package/esm2022/tools/index.mjs +0 -13
- package/esm2022/tools/localization-translate.directive.mjs +0 -77
- package/esm2022/tools/localization-translate.pipe.mjs +0 -74
- package/esm2022/tools/localization.module.mjs +0 -89
- package/esm2022/tools/localization.provider.mjs +0 -25
- package/esm2022/tools/localization.service.mjs +0 -192
- package/esm2022/tools/localization.token.mjs +0 -4
- package/esm2022/tools/localized-currency.pipe.mjs +0 -32
- package/esm2022/tools/localized-date.pipe.mjs +0 -32
- package/esm2022/tools/localized-decimal.pipe.mjs +0 -32
- package/esm2022/tools/text-direction.service.mjs +0 -43
- package/esm2022/tools/text-directionality.service.mjs +0 -26
- package/esm2022/tools/translations-loader.mjs +0 -112
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional, } from '@angular/core';
|
|
2
|
-
import { select, Store, } from '@ngrx/store';
|
|
3
|
-
import { TranslateService, } from '@ngx-translate/core';
|
|
4
|
-
import { LoggerService, } from '@o3r/logger';
|
|
5
|
-
import { BehaviorSubject, combineLatest, of, } from 'rxjs';
|
|
6
|
-
import { distinctUntilChanged, map, shareReplay, switchMap, } from 'rxjs/operators';
|
|
7
|
-
import { selectLocalizationOverride, } from '../stores/index';
|
|
8
|
-
import { LOCALIZATION_CONFIGURATION_TOKEN, } from './localization.token';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@ngx-translate/core";
|
|
11
|
-
import * as i2 from "@o3r/logger";
|
|
12
|
-
import * as i3 from "@ngrx/store";
|
|
13
|
-
/**
|
|
14
|
-
* Service which is wrapping the configuration logic of TranslateService from ngx-translate
|
|
15
|
-
* Any application willing to use localization just needs to inject LocalizationService
|
|
16
|
-
* in the root component and call its configure() method.
|
|
17
|
-
*/
|
|
18
|
-
export class LocalizationService {
|
|
19
|
-
constructor(translateService, logger, configuration, store) {
|
|
20
|
-
this.translateService = translateService;
|
|
21
|
-
this.logger = logger;
|
|
22
|
-
this.configuration = configuration;
|
|
23
|
-
this.store = store;
|
|
24
|
-
this.localeSplitIdentifier = '-';
|
|
25
|
-
/**
|
|
26
|
-
* Internal subject that we use to track changes between keys only and translation mode
|
|
27
|
-
*/
|
|
28
|
-
this._showKeys$ = new BehaviorSubject(false);
|
|
29
|
-
/**
|
|
30
|
-
* _showKeys$ exposed as an Observable
|
|
31
|
-
*/
|
|
32
|
-
this.showKeys$ = this._showKeys$.asObservable();
|
|
33
|
-
this.configure();
|
|
34
|
-
if (this.store) {
|
|
35
|
-
this.keyMapping$ = this.store.pipe(select(selectLocalizationOverride));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* This will handle the fallback language hierarchy to find out fallback language.
|
|
40
|
-
* supportedLocales language has highest priority, next priority goes to fallbackLocalesMap and default would be
|
|
41
|
-
* fallbackLanguage.
|
|
42
|
-
* @param language Selected language.
|
|
43
|
-
* @returns selected language if supported, fallback language otherwise.
|
|
44
|
-
*/
|
|
45
|
-
checkFallbackLocalesMap(language) {
|
|
46
|
-
if (language && !this.configuration.supportedLocales.includes(language)) {
|
|
47
|
-
const closestSupportedLanguageCode = this.getFirstClosestSupportedLanguageCode(language);
|
|
48
|
-
const fallbackForLanguage = this.getFallbackMapLangCode(language);
|
|
49
|
-
const fallbackStrategyDebug = (fallbackForLanguage && ' associated fallback language ')
|
|
50
|
-
|| (closestSupportedLanguageCode && ' closest supported language ')
|
|
51
|
-
|| (this.configuration.fallbackLanguage && ' configured default language ');
|
|
52
|
-
const fallbackLang = fallbackForLanguage || closestSupportedLanguageCode || this.configuration.fallbackLanguage || language;
|
|
53
|
-
if (language !== fallbackLang) {
|
|
54
|
-
this.logger.debug(`Non supported languages ${language} will fallback to ${fallbackStrategyDebug} ${fallbackLang}`);
|
|
55
|
-
}
|
|
56
|
-
return fallbackLang;
|
|
57
|
-
}
|
|
58
|
-
else if (!language) {
|
|
59
|
-
this.logger.debug('Language is not defined');
|
|
60
|
-
}
|
|
61
|
-
return language;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* This function checks if fallback language can be provided from fallbackLocalesMap.
|
|
65
|
-
* supportedLocales: ['en-GB', 'en-US', 'fr-FR'], fallbackLocalesMap: {'en-CA': 'en-US', 'de': 'fr-FR'}
|
|
66
|
-
* translate to en-CA -> fallback to en-US, translate to de-DE -> fallback to fr-FR
|
|
67
|
-
* translate to en-NZ -> fallback to en-GB
|
|
68
|
-
* @param language Selected language.
|
|
69
|
-
* @returns Fallback language if available, undefined otherwise.
|
|
70
|
-
*/
|
|
71
|
-
getFallbackMapLangCode(language) {
|
|
72
|
-
const fallbackLocalesMap = this.configuration.fallbackLocalesMap;
|
|
73
|
-
const [locale] = language.split(this.localeSplitIdentifier);
|
|
74
|
-
return fallbackLocalesMap && (fallbackLocalesMap[language] || fallbackLocalesMap[locale]);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* This function checks if closest supported language available incase of selected language is not
|
|
78
|
-
* supported language.
|
|
79
|
-
* supportedLocales: ['en-GB', 'en-US', 'fr-FR']
|
|
80
|
-
* translate to en-CA -> fallback to en-GB
|
|
81
|
-
* @param language Selected language.
|
|
82
|
-
* @returns Closest supported language if available, undefined otherwise.
|
|
83
|
-
*/
|
|
84
|
-
getFirstClosestSupportedLanguageCode(language) {
|
|
85
|
-
const [locale] = language.split(this.localeSplitIdentifier);
|
|
86
|
-
const firstClosestRegx = new RegExp(`^${locale}${this.localeSplitIdentifier}?`, 'i');
|
|
87
|
-
return this.configuration.supportedLocales.find((supportedLang) => firstClosestRegx.test(supportedLang));
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Returns a stream of translated values of a key which updates whenever the language changes.
|
|
91
|
-
* @param translationKey Key to translate
|
|
92
|
-
* @param interpolateParams Object to use in translation binding
|
|
93
|
-
* @returns A stream of the translated key
|
|
94
|
-
*/
|
|
95
|
-
getTranslationStream(translationKey, interpolateParams) {
|
|
96
|
-
const translation$ = this.translateService.stream(translationKey, interpolateParams).pipe(map((value) => this.configuration.debugMode ? `${translationKey} - ${value}` : value));
|
|
97
|
-
if (!this.configuration.enableTranslationDeactivation) {
|
|
98
|
-
return translation$;
|
|
99
|
-
}
|
|
100
|
-
return combineLatest([
|
|
101
|
-
translation$,
|
|
102
|
-
this.showKeys$
|
|
103
|
-
]).pipe(map(([value, showKeys]) => showKeys ? translationKey : value));
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Configures TranslateService and registers locales. This method is called from the application level.
|
|
107
|
-
*/
|
|
108
|
-
configure() {
|
|
109
|
-
const language = this.checkFallbackLocalesMap(this.configuration.language || this.configuration.fallbackLanguage);
|
|
110
|
-
this.translateService.addLangs(this.configuration.supportedLocales);
|
|
111
|
-
this.translateService.setDefaultLang(language);
|
|
112
|
-
this.useLanguage(language);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Is the translation deactivation enabled
|
|
116
|
-
*/
|
|
117
|
-
isTranslationDeactivationEnabled() {
|
|
118
|
-
return this.configuration.enableTranslationDeactivation;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Wrapper to call the ngx-translate service TranslateService method getLangs().
|
|
122
|
-
*/
|
|
123
|
-
getLanguages() {
|
|
124
|
-
return this.translateService.getLangs();
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Wrapper to call the ngx-translate service TranslateService method use(language).
|
|
128
|
-
* @param language
|
|
129
|
-
*/
|
|
130
|
-
useLanguage(language) {
|
|
131
|
-
language = this.checkFallbackLocalesMap(language);
|
|
132
|
-
return this.translateService.use(language);
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Wrapper to get the ngx-translate service TranslateService currentLang.
|
|
136
|
-
*/
|
|
137
|
-
getCurrentLanguage() {
|
|
138
|
-
return this.translateService.currentLang;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Get the instance of the ngx-translate TranslateService used by LocalizationService.
|
|
142
|
-
*/
|
|
143
|
-
getTranslateService() {
|
|
144
|
-
return this.translateService;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Toggle the ShowKeys mode between active and inactive.
|
|
148
|
-
* @param value if specified, set the ShowKeys mode to value. If not specified, toggle the ShowKeys mode.
|
|
149
|
-
*/
|
|
150
|
-
toggleShowKeys(value) {
|
|
151
|
-
if (!this.configuration.enableTranslationDeactivation) {
|
|
152
|
-
throw new Error('Translation deactivation is not enabled. Please set the LocalizationConfiguration property "enableTranslationDeactivation" accordingly.');
|
|
153
|
-
}
|
|
154
|
-
const newValue = value === undefined ? !this.showKeys : value;
|
|
155
|
-
this._showKeys$.next(newValue);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Return the current value of debug show/hide translation keys.
|
|
159
|
-
*/
|
|
160
|
-
get showKeys() {
|
|
161
|
-
return this._showKeys$.value;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Get an observable of translation key after global mapping
|
|
165
|
-
* @param requestedKey Original translation key
|
|
166
|
-
*/
|
|
167
|
-
getKey(requestedKey) {
|
|
168
|
-
return this.keyMapping$
|
|
169
|
-
? this.keyMapping$.pipe(map((keyMapping) => keyMapping?.[requestedKey] || requestedKey), distinctUntilChanged())
|
|
170
|
-
: of(requestedKey);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Returns a stream of translated values of a key which updates whenever the language changes.
|
|
174
|
-
* @param key Key to translate
|
|
175
|
-
* @param interpolateParams Object to use in translation binding
|
|
176
|
-
* @returns A stream of the translated key
|
|
177
|
-
*/
|
|
178
|
-
translate(key, interpolateParams) {
|
|
179
|
-
return this.getKey(key).pipe(switchMap((translationKey) => this.getTranslationStream(translationKey, interpolateParams)), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
180
|
-
}
|
|
181
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizationService, deps: [{ token: i1.TranslateService }, { token: i2.LoggerService }, { token: LOCALIZATION_CONFIGURATION_TOKEN }, { token: i3.Store, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
182
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizationService }); }
|
|
183
|
-
}
|
|
184
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizationService, decorators: [{
|
|
185
|
-
type: Injectable
|
|
186
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.LoggerService }, { type: undefined, decorators: [{
|
|
187
|
-
type: Inject,
|
|
188
|
-
args: [LOCALIZATION_CONFIGURATION_TOKEN]
|
|
189
|
-
}] }, { type: i3.Store, decorators: [{
|
|
190
|
-
type: Optional
|
|
191
|
-
}] }] });
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvbG9jYWxpemF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxNQUFNLEVBQ04sS0FBSyxHQUNOLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxnQkFBZ0IsR0FDakIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsYUFBYSxHQUNkLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUViLEVBQUUsR0FDSCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QixPQUFPLEVBRUwsMEJBQTBCLEdBQzNCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGdDQUFnQyxHQUNqQyxNQUFNLHNCQUFzQixDQUFDOzs7OztBQUU5Qjs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLG1CQUFtQjtJQWtCOUIsWUFDbUIsZ0JBQWtDLEVBQ2xDLE1BQXFCLEVBQ3FCLGFBQXdDLEVBQ3RFLEtBQXdDO1FBSHBELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNxQixrQkFBYSxHQUFiLGFBQWEsQ0FBMkI7UUFDdEUsVUFBSyxHQUFMLEtBQUssQ0FBbUM7UUFyQnRELDBCQUFxQixHQUFXLEdBQUcsQ0FBQztRQUVyRDs7V0FFRztRQUNjLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQU96RDs7V0FFRztRQUNJLGNBQVMsR0FBRyxJQUFJLENBQUMs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TyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDMUIsU0FBUyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFDM0YsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FDL0MsQ0FBQztJQUNKLENBQUM7a0lBeE1VLG1CQUFtQiwrRUFxQnBCLGdDQUFnQztzSUFyQi9CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBc0JOLE1BQU07MkJBQUMsZ0NBQWdDOzswQkFDdkMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgc2VsZWN0LFxuICBTdG9yZSxcbn0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgVHJhbnNsYXRlU2VydmljZSxcbn0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBMb2dnZXJTZXJ2aWNlLFxufSBmcm9tICdAbzNyL2xvZ2dlcic7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24sXG59IGZyb20gJy4uL2NvcmUvbG9jYWxpemF0aW9uLmNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtcbiAgTG9jYWxpemF0aW9uT3ZlcnJpZGVTdG9yZSxcbiAgc2VsZWN0TG9jYWxpemF0aW9uT3ZlcnJpZGUsXG59IGZyb20gJy4uL3N0b3Jlcy9pbmRleCc7XG5pbXBvcnQge1xuICBMT0NBTElaQVRJT05fQ09ORklHVVJBVElPTl9UT0tFTixcbn0gZnJvbSAnLi9sb2NhbGl6YXRpb24udG9rZW4nO1xuXG4vKipcbiAqIFNlcnZpY2Ugd2hpY2ggaXMgd3JhcHBpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbG9naWMgb2YgVHJhbnNsYXRlU2VydmljZSBmcm9tIG5neC10cmFuc2xhdGVcbiAqIEFueSBhcHBsaWNhdGlvbiB3aWxsaW5nIHRvIHVzZSBsb2NhbGl6YXRpb24ganVzdCBuZWVkcyB0byBpbmplY3QgTG9jYWxpemF0aW9uU2VydmljZVxuICogaW4gdGhlIHJvb3QgY29tcG9uZW50IGFuZCBjYWxsIGl0cyBjb25maWd1cmUoKSBtZXRob2QuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2NhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGVTcGxpdElkZW50aWZpZXI6IHN0cmluZyA9ICctJztcblxuICAvKipcbiAgICogSW50ZXJuYWwgc3ViamVjdCB0aGF0IHdlIHVzZSB0byB0cmFjayBjaGFuZ2VzIGJldHdlZW4ga2V5cyBvbmx5IGFuZCB0cmFuc2xhdGlvbiBtb2RlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9zaG93S2V5cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvKipcbiAgICogTWFwIG9mIGxvY2FsaXphdGlvbiBrZXlzIHRvIHJlcGxhY2UgYSBrZXkgdG8gYW5vdGhlclxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBrZXlNYXBwaW5nJD86IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIF9zaG93S2V5cyQgZXhwb3NlZCBhcyBhbiBPYnNlcnZhYmxlXG4gICAqL1xuICBwdWJsaWMgc2hvd0tleXMkID0gdGhpcy5fc2hvd0tleXMkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICBASW5qZWN0KExPQ0FMSVpBVElPTl9DT05GSUdVUkFUSU9OX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb246IExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBzdG9yZT86IFN0b3JlPExvY2FsaXphdGlvbk92ZXJyaWRlU3RvcmU+XG4gICkge1xuICAgIHRoaXMuY29uZmlndXJlKCk7XG4gICAgaWYgKHRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMua2V5TWFwcGluZyQgPSB0aGlzLnN0b3JlLnBpcGUoXG4gICAgICAgIHNlbGVjdChzZWxlY3RMb2NhbGl6YXRpb25PdmVycmlkZSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBoYW5kbGUgdGhlIGZhbGxiYWNrIGxhbmd1YWdlIGhpZXJhcmNoeSB0byBmaW5kIG91dCBmYWxsYmFjayBsYW5ndWFnZS5cbiAgICogc3VwcG9ydGVkTG9jYWxlcyBsYW5ndWFnZSBoYXMgaGlnaGVzdCBwcmlvcml0eSwgbmV4dCBwcmlvcml0eSBnb2VzIHRvIGZhbGxiYWNrTG9jYWxlc01hcCBhbmQgZGVmYXVsdCB3b3VsZCBiZVxuICAgKiBmYWxsYmFja0xhbmd1YWdlLlxuICAgKiBAcGFyYW0gbGFuZ3VhZ2UgU2VsZWN0ZWQgbGFuZ3VhZ2UuXG4gICAqIEByZXR1cm5zIHNlbGVjdGVkIGxhbmd1YWdlIGlmIHN1cHBvcnRlZCwgZmFsbGJhY2sgbGFuZ3VhZ2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0ZhbGxiYWNrTG9jYWxlc01hcDxUIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihsYW5ndWFnZTogVCkge1xuICAgIGlmIChsYW5ndWFnZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMobGFuZ3VhZ2UpKSB7XG4gICAgICBjb25zdCBjbG9zZXN0U3VwcG9ydGVkTGFuZ3VhZ2VDb2RlID0gdGhpcy5nZXRGaXJzdENsb3Nlc3RTdXBwb3J0ZWRMYW5ndWFnZUNvZGUobGFuZ3VhZ2UpO1xuICAgICAgY29uc3QgZmFsbGJhY2tGb3JMYW5ndWFnZSA9IHRoaXMuZ2V0RmFsbGJhY2tNYXBMYW5nQ29kZShsYW5ndWFnZSk7XG4gICAgICBjb25zdCBmYWxsYmFja1N0cmF0ZWd5RGVidWcgPSAoZmFsbGJhY2tGb3JMYW5ndWFnZSAmJiAnIGFzc29jaWF0ZWQgZmFsbGJhY2sgbGFuZ3VhZ2UgJylcbiAgICAgICAgfHwgKGNsb3Nlc3RTdXBwb3J0ZWRMYW5ndWFnZUNvZGUgJiYgJyBjbG9zZXN0IHN1cHBvcnRlZCBsYW5ndWFnZSAnKVxuICAgICAgICB8fCAodGhpcy5jb25maWd1cmF0aW9uLmZhbGxiYWNrTGFuZ3VhZ2UgJiYgJyBjb25maWd1cmVkIGRlZmF1bHQgbGFuZ3VhZ2UgJyk7XG4gICAgICBjb25zdCBmYWxsYmFja0xhbmcgPSBmYWxsYmFja0Zvckxhbmd1YWdlIHx8IGNsb3Nlc3RTdXBwb3J0ZWRMYW5ndWFnZUNvZGUgfHwgdGhpcy5jb25maWd1cmF0aW9uLmZhbGxiYWNrTGFuZ3VhZ2UgfHwgbGFuZ3VhZ2U7XG4gICAgICBpZiAobGFuZ3VhZ2UgIT09IGZhbGxiYWNrTGFuZykge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTm9uIHN1cHBvcnRlZCBsYW5ndWFnZXMgJHtsYW5ndWFnZX0gd2lsbCBmYWxsYmFjayB0byAke2ZhbGxiYWNrU3RyYXRlZ3lEZWJ1Z30gJHtmYWxsYmFja0xhbmd9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsbGJhY2tMYW5nO1xuICAgIH0gZWxzZSBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTGFuZ3VhZ2UgaXMgbm90IGRlZmluZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGZhbGxiYWNrIGxhbmd1YWdlIGNhbiBiZSBwcm92aWRlZCBmcm9tIGZhbGxiYWNrTG9jYWxlc01hcC5cbiAgICogc3VwcG9ydGVkTG9jYWxlczogWydlbi1HQicsICdlbi1VUycsICdmci1GUiddLCBmYWxsYmFja0xvY2FsZXNNYXA6IHsnZW4tQ0EnOiAnZW4tVVMnLCAnZGUnOiAnZnItRlInfVxuICAgKiB0cmFuc2xhdGUgdG8gZW4tQ0EgLT4gZmFsbGJhY2sgdG8gZW4tVVMsIHRyYW5zbGF0ZSB0byBkZS1ERSAtPiBmYWxsYmFjayB0byBmci1GUlxuICAgKiB0cmFuc2xhdGUgdG8gZW4tTlogLT4gZmFsbGJhY2sgdG8gZW4tR0JcbiAgICogQHBhcmFtIGxhbmd1YWdlIFNlbGVjdGVkIGxhbmd1YWdlLlxuICAgKiBAcmV0dXJucyBGYWxsYmFjayBsYW5ndWFnZSBpZiBhdmFpbGFibGUsIHVuZGVmaW5lZCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIGdldEZhbGxiYWNrTWFwTGFuZ0NvZGUobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmFsbGJhY2tMb2NhbGVzTWFwID0gdGhpcy5jb25maWd1cmF0aW9uLmZhbGxiYWNrTG9jYWxlc01hcDtcbiAgICBjb25zdCBbbG9jYWxlXSA9IGxhbmd1YWdlLnNwbGl0KHRoaXMubG9jYWxlU3BsaXRJZGVudGlmaWVyKTtcblxuICAgIHJldHVybiBmYWxsYmFja0xvY2FsZXNNYXAgJiYgKGZhbGxiYWNrTG9jYWxlc01hcFtsYW5ndWFnZV0gfHwgZmFsbGJhY2tMb2NhbGVzTWFwW2xvY2FsZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGNsb3Nlc3Qgc3VwcG9ydGVkIGxhbmd1YWdlIGF2YWlsYWJsZSBpbmNhc2Ugb2Ygc2VsZWN0ZWQgbGFuZ3VhZ2UgaXMgbm90XG4gICAqIHN1cHBvcnRlZCBsYW5ndWFnZS5cbiAgICogc3VwcG9ydGVkTG9jYWxlczogWydlbi1HQicsICdlbi1VUycsICdmci1GUiddXG4gICAqIHRyYW5zbGF0ZSB0byBlbi1DQSAtPiBmYWxsYmFjayB0byBlbi1HQlxuICAgKiBAcGFyYW0gbGFuZ3VhZ2UgU2VsZWN0ZWQgbGFuZ3VhZ2UuXG4gICAqIEByZXR1cm5zIENsb3Nlc3Qgc3VwcG9ydGVkIGxhbmd1YWdlIGlmIGF2YWlsYWJsZSwgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rmlyc3RDbG9zZXN0U3VwcG9ydGVkTGFuZ3VhZ2VDb2RlKGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IFtsb2NhbGVdID0gbGFuZ3VhZ2Uuc3BsaXQodGhpcy5sb2NhbGVTcGxpdElkZW50aWZpZXIpO1xuICAgIGNvbnN0IGZpcnN0Q2xvc2VzdFJlZ3ggPSBuZXcgUmVnRXhwKGBeJHtsb2NhbGV9JHt0aGlzLmxvY2FsZVNwbGl0SWRlbnRpZmllcn0/YCwgJ2knKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uc3VwcG9ydGVkTG9jYWxlcy5maW5kKChzdXBwb3J0ZWRMYW5nKSA9PiBmaXJzdENsb3Nlc3RSZWd4LnRlc3Qoc3VwcG9ydGVkTGFuZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJlYW0gb2YgdHJhbnNsYXRlZCB2YWx1ZXMgb2YgYSBrZXkgd2hpY2ggdXBkYXRlcyB3aGVuZXZlciB0aGUgbGFuZ3VhZ2UgY2hhbmdlcy5cbiAgICogQHBhcmFtIHRyYW5zbGF0aW9uS2V5IEtleSB0byB0cmFuc2xhdGVcbiAgICogQHBhcmFtIGludGVycG9sYXRlUGFyYW1zIE9iamVjdCB0byB1c2UgaW4gdHJhbnNsYXRpb24gYmluZGluZ1xuICAgKiBAcmV0dXJucyBBIHN0cmVhbSBvZiB0aGUgdHJhbnNsYXRlZCBrZXlcbiAgICovXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRpb25TdHJlYW0odHJhbnNsYXRpb25LZXk6IHN0cmluZywgaW50ZXJwb2xhdGVQYXJhbXM/OiBvYmplY3QpIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKHRyYW5zbGF0aW9uS2V5LCBpbnRlcnBvbGF0ZVBhcmFtcykucGlwZShcbiAgICAgIG1hcCgodmFsdWU6IHN0cmluZykgPT4gdGhpcy5jb25maWd1cmF0aW9uLmRlYnVnTW9kZSA/IGAke3RyYW5zbGF0aW9uS2V5fSAtICR7dmFsdWV9YCA6IHZhbHVlKVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5lbmFibGVUcmFuc2xhdGlvbkRlYWN0aXZhdGlvbikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uJDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0cmFuc2xhdGlvbiQsXG4gICAgICB0aGlzLnNob3dLZXlzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt2YWx1ZSwgc2hvd0tleXNdKSA9PiBzaG93S2V5cyA/IHRyYW5zbGF0aW9uS2V5IDogdmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIFRyYW5zbGF0ZVNlcnZpY2UgYW5kIHJlZ2lzdGVycyBsb2NhbGVzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gbGV2ZWwuXG4gICAqL1xuICBwdWJsaWMgY29uZmlndXJlKCkge1xuICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5jaGVja0ZhbGxiYWNrTG9jYWxlc01hcCh0aGlzLmNvbmZpZ3VyYXRpb24ubGFuZ3VhZ2UgfHwgdGhpcy5jb25maWd1cmF0aW9uLmZhbGxiYWNrTGFuZ3VhZ2UpO1xuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5hZGRMYW5ncyh0aGlzLmNvbmZpZ3VyYXRpb24uc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldERlZmF1bHRMYW5nKGxhbmd1YWdlKTtcbiAgICB0aGlzLnVzZUxhbmd1YWdlKGxhbmd1YWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGUgdHJhbnNsYXRpb24gZGVhY3RpdmF0aW9uIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc1RyYW5zbGF0aW9uRGVhY3RpdmF0aW9uRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLmVuYWJsZVRyYW5zbGF0aW9uRGVhY3RpdmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgdG8gY2FsbCB0aGUgbmd4LXRyYW5zbGF0ZSBzZXJ2aWNlIFRyYW5zbGF0ZVNlcnZpY2UgbWV0aG9kIGdldExhbmdzKCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0TGFuZ3VhZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0TGFuZ3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIHRvIGNhbGwgdGhlIG5neC10cmFuc2xhdGUgc2VydmljZSBUcmFuc2xhdGVTZXJ2aWNlIG1ldGhvZCB1c2UobGFuZ3VhZ2UpLlxuICAgKiBAcGFyYW0gbGFuZ3VhZ2VcbiAgICovXG4gIHB1YmxpYyB1c2VMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsYW5ndWFnZSA9IHRoaXMuY2hlY2tGYWxsYmFja0xvY2FsZXNNYXAobGFuZ3VhZ2UpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudXNlKGxhbmd1YWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIHRvIGdldCB0aGUgbmd4LXRyYW5zbGF0ZSBzZXJ2aWNlIFRyYW5zbGF0ZVNlcnZpY2UgY3VycmVudExhbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudExhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgbmd4LXRyYW5zbGF0ZSBUcmFuc2xhdGVTZXJ2aWNlIHVzZWQgYnkgTG9jYWxpemF0aW9uU2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUcmFuc2xhdGVTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBTaG93S2V5cyBtb2RlIGJldHdlZW4gYWN0aXZlIGFuZCBpbmFjdGl2ZS5cbiAgICogQHBhcmFtIHZhbHVlIGlmIHNwZWNpZmllZCwgc2V0IHRoZSBTaG93S2V5cyBtb2RlIHRvIHZhbHVlLiBJZiBub3Qgc3BlY2lmaWVkLCB0b2dnbGUgdGhlIFNob3dLZXlzIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlU2hvd0tleXModmFsdWU/OiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uZW5hYmxlVHJhbnNsYXRpb25EZWFjdGl2YXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNsYXRpb24gZGVhY3RpdmF0aW9uIGlzIG5vdCBlbmFibGVkLiBQbGVhc2Ugc2V0IHRoZSBMb2NhbGl6YXRpb25Db25maWd1cmF0aW9uIHByb3BlcnR5IFwiZW5hYmxlVHJhbnNsYXRpb25EZWFjdGl2YXRpb25cIiBhY2NvcmRpbmdseS4nKTtcbiAgICB9XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gIXRoaXMuc2hvd0tleXMgOiB2YWx1ZTtcbiAgICB0aGlzLl9zaG93S2V5cyQubmV4dChuZXdWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGRlYnVnIHNob3cvaGlkZSB0cmFuc2xhdGlvbiBrZXlzLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93S2V5cygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0tleXMkLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBvYnNlcnZhYmxlIG9mIHRyYW5zbGF0aW9uIGtleSBhZnRlciBnbG9iYWwgbWFwcGluZ1xuICAgKiBAcGFyYW0gcmVxdWVzdGVkS2V5IE9yaWdpbmFsIHRyYW5zbGF0aW9uIGtleVxuICAgKi9cbiAgcHVibGljIGdldEtleShyZXF1ZXN0ZWRLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmtleU1hcHBpbmckXG4gICAgICA/IHRoaXMua2V5TWFwcGluZyQucGlwZShcbiAgICAgICAgbWFwKChrZXlNYXBwaW5nKSA9PiBrZXlNYXBwaW5nPy5bcmVxdWVzdGVkS2V5XSB8fCByZXF1ZXN0ZWRLZXkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICApXG4gICAgICA6IG9mKHJlcXVlc3RlZEtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmVhbSBvZiB0cmFuc2xhdGVkIHZhbHVlcyBvZiBhIGtleSB3aGljaCB1cGRhdGVzIHdoZW5ldmVyIHRoZSBsYW5ndWFnZSBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ga2V5IEtleSB0byB0cmFuc2xhdGVcbiAgICogQHBhcmFtIGludGVycG9sYXRlUGFyYW1zIE9iamVjdCB0byB1c2UgaW4gdHJhbnNsYXRpb24gYmluZGluZ1xuICAgKiBAcmV0dXJucyBBIHN0cmVhbSBvZiB0aGUgdHJhbnNsYXRlZCBrZXlcbiAgICovXG4gIHB1YmxpYyB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIGludGVycG9sYXRlUGFyYW1zPzogb2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0S2V5KGtleSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgodHJhbnNsYXRpb25LZXkpID0+IHRoaXMuZ2V0VHJhbnNsYXRpb25TdHJlYW0odHJhbnNsYXRpb25LZXksIGludGVycG9sYXRlUGFyYW1zKSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, } from '@angular/core';
|
|
2
|
-
/** Localization Configuration Token */
|
|
3
|
-
export const LOCALIZATION_CONFIGURATION_TOKEN = new InjectionToken('Localization Configuration injection token');
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL2xvY2FsaXphdGlvbi50b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsY0FBYyxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLGNBQWMsQ0FBNEIsNENBQTRDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGlvblRva2VuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24sXG59IGZyb20gJy4uL2NvcmUnO1xuXG4vKiogTG9jYWxpemF0aW9uIENvbmZpZ3VyYXRpb24gVG9rZW4gKi9cbmV4cG9ydCBjb25zdCBMT0NBTElaQVRJT05fQ09ORklHVVJBVElPTl9UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxMb2NhbGl6YXRpb25Db25maWd1cmF0aW9uPignTG9jYWxpemF0aW9uIENvbmZpZ3VyYXRpb24gaW5qZWN0aW9uIHRva2VuJyk7XG4iXX0=
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { CurrencyPipe, } from '@angular/common';
|
|
2
|
-
import { ChangeDetectorRef, Pipe, } from '@angular/core';
|
|
3
|
-
import { LocalizationService, } from './localization.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "./localization.service";
|
|
6
|
-
/**
|
|
7
|
-
* Native angular CurrencyPipe taking the current lang into consideration
|
|
8
|
-
*/
|
|
9
|
-
export class LocalizedCurrencyPipe extends CurrencyPipe {
|
|
10
|
-
constructor(localizationService, changeDetectorRef) {
|
|
11
|
-
super(localizationService.getCurrentLanguage());
|
|
12
|
-
this.localizationService = localizationService;
|
|
13
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
14
|
-
this.onLangChange = this.localizationService.getTranslateService().onLangChange.subscribe(() => this.changeDetectorRef.markForCheck());
|
|
15
|
-
}
|
|
16
|
-
transform(value, currencyCode, display, digitsInfo, locale) {
|
|
17
|
-
return super.transform(value, currencyCode, display, digitsInfo, locale || this.localizationService.getCurrentLanguage());
|
|
18
|
-
}
|
|
19
|
-
ngOnDestroy() {
|
|
20
|
-
this.onLangChange.unsubscribe();
|
|
21
|
-
}
|
|
22
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizedCurrencyPipe, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
23
|
-
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: LocalizedCurrencyPipe, name: "currency", pure: false }); }
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizedCurrencyPipe, decorators: [{
|
|
26
|
-
type: Pipe,
|
|
27
|
-
args: [{
|
|
28
|
-
name: 'currency',
|
|
29
|
-
pure: false
|
|
30
|
-
}]
|
|
31
|
-
}], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }] });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemVkLWN1cnJlbmN5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvbG9jYWxpemVkLWN1cnJlbmN5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksR0FDYixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxpQkFBaUIsRUFFakIsSUFBSSxHQUVMLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFDTCxtQkFBbUIsR0FDcEIsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBRWhDOztHQUVHO0FBS0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFHckQsWUFBNkIsbUJBQXdDLEVBQW1CLGlCQUFvQztRQUMxSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRHJCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFBbUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUUxSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQzdGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FDdEMsQ0FBQztJQUNKLENBQUM7SUFVTSxTQUFTLENBQ2QsS0FBeUMsRUFBRSxZQUFxQixFQUFFLE9BQTBCLEVBQUUsVUFBbUIsRUFBRSxNQUFlO1FBQ2xJLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO2tJQXpCVSxxQkFBcUI7Z0lBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFKakMsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsVUFBVTtvQkFDaEIsSUFBSSxFQUFFLEtBQUs7aUJBQ1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDdXJyZW5jeVBpcGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25EZXN0cm95LFxuICBQaXBlLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxufSBmcm9tICcuL2xvY2FsaXphdGlvbi5zZXJ2aWNlJztcblxuLyoqXG4gKiBOYXRpdmUgYW5ndWxhciBDdXJyZW5jeVBpcGUgdGFraW5nIHRoZSBjdXJyZW50IGxhbmcgaW50byBjb25zaWRlcmF0aW9uXG4gKi9cbkBQaXBlKHtcbiAgbmFtZTogJ2N1cnJlbmN5JyxcbiAgcHVyZTogZmFsc2Vcbn0pXG5leHBvcnQgY2xhc3MgTG9jYWxpemVkQ3VycmVuY3lQaXBlIGV4dGVuZHMgQ3VycmVuY3lQaXBlIGltcGxlbWVudHMgT25EZXN0cm95LCBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxhbmdDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIobG9jYWxpemF0aW9uU2VydmljZS5nZXRDdXJyZW50TGFuZ3VhZ2UoKSk7XG4gICAgdGhpcy5vbkxhbmdDaGFuZ2UgPSB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0VHJhbnNsYXRlU2VydmljZSgpLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT5cbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGN1cnJlbmN5Q29kZT86IHN0cmluZywgZGlzcGxheT86IHN0cmluZyB8IGJvb2xlYW4sIGRpZ2l0c0luZm8/OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IG51bGwgfCB1bmRlZmluZWQsIGN1cnJlbmN5Q29kZT86IHN0cmluZywgZGlzcGxheT86IHN0cmluZyB8IGJvb2xlYW4sIGRpZ2l0c0luZm8/OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZyk6IG51bGw7XG4gIHB1YmxpYyB0cmFuc2Zvcm0oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmlmaWVkLXNpZ25hdHVyZXMgLS0gRXhwb3NlIHNhbWUgc2lnbmF0dXJlcyBhcyBhbmd1bGFyIEN1cnJlbmN5UGlwZVxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBjdXJyZW5jeUNvZGU/OiBzdHJpbmcsIGRpc3BsYXk/OiBzdHJpbmcgfCBib29sZWFuLCBkaWdpdHNJbmZvPzogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdHJhbnNmb3JtKFxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBjdXJyZW5jeUNvZGU/OiBzdHJpbmcsIGRpc3BsYXk/OiBzdHJpbmcgfCBib29sZWFuLCBkaWdpdHNJbmZvPzogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlLCBjdXJyZW5jeUNvZGUsIGRpc3BsYXksIGRpZ2l0c0luZm8sIGxvY2FsZSB8fCB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCkpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25MYW5nQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { DatePipe, } from '@angular/common';
|
|
2
|
-
import { ChangeDetectorRef, Pipe, } from '@angular/core';
|
|
3
|
-
import { LocalizationService, } from './localization.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "./localization.service";
|
|
6
|
-
/**
|
|
7
|
-
* Native angular DatePipe taking the current lang into consideration
|
|
8
|
-
*/
|
|
9
|
-
export class LocalizedDatePipe extends DatePipe {
|
|
10
|
-
constructor(localizationService, changeDetectorRef) {
|
|
11
|
-
super(localizationService.getCurrentLanguage());
|
|
12
|
-
this.localizationService = localizationService;
|
|
13
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
14
|
-
this.onLangChange = this.localizationService.getTranslateService().onLangChange.subscribe(() => this.changeDetectorRef.markForCheck());
|
|
15
|
-
}
|
|
16
|
-
transform(value, format = 'mediumDate', timezone, locale) {
|
|
17
|
-
return this.localizationService.showKeys ? format : super.transform(value, format, timezone, locale || this.localizationService.getCurrentLanguage());
|
|
18
|
-
}
|
|
19
|
-
ngOnDestroy() {
|
|
20
|
-
this.onLangChange.unsubscribe();
|
|
21
|
-
}
|
|
22
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizedDatePipe, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
23
|
-
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: LocalizedDatePipe, name: "date", pure: false }); }
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizedDatePipe, decorators: [{
|
|
26
|
-
type: Pipe,
|
|
27
|
-
args: [{
|
|
28
|
-
name: 'date',
|
|
29
|
-
pure: false
|
|
30
|
-
}]
|
|
31
|
-
}], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }] });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemVkLWRhdGUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29scy9sb2NhbGl6ZWQtZGF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEdBQ1QsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLElBQUksR0FFTCxNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQ0wsbUJBQW1CLEdBQ3BCLE1BQU0sd0JBQXdCLENBQUM7OztBQUVoQzs7R0FFRztBQUtILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxRQUFRO0lBRzdDLFlBQTZCLG1CQUF3QyxFQUFtQixpQkFBb0M7UUFDMUgsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQURyQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQW1CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFFMUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUM3RixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBV00sU0FBUyxDQUNkLEtBQWdELEVBQUUsTUFBTSxHQUFHLFlBQVksRUFBRSxRQUFpQixFQUMxRixNQUFlO1FBQ2YsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDeEosQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO2tJQTNCVSxpQkFBaUI7Z0lBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFKN0IsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsS0FBSztpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERhdGVQaXBlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbiAgUGlwZSxcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTdWJzY3JpcHRpb24sXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgTG9jYWxpemF0aW9uU2VydmljZSxcbn0gZnJvbSAnLi9sb2NhbGl6YXRpb24uc2VydmljZSc7XG5cbi8qKlxuICogTmF0aXZlIGFuZ3VsYXIgRGF0ZVBpcGUgdGFraW5nIHRoZSBjdXJyZW50IGxhbmcgaW50byBjb25zaWRlcmF0aW9uXG4gKi9cbkBQaXBlKHtcbiAgbmFtZTogJ2RhdGUnLFxuICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbGl6ZWREYXRlUGlwZSBleHRlbmRzIERhdGVQaXBlIGltcGxlbWVudHMgT25EZXN0cm95LCBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxhbmdDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIobG9jYWxpemF0aW9uU2VydmljZS5nZXRDdXJyZW50TGFuZ3VhZ2UoKSk7XG4gICAgdGhpcy5vbkxhbmdDaGFuZ2UgPSB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0VHJhbnNsYXRlU2VydmljZSgpLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT5cbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBmb3JtYXQ/OiBzdHJpbmcsIHRpbWV6b25lPzogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmdcbiAgICB8IG51bGw7XG4gIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IG51bGwgfCB1bmRlZmluZWQsIGZvcm1hdD86IHN0cmluZywgdGltZXpvbmU/OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZyk6IG51bGw7XG4gIHB1YmxpYyB0cmFuc2Zvcm0oXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBmb3JtYXQ/OiBzdHJpbmcsIHRpbWV6b25lPzogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyB0cmFuc2Zvcm0oXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBmb3JtYXQgPSAnbWVkaXVtRGF0ZScsIHRpbWV6b25lPzogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2Uuc2hvd0tleXMgPyBmb3JtYXQgOiBzdXBlci50cmFuc2Zvcm0odmFsdWUsIGZvcm1hdCwgdGltZXpvbmUsIGxvY2FsZSB8fCB0aGlzLmxvY2FsaXphdGlvblNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCkpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25MYW5nQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { DecimalPipe, } from '@angular/common';
|
|
2
|
-
import { ChangeDetectorRef, Pipe, } from '@angular/core';
|
|
3
|
-
import { LocalizationService, } from './localization.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "./localization.service";
|
|
6
|
-
/**
|
|
7
|
-
* Native angular DecimalPipe taking the current lang into consideration
|
|
8
|
-
*/
|
|
9
|
-
export class LocalizedDecimalPipe extends DecimalPipe {
|
|
10
|
-
constructor(localizationService, changeDetectorRef) {
|
|
11
|
-
super(localizationService.getCurrentLanguage());
|
|
12
|
-
this.localizationService = localizationService;
|
|
13
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
14
|
-
this.onLangChange = this.localizationService.getTranslateService().onLangChange.subscribe(() => this.changeDetectorRef.markForCheck());
|
|
15
|
-
}
|
|
16
|
-
transform(value, digitsInfo, locale) {
|
|
17
|
-
return super.transform(value, digitsInfo, locale || this.localizationService.getCurrentLanguage());
|
|
18
|
-
}
|
|
19
|
-
ngOnDestroy() {
|
|
20
|
-
this.onLangChange.unsubscribe();
|
|
21
|
-
}
|
|
22
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizedDecimalPipe, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
23
|
-
/** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: LocalizedDecimalPipe, name: "decimal", pure: false }); }
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LocalizedDecimalPipe, decorators: [{
|
|
26
|
-
type: Pipe,
|
|
27
|
-
args: [{
|
|
28
|
-
name: 'decimal',
|
|
29
|
-
pure: false
|
|
30
|
-
}]
|
|
31
|
-
}], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }] });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemVkLWRlY2ltYWwucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29scy9sb2NhbGl6ZWQtZGVjaW1hbC5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLElBQUksR0FFTCxNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQ0wsbUJBQW1CLEdBQ3BCLE1BQU0sd0JBQXdCLENBQUM7OztBQUVoQzs7R0FFRztBQUtILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxXQUFXO0lBR25ELFlBQTZCLG1CQUF3QyxFQUFtQixpQkFBb0M7UUFDMUgsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQURyQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQW1CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFFMUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUM3RixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBT00sU0FBUyxDQUFDLEtBQXlDLEVBQUUsVUFBbUIsRUFBRSxNQUFlO1FBQzlGLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQztrSUFyQlUsb0JBQW9CO2dJQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBSmhDLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLEtBQUs7aUJBQ1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZWNpbWFsUGlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPbkRlc3Ryb3ksXG4gIFBpcGUsXG4gIFBpcGVUcmFuc2Zvcm0sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIExvY2FsaXphdGlvblNlcnZpY2UsXG59IGZyb20gJy4vbG9jYWxpemF0aW9uLnNlcnZpY2UnO1xuXG4vKipcbiAqIE5hdGl2ZSBhbmd1bGFyIERlY2ltYWxQaXBlIHRha2luZyB0aGUgY3VycmVudCBsYW5nIGludG8gY29uc2lkZXJhdGlvblxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdkZWNpbWFsJyxcbiAgcHVyZTogZmFsc2Vcbn0pXG5leHBvcnQgY2xhc3MgTG9jYWxpemVkRGVjaW1hbFBpcGUgZXh0ZW5kcyBEZWNpbWFsUGlwZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgUGlwZVRyYW5zZm9ybSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYW5nQ2hhbmdlOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBsb2NhbGl6YXRpb25TZXJ2aWNlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKGxvY2FsaXphdGlvblNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCkpO1xuICAgIHRoaXMub25MYW5nQ2hhbmdlID0gdGhpcy5sb2NhbGl6YXRpb25TZXJ2aWNlLmdldFRyYW5zbGF0ZVNlcnZpY2UoKS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHVibGljIHRyYW5zZm9ybSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBkaWdpdHNJbmZvPzogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBudWxsIHwgdW5kZWZpbmVkLCBkaWdpdHNJbmZvPzogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBudWxsO1xuICBwdWJsaWMgdHJhbnNmb3JtKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBkaWdpdHNJbmZvPzogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlLCBkaWdpdHNJbmZvLCBsb2NhbGUgfHwgdGhpcy5sb2NhbGl6YXRpb25TZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uTGFuZ0NoYW5nZS51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Directionality, } from '@angular/cdk/bidi';
|
|
2
|
-
import { Inject, Injectable, RendererFactory2, } from '@angular/core';
|
|
3
|
-
import { TranslateService, } from '@ngx-translate/core';
|
|
4
|
-
import { LOCALIZATION_CONFIGURATION_TOKEN, } from './localization.token';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@ngx-translate/core";
|
|
7
|
-
import * as i2 from "@angular/cdk/bidi";
|
|
8
|
-
/**
|
|
9
|
-
* Service for handling the text direction based on the LocalizationConfiguration
|
|
10
|
-
*/
|
|
11
|
-
export class TextDirectionService {
|
|
12
|
-
constructor(translateService, configuration, rendererFactory, directionality) {
|
|
13
|
-
this.translateService = translateService;
|
|
14
|
-
this.configuration = configuration;
|
|
15
|
-
this.rendererFactory = rendererFactory;
|
|
16
|
-
this.directionality = directionality;
|
|
17
|
-
this.renderer = this.rendererFactory.createRenderer(null, null);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Updates the dir attribute on body HTML tag.
|
|
21
|
-
* @returns a subscription that updates the dir attribute
|
|
22
|
-
*/
|
|
23
|
-
onLangChangeSubscription() {
|
|
24
|
-
if (this.subscription && !this.subscription.closed) {
|
|
25
|
-
return this.subscription;
|
|
26
|
-
}
|
|
27
|
-
this.subscription = this.translateService.onLangChange.subscribe((event) => {
|
|
28
|
-
const direction = this.configuration.rtlLanguages.includes(event.lang.split('-')[0]) ? 'rtl' : 'ltr';
|
|
29
|
-
this.renderer.setAttribute(document.body, 'dir', direction);
|
|
30
|
-
this.directionality.change.emit(direction);
|
|
31
|
-
});
|
|
32
|
-
return this.subscription;
|
|
33
|
-
}
|
|
34
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextDirectionService, deps: [{ token: i1.TranslateService }, { token: LOCALIZATION_CONFIGURATION_TOKEN }, { token: i0.RendererFactory2 }, { token: i2.Directionality }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextDirectionService }); }
|
|
36
|
-
}
|
|
37
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextDirectionService, decorators: [{
|
|
38
|
-
type: Injectable
|
|
39
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: undefined, decorators: [{
|
|
40
|
-
type: Inject,
|
|
41
|
-
args: [LOCALIZATION_CONFIGURATION_TOKEN]
|
|
42
|
-
}] }, { type: i0.RendererFactory2 }, { type: i2.Directionality }] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1kaXJlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29scy90ZXh0LWRpcmVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEdBQ2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFFVixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBTzdCLE9BQU8sRUFDTCxnQ0FBZ0MsR0FDakMsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUU5Qjs7R0FFRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsWUFDbUIsZ0JBQWtDLEVBQ1EsYUFBd0MsRUFDbEYsZUFBaUMsRUFDakMsY0FBOEI7UUFIOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNRLGtCQUFhLEdBQWIsYUFBYSxDQUEyQjtRQUNsRixvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFDakMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7O09BR0c7SUFDSSx3QkFBd0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFzQixFQUFFLEVBQUU7WUFDMUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3JHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO2tJQTFCVSxvQkFBb0Isa0RBTXJCLGdDQUFnQztzSUFOL0Isb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFPTixNQUFNOzJCQUFDLGdDQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGlvbmFsaXR5LFxufSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge1xuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJGYWN0b3J5Mixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBMYW5nQ2hhbmdlRXZlbnQsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG59IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24sXG59IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHtcbiAgTE9DQUxJWkFUSU9OX0NPTkZJR1VSQVRJT05fVE9LRU4sXG59IGZyb20gJy4vbG9jYWxpemF0aW9uLnRva2VuJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBoYW5kbGluZyB0aGUgdGV4dCBkaXJlY3Rpb24gYmFzZWQgb24gdGhlIExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb25cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRleHREaXJlY3Rpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQEluamVjdChMT0NBTElaQVRJT05fQ09ORklHVVJBVElPTl9UT0tFTikgcHJpdmF0ZSByZWFkb25seSBjb25maWd1cmF0aW9uOiBMb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5KSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHRoaXMucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGRpciBhdHRyaWJ1dGUgb24gYm9keSBIVE1MIHRhZy5cbiAgICogQHJldHVybnMgYSBzdWJzY3JpcHRpb24gdGhhdCB1cGRhdGVzIHRoZSBkaXIgYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgb25MYW5nQ2hhbmdlU3Vic2NyaXB0aW9uKCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbiAmJiAhdGhpcy5zdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb247XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50OiBMYW5nQ2hhbmdlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuY29uZmlndXJhdGlvbi5ydGxMYW5ndWFnZXMuaW5jbHVkZXMoZXZlbnQubGFuZy5zcGxpdCgnLScpWzBdKSA/ICdydGwnIDogJ2x0cic7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShkb2N1bWVudC5ib2R5LCAnZGlyJywgZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlLmVtaXQoZGlyZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb247XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { DIR_DOCUMENT, Directionality, } from '@angular/cdk/bidi';
|
|
2
|
-
import { Inject, Injectable, Optional, } from '@angular/core';
|
|
3
|
-
import { startWith, } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class TextDirectionality extends Directionality {
|
|
6
|
-
constructor(_document) {
|
|
7
|
-
super(_document);
|
|
8
|
-
this.change
|
|
9
|
-
.pipe(startWith(this.value))
|
|
10
|
-
.subscribe((value) => this.value = value);
|
|
11
|
-
}
|
|
12
|
-
ngOnDestroy() {
|
|
13
|
-
this.change.complete();
|
|
14
|
-
}
|
|
15
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextDirectionality, deps: [{ token: DIR_DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
16
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextDirectionality }); }
|
|
17
|
-
}
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextDirectionality, decorators: [{
|
|
19
|
-
type: Injectable
|
|
20
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
21
|
-
type: Optional
|
|
22
|
-
}, {
|
|
23
|
-
type: Inject,
|
|
24
|
-
args: [DIR_DOCUMENT]
|
|
25
|
-
}] }] });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1kaXJlY3Rpb25hbGl0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3RleHQtZGlyZWN0aW9uYWxpdHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLGNBQWMsR0FDZixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUVWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7O0FBR3hCLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBT3BELFlBQThDLFNBQWU7UUFDM0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNO2FBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDM0IsU0FBUyxDQUFDLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7a0lBaEJVLGtCQUFrQixrQkFPRyxZQUFZO3NJQVBqQyxrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVU7OzBCQVFJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERJUl9ET0NVTUVOVCxcbiAgRGlyZWN0aW9uLFxuICBEaXJlY3Rpb25hbGl0eSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIHN0YXJ0V2l0aCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGV4dERpcmVjdGlvbmFsaXR5IGV4dGVuZHMgRGlyZWN0aW9uYWxpdHkgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgJ2x0cicgb3IgJ3J0bCcgdmFsdWUuXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHVibGljIHZhbHVlITogRGlyZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoRElSX0RPQ1VNRU5UKSBfZG9jdW1lbnQ/OiBhbnkpIHtcbiAgICBzdXBlcihfZG9jdW1lbnQpO1xuICAgIHRoaXMuY2hhbmdlXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy52YWx1ZSkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogRGlyZWN0aW9uKSA9PiB0aGlzLnZhbHVlID0gdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional, } from '@angular/core';
|
|
2
|
-
import { DynamicContentService, } from '@o3r/dynamic-content';
|
|
3
|
-
import { LoggerService, } from '@o3r/logger';
|
|
4
|
-
import { combineLatest, from, of, } from 'rxjs';
|
|
5
|
-
import { catchError, map, switchMap, } from 'rxjs/operators';
|
|
6
|
-
import { LOCALIZATION_CONFIGURATION_TOKEN, } from './localization.token';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@o3r/logger";
|
|
9
|
-
import * as i2 from "@o3r/dynamic-content";
|
|
10
|
-
const JSON_EXT = '.json';
|
|
11
|
-
/**
|
|
12
|
-
* This class is responsible for loading translation bundles from remote or local endpoints depending on the LocalizationConfiguration.
|
|
13
|
-
* Fallback mechanism ensures that if a bundle in some language cannot be fetched remotely
|
|
14
|
-
* we try to fetch the same language bundle locally (bundles stored inside the application)
|
|
15
|
-
* and finally load the fallback language bundle (if all previous fetches failed)
|
|
16
|
-
*/
|
|
17
|
-
export class TranslationsLoader {
|
|
18
|
-
constructor(localizationConfiguration, logger, dynamicContentService) {
|
|
19
|
-
this.localizationConfiguration = localizationConfiguration;
|
|
20
|
-
this.logger = logger;
|
|
21
|
-
this.dynamicContentService = dynamicContentService;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Download a language bundle file
|
|
25
|
-
* @param url Url to the bundle file
|
|
26
|
-
*/
|
|
27
|
-
downloadLanguageBundle$(url) {
|
|
28
|
-
const queryParams = this.localizationConfiguration.queryParams;
|
|
29
|
-
let queryString = '';
|
|
30
|
-
if (queryParams) {
|
|
31
|
-
queryString = '?' + Object.keys(queryParams).map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(queryParams[key])).join('&');
|
|
32
|
-
}
|
|
33
|
-
return from(fetch(url + queryString, this.localizationConfiguration.fetchOptions)).pipe(switchMap((response) => from(response.json())));
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* @inheritdoc
|
|
37
|
-
*/
|
|
38
|
-
getTranslation(lang) {
|
|
39
|
-
const fallback = this.localizationConfiguration.fallbackLanguage;
|
|
40
|
-
let localizationPath$ = of(this.localizationConfiguration.endPointUrl);
|
|
41
|
-
if (this.localizationConfiguration.useDynamicContent) {
|
|
42
|
-
if (!this.dynamicContentService) {
|
|
43
|
-
throw new Error('Dynamic Content is not available. Please verify you have imported the module DynamicContentModule in your application');
|
|
44
|
-
}
|
|
45
|
-
localizationPath$ = this.dynamicContentService.getContentPathStream(this.localizationConfiguration.endPointUrl);
|
|
46
|
-
}
|
|
47
|
-
return localizationPath$.pipe(switchMap((localizationPath) => {
|
|
48
|
-
if (localizationPath) {
|
|
49
|
-
const localizationBundle$ = this.downloadLanguageBundle$(localizationPath + lang + JSON_EXT);
|
|
50
|
-
if (this.localizationConfiguration.mergeWithLocalTranslations) {
|
|
51
|
-
return combineLatest([
|
|
52
|
-
localizationBundle$.pipe(catchError(() => of({}))),
|
|
53
|
-
this.getTranslationFromLocal(lang, fallback).pipe(map((translations) => {
|
|
54
|
-
Object.keys(translations).forEach((key) => translations[key] = `[local] ${translations[key]}`);
|
|
55
|
-
return translations;
|
|
56
|
-
}))
|
|
57
|
-
]).pipe(map(([dynamicTranslations, localTranslations]) => ({ ...localTranslations, ...dynamicTranslations })));
|
|
58
|
-
}
|
|
59
|
-
/*
|
|
60
|
-
* if endPointUrl is specified by the configuration then:
|
|
61
|
-
* 1. try to load lang from endPointUrl
|
|
62
|
-
* 2. if 1 fails then try to load from the app (local file)
|
|
63
|
-
*/
|
|
64
|
-
return localizationBundle$.pipe(catchError(() => {
|
|
65
|
-
this.logger?.warn(`Failed to load the localization resource from ${localizationPath + lang + JSON_EXT}, trying from the application resources`);
|
|
66
|
-
return this.getTranslationFromLocal(lang, fallback);
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
/*
|
|
70
|
-
* else if endPointUrl NOT specified by then configuration then:
|
|
71
|
-
* 1. try to load from the app (local file)
|
|
72
|
-
*/
|
|
73
|
-
this.logger?.warn('No localization endpoint specified, localization fetch from application resources');
|
|
74
|
-
return this.getTranslationFromLocal(lang, fallback);
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
*
|
|
79
|
-
*Fetches localization bundles from published folder (internal to application)
|
|
80
|
-
*
|
|
81
|
-
*1. try to load lang from local
|
|
82
|
-
*2. if 1 fails try to load fallback lang but only if it's different from lang in 1
|
|
83
|
-
* @param lang - language of the bundle
|
|
84
|
-
* @param fallbackLanguage - fallback language in case bundle in language not found
|
|
85
|
-
*/
|
|
86
|
-
getTranslationFromLocal(lang, fallbackLanguage) {
|
|
87
|
-
const pathPrefix = this.localizationConfiguration.bundlesOutputPath;
|
|
88
|
-
return this.downloadLanguageBundle$(pathPrefix + lang + JSON_EXT).pipe(catchError(() => {
|
|
89
|
-
if (lang === fallbackLanguage) {
|
|
90
|
-
this.logger?.warn(`Failed to load ${lang} from ${pathPrefix + lang + JSON_EXT}.`);
|
|
91
|
-
return of({});
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
this.logger?.warn(`Failed to load ${lang} from ${pathPrefix + lang + JSON_EXT}. Application will fallback to ${fallbackLanguage}`);
|
|
95
|
-
return this.downloadLanguageBundle$(pathPrefix + fallbackLanguage + JSON_EXT).pipe(catchError(() => of({})));
|
|
96
|
-
}
|
|
97
|
-
}));
|
|
98
|
-
}
|
|
99
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationsLoader, deps: [{ token: LOCALIZATION_CONFIGURATION_TOKEN }, { token: i1.LoggerService, optional: true }, { token: i2.DynamicContentService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
100
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationsLoader }); }
|
|
101
|
-
}
|
|
102
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationsLoader, decorators: [{
|
|
103
|
-
type: Injectable
|
|
104
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
105
|
-
type: Inject,
|
|
106
|
-
args: [LOCALIZATION_CONFIGURATION_TOKEN]
|
|
107
|
-
}] }, { type: i1.LoggerService, decorators: [{
|
|
108
|
-
type: Optional
|
|
109
|
-
}] }, { type: i2.DynamicContentService, decorators: [{
|
|
110
|
-
type: Optional
|
|
111
|
-
}] }] });
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb25zLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29scy90cmFuc2xhdGlvbnMtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQ0wscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGFBQWEsR0FDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLElBQUksRUFFSixFQUFFLEdBQ0gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEdBQUcsRUFDSCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QixPQUFPLEVBQ0wsZ0NBQWdDLEdBQ2pDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFOUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBRXpCOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUF1RSx5QkFBb0QsRUFDNUYsTUFBc0IsRUFDdEIscUJBQTZDO1FBRkwsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUM1RixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXdCO0lBQUcsQ0FBQztJQUVoRjs7O09BR0c7SUFDSyx1QkFBdUIsQ0FBQyxHQUFXO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUM7UUFFL0QsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsV0FBVyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFB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Qzs7MEJBQ2pELFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFRyYW5zbGF0ZUxvYWRlcixcbn0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBEeW5hbWljQ29udGVudFNlcnZpY2UsXG59IGZyb20gJ0BvM3IvZHluYW1pYy1jb250ZW50JztcbmltcG9ydCB7XG4gIExvZ2dlclNlcnZpY2UsXG59IGZyb20gJ0BvM3IvbG9nZ2VyJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZyb20sXG4gIE9ic2VydmFibGUsXG4gIG9mLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIG1hcCxcbiAgc3dpdGNoTWFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBMb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLFxufSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7XG4gIExPQ0FMSVpBVElPTl9DT05GSUdVUkFUSU9OX1RPS0VOLFxufSBmcm9tICcuL2xvY2FsaXphdGlvbi50b2tlbic7XG5cbmNvbnN0IEpTT05fRVhUID0gJy5qc29uJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRyYW5zbGF0aW9uIGJ1bmRsZXMgZnJvbSByZW1vdGUgb3IgbG9jYWwgZW5kcG9pbnRzIGRlcGVuZGluZyBvbiB0aGUgTG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5cbiAqIEZhbGxiYWNrIG1lY2hhbmlzbSBlbnN1cmVzIHRoYXQgaWYgYSBidW5kbGUgaW4gc29tZSBsYW5ndWFnZSBjYW5ub3QgYmUgZmV0Y2hlZCByZW1vdGVseVxuICogd2UgdHJ5IHRvIGZldGNoIHRoZSBzYW1lIGxhbmd1YWdlIGJ1bmRsZSBsb2NhbGx5IChidW5kbGVzIHN0b3JlZCBpbnNpZGUgdGhlIGFwcGxpY2F0aW9uKVxuICogYW5kIGZpbmFsbHkgbG9hZCB0aGUgZmFsbGJhY2sgbGFuZ3VhZ2UgYnVuZGxlIChpZiBhbGwgcHJldmlvdXMgZmV0Y2hlcyBmYWlsZWQpXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvbnNMb2FkZXIgaW1wbGVtZW50cyBUcmFuc2xhdGVMb2FkZXIge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KExPQ0FMSVpBVElPTl9DT05GSUdVUkFUSU9OX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb246IExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbnRlbnRTZXJ2aWNlPzogRHluYW1pY0NvbnRlbnRTZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBhIGxhbmd1YWdlIGJ1bmRsZSBmaWxlXG4gICAqIEBwYXJhbSAgdXJsIFVybCB0byB0aGUgYnVuZGxlIGZpbGVcbiAgICovXG4gIHByaXZhdGUgZG93bmxvYWRMYW5ndWFnZUJ1bmRsZSQodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5xdWVyeVBhcmFtcztcblxuICAgIGxldCBxdWVyeVN0cmluZyA9ICcnO1xuICAgIGlmIChxdWVyeVBhcmFtcykge1xuICAgICAgcXVlcnlTdHJpbmcgPSAnPycgKyBPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubWFwKChrZXkpID0+IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1zW2tleV0pKS5qb2luKCcmJyk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tKGZldGNoKHVybCArIHF1ZXJ5U3RyaW5nLCB0aGlzLmxvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24uZmV0Y2hPcHRpb25zKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzcG9uc2UpID0+IGZyb20ocmVzcG9uc2UuanNvbigpKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBmYWxsYmFjayA9IHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5mYWxsYmFja0xhbmd1YWdlO1xuICAgIGxldCBsb2NhbGl6YXRpb25QYXRoJCA9IG9mKHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5lbmRQb2ludFVybCk7XG5cbiAgICBpZiAodGhpcy5sb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLnVzZUR5bmFtaWNDb250ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuZHluYW1pY0NvbnRlbnRTZXJ2aWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRHluYW1pYyBDb250ZW50IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSB2ZXJpZnkgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIG1vZHVsZSBEeW5hbWljQ29udGVudE1vZHVsZSBpbiB5b3VyIGFwcGxpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgICBsb2NhbGl6YXRpb25QYXRoJCA9IHRoaXMuZHluYW1pY0NvbnRlbnRTZXJ2aWNlLmdldENvbnRlbnRQYXRoU3RyZWFtKHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5lbmRQb2ludFVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsaXphdGlvblBhdGgkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGxvY2FsaXphdGlvblBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAobG9jYWxpemF0aW9uUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGxvY2FsaXphdGlvbkJ1bmRsZSQgPSB0aGlzLmRvd25sb2FkTGFuZ3VhZ2VCdW5kbGUkKGxvY2FsaXphdGlvblBhdGggKyBsYW5nICsgSlNPTl9FWFQpO1xuXG4gICAgICAgICAgaWYgKHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5tZXJnZVdpdGhMb2NhbFRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgICBsb2NhbGl6YXRpb25CdW5kbGUkLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZih7fSkpKSxcbiAgICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21Mb2NhbChsYW5nLCBmYWxsYmFjaykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModHJhbnNsYXRpb25zKS5mb3JFYWNoKChrZXkpID0+IHRyYW5zbGF0aW9uc1trZXldID0gYFtsb2NhbF0gJHt0cmFuc2xhdGlvbnNba2V5XSBhcyBzdHJpbmd9YCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25zO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLnBpcGUobWFwKChbZHluYW1pY1RyYW5zbGF0aW9ucywgbG9jYWxUcmFuc2xhdGlvbnNdKSA9PiAoeyAuLi5sb2NhbFRyYW5zbGF0aW9ucywgLi4uZHluYW1pY1RyYW5zbGF0aW9ucyB9KSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qXG4gICAgICAgICAgKiBpZiBlbmRQb2ludFVybCBpcyBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gdGhlbjpcbiAgICAgICAgICAqICAgMS4gdHJ5IHRvIGxvYWQgbGFuZyBmcm9tIGVuZFBvaW50VXJsXG4gICAgICAgICAgKiAgIDIuIGlmIDEgZmFpbHMgdGhlbiB0cnkgdG8gbG9hZCBmcm9tIHRoZSBhcHAgKGxvY2FsIGZpbGUpXG4gICAgICAgICAgKi9cbiAgICAgICAgICByZXR1cm4gbG9jYWxpemF0aW9uQnVuZGxlJC5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyPy53YXJuKGBGYWlsZWQgdG8gbG9hZCB0aGUgbG9jYWxpemF0aW9uIHJlc291cmNlIGZyb20gJHtsb2NhbGl6YXRpb25QYXRoICsgbGFuZyArIEpTT05fRVhUfSwgdHJ5aW5nIGZyb20gdGhlIGFwcGxpY2F0aW9uIHJlc291cmNlc2ApO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21Mb2NhbChsYW5nLCBmYWxsYmFjayk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgKiBlbHNlIGlmIGVuZFBvaW50VXJsIE5PVCBzcGVjaWZpZWQgYnkgdGhlbiBjb25maWd1cmF0aW9uIHRoZW46XG4gICAgICAgICogICAxLiB0cnkgdG8gbG9hZCBmcm9tIHRoZSBhcHAgKGxvY2FsIGZpbGUpXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubG9nZ2VyPy53YXJuKCdObyBsb2NhbGl6YXRpb24gZW5kcG9pbnQgc3BlY2lmaWVkLCBsb2NhbGl6YXRpb24gZmV0Y2ggZnJvbSBhcHBsaWNhdGlvbiByZXNvdXJjZXMnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25Gcm9tTG9jYWwobGFuZywgZmFsbGJhY2spO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqRmV0Y2hlcyBsb2NhbGl6YXRpb24gYnVuZGxlcyBmcm9tIHB1Ymxpc2hlZCBmb2xkZXIgKGludGVybmFsIHRvIGFwcGxpY2F0aW9uKVxuICAgKlxuICAgKjEuIHRyeSB0byBsb2FkIGxhbmcgZnJvbSBsb2NhbFxuICAgKjIuIGlmIDEgZmFpbHMgdHJ5IHRvIGxvYWQgZmFsbGJhY2sgbGFuZyBidXQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIGxhbmcgaW4gMVxuICAgKiBAcGFyYW0gbGFuZyAtIGxhbmd1YWdlIG9mIHRoZSBidW5kbGVcbiAgICogQHBhcmFtIGZhbGxiYWNrTGFuZ3VhZ2UgLSBmYWxsYmFjayBsYW5ndWFnZSBpbiBjYXNlIGJ1bmRsZSBpbiBsYW5ndWFnZSBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFuc2xhdGlvbkZyb21Mb2NhbChsYW5nOiBzdHJpbmcsIGZhbGxiYWNrTGFuZ3VhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcGF0aFByZWZpeDogc3RyaW5nID0gdGhpcy5sb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLmJ1bmRsZXNPdXRwdXRQYXRoO1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTGFuZ3VhZ2VCdW5kbGUkKHBhdGhQcmVmaXggKyBsYW5nICsgSlNPTl9FWFQpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgaWYgKGxhbmcgPT09IGZhbGxiYWNrTGFuZ3VhZ2UpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlcj8ud2FybihgRmFpbGVkIHRvIGxvYWQgJHtsYW5nfSBmcm9tICR7cGF0aFByZWZpeCArIGxhbmcgKyBKU09OX0VYVH0uYCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlcj8ud2FybihgRmFpbGVkIHRvIGxvYWQgJHtsYW5nfSBmcm9tICR7cGF0aFByZWZpeCArIGxhbmcgKyBKU09OX0VYVH0uIEFwcGxpY2F0aW9uIHdpbGwgZmFsbGJhY2sgdG8gJHtmYWxsYmFja0xhbmd1YWdlfWApO1xuICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkTGFuZ3VhZ2VCdW5kbGUkKHBhdGhQcmVmaXggKyBmYWxsYmFja0xhbmd1YWdlICsgSlNPTl9FWFQpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHt9KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|