@abp/ng.core 5.0.1 → 5.0.2
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/README.md +3 -3
- package/abp-ng.core.d.ts +5 -5
- package/bundles/abp-ng.core-locale.umd.js +361 -361
- package/bundles/abp-ng.core-locale.umd.js.map +1 -1
- package/bundles/abp-ng.core-testing.umd.js +442 -442
- package/bundles/abp-ng.core-testing.umd.js.map +1 -1
- package/bundles/abp-ng.core.umd.js +4873 -4868
- package/bundles/abp-ng.core.umd.js.map +1 -1
- package/esm2015/abp-ng.core.js +4 -4
- package/esm2015/lib/abstracts/index.js +2 -2
- package/esm2015/lib/abstracts/ng-model.component.js +59 -59
- package/esm2015/lib/components/dynamic-layout.component.js +89 -89
- package/esm2015/lib/components/index.js +4 -4
- package/esm2015/lib/components/replaceable-route-container.component.js +42 -42
- package/esm2015/lib/components/router-outlet.component.js +15 -15
- package/esm2015/lib/constants/different-locales.js +337 -337
- package/esm2015/lib/constants/index.js +2 -2
- package/esm2015/lib/core.module.js +281 -281
- package/esm2015/lib/directives/autofocus.directive.js +30 -30
- package/esm2015/lib/directives/debounce.directive.js +36 -36
- package/esm2015/lib/directives/for.directive.js +151 -151
- package/esm2015/lib/directives/form-submit.directive.js +69 -69
- package/esm2015/lib/directives/index.js +9 -9
- package/esm2015/lib/directives/init.directive.js +21 -21
- package/esm2015/lib/directives/permission.directive.js +48 -48
- package/esm2015/lib/directives/replaceable-template.directive.js +121 -121
- package/esm2015/lib/directives/stop-propagation.directive.js +32 -32
- package/esm2015/lib/enums/common.js +2 -2
- package/esm2015/lib/enums/index.js +2 -2
- package/esm2015/lib/guards/auth.guard.js +29 -29
- package/esm2015/lib/guards/index.js +3 -3
- package/esm2015/lib/guards/permission.guard.js +44 -44
- package/esm2015/lib/handlers/oauth-configuration.handler.js +37 -37
- package/esm2015/lib/handlers/routes.handler.js +47 -47
- package/esm2015/lib/interceptors/api.interceptor.js +54 -54
- package/esm2015/lib/interceptors/index.js +2 -2
- package/esm2015/lib/localization.module.js +16 -16
- package/esm2015/lib/models/auth.js +2 -2
- package/esm2015/lib/models/common.js +2 -2
- package/esm2015/lib/models/dtos.js +119 -119
- package/esm2015/lib/models/environment.js +2 -2
- package/esm2015/lib/models/index.js +10 -10
- package/esm2015/lib/models/localization.js +2 -2
- package/esm2015/lib/models/replaceable-components.js +2 -2
- package/esm2015/lib/models/rest.js +2 -2
- package/esm2015/lib/models/session.js +2 -2
- package/esm2015/lib/models/utility.js +2 -2
- package/esm2015/lib/pipes/index.js +3 -3
- package/esm2015/lib/pipes/localization.pipe.js +33 -33
- package/esm2015/lib/pipes/sort.pipe.js +49 -49
- package/esm2015/lib/providers/cookie-language.provider.js +22 -22
- package/esm2015/lib/providers/locale.provider.js +22 -22
- package/esm2015/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.js +29 -29
- package/esm2015/lib/proxy/pages/abp/multi-tenancy/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.js +24 -24
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.js +25 -25
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/index.js +5 -5
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/models.js +3 -3
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/http/modeling/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/http/modeling/models.js +3 -3
- package/esm2015/lib/proxy/volo/abp/localization/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/localization/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/models.js +2 -2
- package/esm2015/lib/services/auth.service.js +47 -47
- package/esm2015/lib/services/config-state.service.js +130 -130
- package/esm2015/lib/services/content-projection.service.js +17 -17
- package/esm2015/lib/services/dom-insertion.service.js +32 -32
- package/esm2015/lib/services/environment.service.js +35 -35
- package/esm2015/lib/services/http-error-reporter.service.js +29 -29
- package/esm2015/lib/services/http-wait.service.js +72 -72
- package/esm2015/lib/services/index.js +22 -22
- package/esm2015/lib/services/lazy-load.service.js +38 -38
- package/esm2015/lib/services/list.service.js +103 -103
- package/esm2015/lib/services/localization.service.js +182 -182
- package/esm2015/lib/services/multi-tenancy.service.js +48 -48
- package/esm2015/lib/services/permission.service.js +64 -64
- package/esm2015/lib/services/replaceable-components.service.js +49 -49
- package/esm2015/lib/services/resource-wait.service.js +39 -39
- package/esm2015/lib/services/rest.service.js +63 -63
- package/esm2015/lib/services/router-events.service.js +38 -38
- package/esm2015/lib/services/router-wait.service.js +51 -51
- package/esm2015/lib/services/routes.service.js +147 -147
- package/esm2015/lib/services/session-state.service.js +76 -76
- package/esm2015/lib/services/subscription.service.js +41 -41
- package/esm2015/lib/services/track-by.service.js +21 -21
- package/esm2015/lib/strategies/auth-flow.strategy.js +202 -202
- package/esm2015/lib/strategies/container.strategy.js +38 -38
- package/esm2015/lib/strategies/content-security.strategy.js +28 -28
- package/esm2015/lib/strategies/content.strategy.js +48 -48
- package/esm2015/lib/strategies/context.strategy.js +37 -37
- package/esm2015/lib/strategies/cross-origin.strategy.js +26 -26
- package/esm2015/lib/strategies/dom.strategy.js +27 -27
- package/esm2015/lib/strategies/index.js +9 -9
- package/esm2015/lib/strategies/loading.strategy.js +58 -58
- package/esm2015/lib/strategies/projection.strategy.js +80 -80
- package/esm2015/lib/tokens/app-config.token.js +3 -3
- package/esm2015/lib/tokens/cookie-language-key.token.js +5 -5
- package/esm2015/lib/tokens/index.js +9 -9
- package/esm2015/lib/tokens/list.token.js +3 -3
- package/esm2015/lib/tokens/localization.token.js +10 -10
- package/esm2015/lib/tokens/lodaer-delay.token.js +3 -3
- package/esm2015/lib/tokens/manage-profile.token.js +12 -12
- package/esm2015/lib/tokens/options.token.js +8 -8
- package/esm2015/lib/tokens/tenant-key.token.js +3 -3
- package/esm2015/lib/utils/array-utils.js +7 -7
- package/esm2015/lib/utils/auth-utils.js +42 -42
- package/esm2015/lib/utils/common-utils.js +29 -29
- package/esm2015/lib/utils/date-extensions.js +6 -6
- package/esm2015/lib/utils/date-utils.js +13 -13
- package/esm2015/lib/utils/environment-utils.js +36 -36
- package/esm2015/lib/utils/factory-utils.js +24 -24
- package/esm2015/lib/utils/file-utils.js +14 -14
- package/esm2015/lib/utils/form-utils.js +12 -12
- package/esm2015/lib/utils/generator-utils.js +34 -34
- package/esm2015/lib/utils/http-utils.js +19 -19
- package/esm2015/lib/utils/index.js +21 -21
- package/esm2015/lib/utils/initial-utils.js +64 -64
- package/esm2015/lib/utils/internal-store-utils.js +36 -36
- package/esm2015/lib/utils/lazy-load-utils.js +40 -40
- package/esm2015/lib/utils/localization-utils.js +50 -50
- package/esm2015/lib/utils/multi-tenancy-utils.js +83 -83
- package/esm2015/lib/utils/number-utils.js +4 -4
- package/esm2015/lib/utils/object-utils.js +37 -37
- package/esm2015/lib/utils/route-utils.js +27 -27
- package/esm2015/lib/utils/string-utils.js +25 -21
- package/esm2015/lib/utils/tree-utils.js +54 -54
- package/esm2015/lib/validators/age.validator.js +14 -14
- package/esm2015/lib/validators/credit-card.validator.js +21 -21
- package/esm2015/lib/validators/index.js +23 -23
- package/esm2015/lib/validators/range.validator.js +15 -15
- package/esm2015/lib/validators/required.validator.js +13 -13
- package/esm2015/lib/validators/string-length.validator.js +15 -15
- package/esm2015/lib/validators/url.validator.js +16 -16
- package/esm2015/locale/abp-ng.core-locale.js +4 -4
- package/esm2015/locale/public-api.js +2 -2
- package/esm2015/locale/utils/register-locale.js +43 -43
- package/esm2015/public-api.js +26 -26
- package/esm2015/testing/abp-ng.core-testing.js +4 -4
- package/esm2015/testing/lib/core-testing.module.js +62 -62
- package/esm2015/testing/lib/services/index.js +3 -3
- package/esm2015/testing/lib/services/mock-permission.service.js +35 -35
- package/esm2015/testing/lib/services/mock-rest.service.js +30 -30
- package/esm2015/testing/lib/utils/clear-page.util.js +10 -10
- package/esm2015/testing/lib/utils/index.js +3 -3
- package/esm2015/testing/lib/utils/wait.util.js +5 -5
- package/esm2015/testing/public-api.js +4 -4
- package/fesm2015/abp-ng.core-locale.js +40 -40
- package/fesm2015/abp-ng.core-locale.js.map +1 -1
- package/fesm2015/abp-ng.core-testing.js +113 -113
- package/fesm2015/abp-ng.core-testing.js.map +1 -1
- package/fesm2015/abp-ng.core.js +3979 -3975
- package/fesm2015/abp-ng.core.js.map +1 -1
- package/lib/abstracts/index.d.ts +1 -1
- package/lib/abstracts/ng-model.component.d.ts +25 -25
- package/lib/components/dynamic-layout.component.d.ts +27 -27
- package/lib/components/index.d.ts +3 -3
- package/lib/components/replaceable-route-container.component.d.ts +17 -17
- package/lib/components/router-outlet.component.d.ts +5 -5
- package/lib/constants/different-locales.d.ts +334 -334
- package/lib/constants/index.d.ts +1 -1
- package/lib/core.module.d.ts +56 -56
- package/lib/directives/autofocus.directive.d.ts +12 -12
- package/lib/directives/debounce.directive.d.ts +13 -13
- package/lib/directives/for.directive.d.ts +36 -36
- package/lib/directives/form-submit.directive.d.ts +19 -19
- package/lib/directives/index.d.ts +8 -8
- package/lib/directives/init.directive.d.ts +10 -10
- package/lib/directives/permission.directive.d.ts +18 -18
- package/lib/directives/replaceable-template.directive.d.ts +30 -30
- package/lib/directives/stop-propagation.directive.d.ts +12 -12
- package/lib/enums/common.d.ts +5 -5
- package/lib/enums/index.d.ts +1 -1
- package/lib/guards/auth.guard.d.ts +13 -13
- package/lib/guards/index.d.ts +2 -2
- package/lib/guards/permission.guard.d.ts +16 -16
- package/lib/handlers/oauth-configuration.handler.d.ts +13 -13
- package/lib/handlers/routes.handler.d.ts +11 -11
- package/lib/interceptors/api.interceptor.d.ts +16 -16
- package/lib/interceptors/index.d.ts +1 -1
- package/lib/localization.module.d.ts +7 -7
- package/lib/models/auth.d.ts +6 -6
- package/lib/models/common.d.ts +77 -77
- package/lib/models/dtos.d.ts +95 -95
- package/lib/models/environment.d.ts +35 -35
- package/lib/models/index.d.ts +9 -9
- package/lib/models/localization.d.ts +5 -5
- package/lib/models/replaceable-components.d.ts +45 -45
- package/lib/models/rest.d.ts +35 -35
- package/lib/models/session.d.ts +7 -7
- package/lib/models/utility.d.ts +14 -14
- package/lib/pipes/index.d.ts +2 -2
- package/lib/pipes/localization.pipe.d.ts +12 -12
- package/lib/pipes/sort.pipe.d.ts +9 -9
- package/lib/providers/cookie-language.provider.d.ts +3 -3
- package/lib/providers/locale.provider.d.ts +9 -9
- package/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.d.ts +12 -12
- package/lib/proxy/pages/abp/multi-tenancy/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.d.ts +11 -11
- package/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.d.ts +11 -11
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/index.d.ts +4 -4
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/models.d.ts +85 -85
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/models.d.ts +71 -71
- package/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models.d.ts +14 -14
- package/lib/proxy/volo/abp/http/modeling/index.d.ts +1 -1
- package/lib/proxy/volo/abp/http/modeling/models.d.ts +70 -70
- package/lib/proxy/volo/abp/localization/index.d.ts +1 -1
- package/lib/proxy/volo/abp/localization/models.d.ts +6 -6
- package/lib/proxy/volo/abp/models.d.ts +4 -4
- package/lib/services/auth.service.d.ts +17 -17
- package/lib/services/config-state.service.d.ts +339 -339
- package/lib/services/content-projection.service.d.ts +10 -10
- package/lib/services/dom-insertion.service.d.ts +10 -10
- package/lib/services/environment.service.d.ts +96 -96
- package/lib/services/http-error-reporter.service.d.ts +12 -12
- package/lib/services/http-wait.service.d.ts +30 -30
- package/lib/services/index.d.ts +21 -21
- package/lib/services/lazy-load.service.d.ts +13 -13
- package/lib/services/list.service.d.ts +39 -39
- package/lib/services/localization.service.d.ts +47 -47
- package/lib/services/multi-tenancy.service.d.ts +22 -22
- package/lib/services/permission.service.d.ts +19 -19
- package/lib/services/replaceable-components.service.d.ts +19 -19
- package/lib/services/resource-wait.service.d.ts +15 -15
- package/lib/services/rest.service.d.ts +20 -20
- package/lib/services/router-events.service.d.ts +29 -29
- package/lib/services/router-wait.service.d.ts +20 -20
- package/lib/services/routes.service.d.ts +50 -50
- package/lib/services/session-state.service.d.ts +25 -25
- package/lib/services/subscription.service.d.ts +17 -17
- package/lib/services/track-by.service.d.ts +11 -11
- package/lib/strategies/auth-flow.strategy.d.ts +367 -367
- package/lib/strategies/container.strategy.d.ts +22 -22
- package/lib/strategies/content-security.strategy.d.ts +17 -17
- package/lib/strategies/content.strategy.d.ts +26 -26
- package/lib/strategies/context.strategy.d.ts +23 -23
- package/lib/strategies/cross-origin.strategy.d.ts +14 -14
- package/lib/strategies/dom.strategy.d.ts +13 -13
- package/lib/strategies/index.d.ts +8 -8
- package/lib/strategies/loading.strategy.d.ts +28 -28
- package/lib/strategies/projection.strategy.d.ts +39 -39
- package/lib/tokens/app-config.token.d.ts +3 -3
- package/lib/tokens/cookie-language-key.token.d.ts +2 -2
- package/lib/tokens/index.d.ts +8 -8
- package/lib/tokens/list.token.d.ts +2 -2
- package/lib/tokens/localization.token.d.ts +6 -6
- package/lib/tokens/lodaer-delay.token.d.ts +2 -2
- package/lib/tokens/manage-profile.token.d.ts +2 -2
- package/lib/tokens/options.token.d.ts +4 -4
- package/lib/tokens/tenant-key.token.d.ts +2 -2
- package/lib/utils/array-utils.d.ts +1 -1
- package/lib/utils/auth-utils.d.ts +162 -162
- package/lib/utils/common-utils.d.ts +9 -9
- package/lib/utils/date-extensions.d.ts +6 -6
- package/lib/utils/date-utils.d.ts +4 -4
- package/lib/utils/environment-utils.d.ts +3 -3
- package/lib/utils/factory-utils.d.ts +9 -9
- package/lib/utils/file-utils.d.ts +1 -1
- package/lib/utils/form-utils.d.ts +2 -2
- package/lib/utils/generator-utils.d.ts +3 -3
- package/lib/utils/http-utils.d.ts +8 -8
- package/lib/utils/index.d.ts +20 -20
- package/lib/utils/initial-utils.d.ts +159 -159
- package/lib/utils/internal-store-utils.d.ts +14 -14
- package/lib/utils/lazy-load-utils.d.ts +4 -4
- package/lib/utils/localization-utils.d.ts +5 -5
- package/lib/utils/multi-tenancy-utils.d.ts +3 -3
- package/lib/utils/number-utils.d.ts +1 -1
- package/lib/utils/object-utils.d.ts +1 -1
- package/lib/utils/route-utils.d.ts +8 -8
- package/lib/utils/string-utils.d.ts +3 -2
- package/lib/utils/tree-utils.d.ts +19 -19
- package/lib/validators/age.validator.d.ts +10 -10
- package/lib/validators/credit-card.validator.d.ts +5 -5
- package/lib/validators/index.d.ts +22 -22
- package/lib/validators/range.validator.d.ts +12 -12
- package/lib/validators/required.validator.d.ts +8 -8
- package/lib/validators/string-length.validator.d.ts +14 -14
- package/lib/validators/url.validator.d.ts +5 -5
- package/locale/abp-ng.core-locale.d.ts +5 -5
- package/locale/public-api.d.ts +1 -1
- package/locale/utils/register-locale.d.ts +13 -13
- package/package.json +2 -2
- package/public-api.d.ts +24 -24
- package/testing/abp-ng.core-testing.d.ts +5 -5
- package/testing/lib/core-testing.module.d.ts +16 -16
- package/testing/lib/services/index.d.ts +2 -2
- package/testing/lib/services/mock-permission.service.d.ts +10 -10
- package/testing/lib/services/mock-rest.service.d.ts +13 -13
- package/testing/lib/utils/clear-page.util.d.ts +2 -2
- package/testing/lib/utils/index.d.ts +2 -2
- package/testing/lib/utils/wait.util.d.ts +2 -2
- package/testing/public-api.d.ts +3 -3
|
@@ -1,182 +1,182 @@
|
|
|
1
|
-
import { registerLocaleData } from '@angular/common';
|
|
2
|
-
import { Injectable, Injector, isDevMode, Optional, SkipSelf } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject, combineLatest, from, Subject } from 'rxjs';
|
|
4
|
-
import { filter, map, mapTo, switchMap } from 'rxjs/operators';
|
|
5
|
-
import { localizations$ } from '../tokens/localization.token';
|
|
6
|
-
import { CORE_OPTIONS } from '../tokens/options.token';
|
|
7
|
-
import { createLocalizer, createLocalizerWithFallback } from '../utils/localization-utils';
|
|
8
|
-
import { interpolate } from '../utils/string-utils';
|
|
9
|
-
import { ConfigStateService } from './config-state.service';
|
|
10
|
-
import { SessionStateService } from './session-state.service';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "./session-state.service";
|
|
13
|
-
import * as i2 from "./config-state.service";
|
|
14
|
-
export class LocalizationService {
|
|
15
|
-
constructor(sessionState, injector, otherInstance, configState) {
|
|
16
|
-
this.sessionState = sessionState;
|
|
17
|
-
this.injector = injector;
|
|
18
|
-
this.configState = configState;
|
|
19
|
-
this.latestLang = this.sessionState.getLanguage();
|
|
20
|
-
this._languageChange$ = new Subject();
|
|
21
|
-
this.uiLocalizations$ = new BehaviorSubject(new Map());
|
|
22
|
-
this.localizations$ = new BehaviorSubject(new Map());
|
|
23
|
-
if (otherInstance)
|
|
24
|
-
throw new Error('LocalizationService should have only one instance.');
|
|
25
|
-
this.listenToSetLanguage();
|
|
26
|
-
this.initLocalizationValues();
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Returns currently selected language
|
|
30
|
-
*/
|
|
31
|
-
get currentLang() {
|
|
32
|
-
return this.latestLang || this.sessionState.getLanguage();
|
|
33
|
-
}
|
|
34
|
-
get languageChange$() {
|
|
35
|
-
return this._languageChange$.asObservable();
|
|
36
|
-
}
|
|
37
|
-
initLocalizationValues() {
|
|
38
|
-
localizations$.subscribe(val => this.addLocalization(val));
|
|
39
|
-
const remoteLocalizations$ = this.configState.getDeep$('localization.values');
|
|
40
|
-
const currentLanguage$ = this.sessionState.getLanguage$();
|
|
41
|
-
const uiLocalizations$ = combineLatest([currentLanguage$, this.uiLocalizations$]).pipe(map(([currentLang, localizations]) => localizations.get(currentLang)));
|
|
42
|
-
combineLatest([remoteLocalizations$, uiLocalizations$])
|
|
43
|
-
.pipe(map(([remote, local]) => {
|
|
44
|
-
if (remote) {
|
|
45
|
-
if (!local) {
|
|
46
|
-
local = new Map();
|
|
47
|
-
}
|
|
48
|
-
Object.entries(remote).forEach(entry => {
|
|
49
|
-
const resourceName = entry[0];
|
|
50
|
-
const remoteTexts = entry[1];
|
|
51
|
-
let resource = local.get(resourceName) || {};
|
|
52
|
-
resource = Object.assign(Object.assign({}, resource), remoteTexts);
|
|
53
|
-
local.set(resourceName, resource);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return local;
|
|
57
|
-
}))
|
|
58
|
-
.subscribe(val => this.localizations$.next(val));
|
|
59
|
-
}
|
|
60
|
-
addLocalization(localizations) {
|
|
61
|
-
if (!localizations)
|
|
62
|
-
return;
|
|
63
|
-
const localizationMap = this.uiLocalizations$.value;
|
|
64
|
-
localizations.forEach(loc => {
|
|
65
|
-
const cultureMap = localizationMap.get(loc.culture) || new Map();
|
|
66
|
-
loc.resources.forEach(res => {
|
|
67
|
-
let resource = cultureMap.get(res.resourceName) || {};
|
|
68
|
-
resource = Object.assign(Object.assign({}, resource), res.texts);
|
|
69
|
-
cultureMap.set(res.resourceName, resource);
|
|
70
|
-
});
|
|
71
|
-
localizationMap.set(loc.culture, cultureMap);
|
|
72
|
-
});
|
|
73
|
-
this.uiLocalizations$.next(localizationMap);
|
|
74
|
-
}
|
|
75
|
-
listenToSetLanguage() {
|
|
76
|
-
this.sessionState
|
|
77
|
-
.onLanguageChange$()
|
|
78
|
-
.pipe(filter(lang => this.configState.getDeep('localization.currentCulture.cultureName') !== lang), switchMap(lang => this.configState.refreshAppState().pipe(mapTo(lang))), switchMap(lang => from(this.registerLocale(lang).then(() => lang))))
|
|
79
|
-
.subscribe(lang => this._languageChange$.next(lang));
|
|
80
|
-
}
|
|
81
|
-
registerLocale(locale) {
|
|
82
|
-
const { registerLocaleFn } = this.injector.get(CORE_OPTIONS);
|
|
83
|
-
return registerLocaleFn(locale).then(module => {
|
|
84
|
-
if (module === null || module === void 0 ? void 0 : module.default)
|
|
85
|
-
registerLocaleData(module.default);
|
|
86
|
-
this.latestLang = locale;
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Returns an observable localized text with the given interpolation parameters in current language.
|
|
91
|
-
* @param key Localizaton key to replace with localized text
|
|
92
|
-
* @param interpolateParams Values to interpolate
|
|
93
|
-
*/
|
|
94
|
-
get(key, ...interpolateParams) {
|
|
95
|
-
return this.configState
|
|
96
|
-
.getAll$()
|
|
97
|
-
.pipe(map(state => this.getLocalization(state, key, ...interpolateParams)));
|
|
98
|
-
}
|
|
99
|
-
getResource(resourceName) {
|
|
100
|
-
return this.localizations$.value.get(resourceName);
|
|
101
|
-
}
|
|
102
|
-
getResource$(resourceName) {
|
|
103
|
-
return this.localizations$.pipe(map(res => res.get(resourceName)));
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Returns localized text with the given interpolation parameters in current language.
|
|
107
|
-
* @param key Localization key to replace with localized text
|
|
108
|
-
* @param interpolateParams Values to intepolate.
|
|
109
|
-
*/
|
|
110
|
-
instant(key, ...interpolateParams) {
|
|
111
|
-
return this.getLocalization(this.configState.getAll(), key, ...interpolateParams);
|
|
112
|
-
}
|
|
113
|
-
localize(resourceName, key, defaultValue) {
|
|
114
|
-
return this.configState.getOne$('localization').pipe(map(createLocalizer), map(localize => localize(resourceName, key, defaultValue)));
|
|
115
|
-
}
|
|
116
|
-
localizeSync(resourceName, key, defaultValue) {
|
|
117
|
-
const localization = this.configState.getOne('localization');
|
|
118
|
-
return createLocalizer(localization)(resourceName, key, defaultValue);
|
|
119
|
-
}
|
|
120
|
-
localizeWithFallback(resourceNames, keys, defaultValue) {
|
|
121
|
-
return this.configState.getOne$('localization').pipe(map(createLocalizerWithFallback), map(localizeWithFallback => localizeWithFallback(resourceNames, keys, defaultValue)));
|
|
122
|
-
}
|
|
123
|
-
localizeWithFallbackSync(resourceNames, keys, defaultValue) {
|
|
124
|
-
const localization = this.configState.getOne('localization');
|
|
125
|
-
return createLocalizerWithFallback(localization)(resourceNames, keys, defaultValue);
|
|
126
|
-
}
|
|
127
|
-
getLocalization(state, key, ...interpolateParams) {
|
|
128
|
-
if (!key)
|
|
129
|
-
key = '';
|
|
130
|
-
let defaultValue;
|
|
131
|
-
if (typeof key !== 'string') {
|
|
132
|
-
defaultValue = key.defaultValue;
|
|
133
|
-
key = key.key;
|
|
134
|
-
}
|
|
135
|
-
const keys = key.split('::');
|
|
136
|
-
const warn = (message) => {
|
|
137
|
-
if (isDevMode)
|
|
138
|
-
console.warn(message);
|
|
139
|
-
};
|
|
140
|
-
if (keys.length < 2) {
|
|
141
|
-
warn('The localization source separator (::) not found.');
|
|
142
|
-
return defaultValue || key;
|
|
143
|
-
}
|
|
144
|
-
if (!state.localization)
|
|
145
|
-
return defaultValue || keys[1];
|
|
146
|
-
const sourceName = keys[0] || state.localization.defaultResourceName;
|
|
147
|
-
const sourceKey = keys[1];
|
|
148
|
-
if (sourceName === '_') {
|
|
149
|
-
return defaultValue || sourceKey;
|
|
150
|
-
}
|
|
151
|
-
if (!sourceName) {
|
|
152
|
-
warn('Localization source name is not specified and the defaultResourceName was not defined!');
|
|
153
|
-
return defaultValue || sourceKey;
|
|
154
|
-
}
|
|
155
|
-
const source = this.localizations$.value.get(sourceName);
|
|
156
|
-
if (!source) {
|
|
157
|
-
warn('Could not find localization source: ' + sourceName);
|
|
158
|
-
return defaultValue || sourceKey;
|
|
159
|
-
}
|
|
160
|
-
let localization = source[sourceKey];
|
|
161
|
-
if (typeof localization === 'undefined') {
|
|
162
|
-
return defaultValue || sourceKey;
|
|
163
|
-
}
|
|
164
|
-
interpolateParams = interpolateParams.filter(params => params != null);
|
|
165
|
-
if (localization)
|
|
166
|
-
localization = interpolate(localization, interpolateParams);
|
|
167
|
-
if (typeof localization !== 'string')
|
|
168
|
-
localization = '';
|
|
169
|
-
return localization || defaultValue || key;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
LocalizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationService, deps: [{ token: i1.SessionStateService }, { token: i0.Injector }, { token: LocalizationService, optional: true, skipSelf: true }, { token: i2.ConfigStateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
173
|
-
LocalizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationService, providedIn: 'root' });
|
|
174
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationService, decorators: [{
|
|
175
|
-
type: Injectable,
|
|
176
|
-
args: [{ providedIn: 'root' }]
|
|
177
|
-
}], ctorParameters: function () { return [{ type: i1.SessionStateService }, { type: i0.Injector }, { type: LocalizationService, decorators: [{
|
|
178
|
-
type: Optional
|
|
179
|
-
}, {
|
|
180
|
-
type: SkipSelf
|
|
181
|
-
}] }, { type: i2.ConfigStateService }]; } });
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2VydmljZXMvbG9jYWxpemF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBRzlELE1BQU0sT0FBTyxtQkFBbUI7SUFxQjlCLFlBQ1UsWUFBaUMsRUFDakMsUUFBa0IsRUFHMUIsYUFBa0MsRUFDMUIsV0FBK0I7UUFML0IsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJbEIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBMUJqQyxlQUFVLEdBQUcsSUFBSSxD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QUksU0FBUyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsc0NBQXNDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDMUQsT0FBTyxZQUFZLElBQUksU0FBUyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQ3ZDLE9BQU8sWUFBWSxJQUFJLFNBQVMsQ0FBQztTQUNsQztRQUVELGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN2RSxJQUFJLFlBQVk7WUFBRSxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUTtZQUFFLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFeEQsT0FBTyxZQUFZLElBQUksWUFBWSxJQUFLLEdBQWMsQ0FBQztJQUN6RCxDQUFDOztpSEFwT1UsbUJBQW1CLDZFQTBCYixtQkFBbUI7cUhBMUJ6QixtQkFBbUIsY0FETixNQUFNOzRGQUNuQixtQkFBbUI7a0JBRC9CLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFO21IQTJCZixtQkFBbUI7MEJBRmpDLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWdpc3RlckxvY2FsZURhdGEgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgaXNEZXZNb2RlLCBPcHRpb25hbCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBtYXBUbywgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBQlAgfSBmcm9tICcuLi9tb2RlbHMvY29tbW9uJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uV2l0aERlZmF1bHQgfSBmcm9tICcuLi9tb2RlbHMvbG9jYWxpemF0aW9uJztcclxuaW1wb3J0IHsgQXBwbGljYXRpb25Db25maWd1cmF0aW9uRHRvIH0gZnJvbSAnLi4vcHJveHkvdm9sby9hYnAvYXNwLW5ldC1jb3JlL212Yy9hcHBsaWNhdGlvbi1jb25maWd1cmF0aW9ucy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBsb2NhbGl6YXRpb25zJCB9IGZyb20gJy4uL3Rva2Vucy9sb2NhbGl6YXRpb24udG9rZW4nO1xyXG5pbXBvcnQgeyBDT1JFX09QVElPTlMgfSBmcm9tICcuLi90b2tlbnMvb3B0aW9ucy50b2tlbic7XHJcbmltcG9ydCB7IGNyZWF0ZUxvY2FsaXplciwgY3JlYXRlTG9jYWxpemVyV2l0aEZhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbHMvbG9jYWxpemF0aW9uLXV0aWxzJztcclxuaW1wb3J0IHsgaW50ZXJwb2xhdGUgfSBmcm9tICcuLi91dGlscy9zdHJpbmctdXRpbHMnO1xyXG5pbXBvcnQgeyBDb25maWdTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Vzc2lvblN0YXRlU2VydmljZSB9IGZyb20gJy4vc2Vzc2lvbi1zdGF0ZS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBMb2NhbGl6YXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIGxhdGVzdExhbmcgPSB0aGlzLnNlc3Npb25TdGF0ZS5nZXRMYW5ndWFnZSgpO1xyXG4gIHByaXZhdGUgX2xhbmd1YWdlQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSB1aUxvY2FsaXphdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChcclxuICAgIG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4oKSxcclxuICApO1xyXG5cclxuICBwcml2YXRlIGxvY2FsaXphdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgY3VycmVudGx5IHNlbGVjdGVkIGxhbmd1YWdlXHJcbiAgICovXHJcbiAgZ2V0IGN1cnJlbnRMYW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMYW5nIHx8IHRoaXMuc2Vzc2lvblN0YXRlLmdldExhbmd1YWdlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZ3VhZ2VDaGFuZ2UkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNlc3Npb25TdGF0ZTogU2Vzc2lvblN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIEBTa2lwU2VsZigpXHJcbiAgICBvdGhlckluc3RhbmNlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb25maWdTdGF0ZTogQ29uZmlnU3RhdGVTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgaWYgKG90aGVySW5zdGFuY2UpIHRocm93IG5ldyBFcnJvcignTG9jYWxpemF0aW9uU2VydmljZSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBpbnN0YW5jZS4nKTtcclxuXHJcbiAgICB0aGlzLmxpc3RlblRvU2V0TGFuZ3VhZ2UoKTtcclxuICAgIHRoaXMuaW5pdExvY2FsaXphdGlvblZhbHVlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0TG9jYWxpemF0aW9uVmFsdWVzKCkge1xyXG4gICAgbG9jYWxpemF0aW9ucyQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLmFkZExvY2FsaXphdGlvbih2YWwpKTtcclxuXHJcbiAgICBjb25zdCByZW1vdGVMb2NhbGl6YXRpb25zJCA9IHRoaXMuY29uZmlnU3RhdGUuZ2V0RGVlcCQoJ2xvY2FsaXphdGlvbi52YWx1ZXMnKSBhcyBPYnNlcnZhYmxlPFxyXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxyXG4gICAgPjtcclxuICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSQgPSB0aGlzLnNlc3Npb25TdGF0ZS5nZXRMYW5ndWFnZSQoKTtcclxuXHJcbiAgICBjb25zdCB1aUxvY2FsaXphdGlvbnMkID0gY29tYmluZUxhdGVzdChbY3VycmVudExhbmd1YWdlJCwgdGhpcy51aUxvY2FsaXphdGlvbnMkXSkucGlwZShcclxuICAgICAgbWFwKChbY3VycmVudExhbmcsIGxvY2FsaXphdGlvbnNdKSA9PiBsb2NhbGl6YXRpb25zLmdldChjdXJyZW50TGFuZykpLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFtyZW1vdGVMb2NhbGl6YXRpb25zJCwgdWlMb2NhbGl6YXRpb25zJF0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgoW3JlbW90ZSwgbG9jYWxdKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVtb3RlKSB7XHJcbiAgICAgICAgICAgIGlmICghbG9jYWwpIHtcclxuICAgICAgICAgICAgICBsb2NhbCA9IG5ldyBNYXAoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVtb3RlKS5mb3JFYWNoKGVudHJ5ID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBlbnRyeVswXTtcclxuICAgICAgICAgICAgICBjb25zdCByZW1vdGVUZXh0cyA9IGVudHJ5WzFdO1xyXG4gICAgICAgICAgICAgIGxldCByZXNvdXJjZSA9IGxvY2FsLmdldChyZXNvdXJjZU5hbWUpIHx8IHt9O1xyXG4gICAgICAgICAgICAgIHJlc291cmNlID0geyAuLi5yZXNvdXJjZSwgLi4ucmVtb3RlVGV4dHMgfTtcclxuXHJcbiAgICAgICAgICAgICAgbG9jYWwuc2V0KHJlc291cmNlTmFtZSwgcmVzb3VyY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gbG9jYWw7XHJcbiAgICAgICAgfSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5sb2NhbGl6YXRpb25zJC5uZXh0KHZhbCkpO1xyXG4gIH1cclxuXHJcbiAgYWRkTG9jYWxpemF0aW9uKGxvY2FsaXphdGlvbnM/OiBBQlAuTG9jYWxpemF0aW9uW10pIHtcclxuICAgIGlmICghbG9jYWxpemF0aW9ucykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGxvY2FsaXphdGlvbk1hcCA9IHRoaXMudWlMb2NhbGl6YXRpb25zJC52YWx1ZTtcclxuXHJcbiAgICBsb2NhbGl6YXRpb25zLmZvckVhY2gobG9jID0+IHtcclxuICAgICAgY29uc3QgY3VsdHVyZU1hcCA9XHJcbiAgICAgICAgbG9jYWxpemF0aW9uTWFwLmdldChsb2MuY3VsdHVyZSkgfHwgbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XHJcblxyXG4gICAgICBsb2MucmVzb3VyY2VzLmZvckVhY2gocmVzID0+IHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBjdWx0dXJlTWFwLmdldChyZXMucmVzb3VyY2VOYW1lKSB8fCB7fTtcclxuXHJcbiAgICAgICAgcmVzb3VyY2UgPSB7IC4uLnJlc291cmNlLCAuLi5yZXMudGV4dHMgfTtcclxuXHJcbiAgICAgICAgY3VsdHVyZU1hcC5zZXQocmVzLnJlc291cmNlTmFtZSwgcmVzb3VyY2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxvY2FsaXphdGlvbk1hcC5zZXQobG9jLmN1bHR1cmUsIGN1bHR1cmVNYXApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51aUxvY2FsaXphdGlvbnMkLm5leHQobG9jYWxpemF0aW9uTWFwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGlzdGVuVG9TZXRMYW5ndWFnZSgpIHtcclxuICAgIHRoaXMuc2Vzc2lvblN0YXRlXHJcbiAgICAgIC5vbkxhbmd1YWdlQ2hhbmdlJCgpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGxhbmcgPT4gdGhpcy5jb25maWdTdGF0ZS5nZXREZWVwKCdsb2NhbGl6YXRpb24uY3VycmVudEN1bHR1cmUuY3VsdHVyZU5hbWUnKSAhPT0gbGFuZyxcclxuICAgICAgICApLFxyXG4gICAgICAgIHN3aXRjaE1hcChsYW5nID0+IHRoaXMuY29uZmlnU3RhdGUucmVmcmVzaEFwcFN0YXRlKCkucGlwZShtYXBUbyhsYW5nKSkpLFxyXG4gICAgICAgIHN3aXRjaE1hcChsYW5nID0+IGZyb20odGhpcy5yZWdpc3RlckxvY2FsZShsYW5nKS50aGVuKCgpID0+IGxhbmcpKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShsYW5nID0+IHRoaXMuX2xhbmd1YWdlQ2hhbmdlJC5uZXh0KGxhbmcpKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyTG9jYWxlKGxvY2FsZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7IHJlZ2lzdGVyTG9jYWxlRm4gfTogQUJQLlJvb3QgPSB0aGlzLmluamVjdG9yLmdldChDT1JFX09QVElPTlMpO1xyXG5cclxuICAgIHJldHVybiByZWdpc3RlckxvY2FsZUZuKGxvY2FsZSkudGhlbihtb2R1bGUgPT4ge1xyXG4gICAgICBpZiAobW9kdWxlPy5kZWZhdWx0KSByZWdpc3RlckxvY2FsZURhdGEobW9kdWxlLmRlZmF1bHQpO1xyXG4gICAgICB0aGlzLmxhdGVzdExhbmcgPSBsb2NhbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBsb2NhbGl6ZWQgdGV4dCB3aXRoIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIHBhcmFtZXRlcnMgaW4gY3VycmVudCBsYW5ndWFnZS5cclxuICAgKiBAcGFyYW0ga2V5IExvY2FsaXphdG9uIGtleSB0byByZXBsYWNlIHdpdGggbG9jYWxpemVkIHRleHRcclxuICAgKiBAcGFyYW0gaW50ZXJwb2xhdGVQYXJhbXMgVmFsdWVzIHRvIGludGVycG9sYXRlXHJcbiAgICovXHJcbiAgZ2V0KGtleTogc3RyaW5nIHwgTG9jYWxpemF0aW9uV2l0aERlZmF1bHQsIC4uLmludGVycG9sYXRlUGFyYW1zOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWdTdGF0ZVxyXG4gICAgICAuZ2V0QWxsJCgpXHJcbiAgICAgIC5waXBlKG1hcChzdGF0ZSA9PiB0aGlzLmdldExvY2FsaXphdGlvbihzdGF0ZSwga2V5LCAuLi5pbnRlcnBvbGF0ZVBhcmFtcykpKTtcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb25zJC52YWx1ZS5nZXQocmVzb3VyY2VOYW1lKTtcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlJChyZXNvdXJjZU5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9ucyQucGlwZShtYXAocmVzID0+IHJlcy5nZXQocmVzb3VyY2VOYW1lKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBsb2NhbGl6ZWQgdGV4dCB3aXRoIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIHBhcmFtZXRlcnMgaW4gY3VycmVudCBsYW5ndWFnZS5cclxuICAgKiBAcGFyYW0ga2V5IExvY2FsaXphdGlvbiBrZXkgdG8gcmVwbGFjZSB3aXRoIGxvY2FsaXplZCB0ZXh0XHJcbiAgICogQHBhcmFtIGludGVycG9sYXRlUGFyYW1zIFZhbHVlcyB0byBpbnRlcG9sYXRlLlxyXG4gICAqL1xyXG4gIGluc3RhbnQoa2V5OiBzdHJpbmcgfCBMb2NhbGl6YXRpb25XaXRoRGVmYXVsdCwgLi4uaW50ZXJwb2xhdGVQYXJhbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphdGlvbih0aGlzLmNvbmZpZ1N0YXRlLmdldEFsbCgpLCBrZXksIC4uLmludGVycG9sYXRlUGFyYW1zKTtcclxuICB9XHJcblxyXG4gIGxvY2FsaXplKHJlc291cmNlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnU3RhdGUuZ2V0T25lJCgnbG9jYWxpemF0aW9uJykucGlwZShcclxuICAgICAgbWFwKGNyZWF0ZUxvY2FsaXplciksXHJcbiAgICAgIG1hcChsb2NhbGl6ZSA9PiBsb2NhbGl6ZShyZXNvdXJjZU5hbWUsIGtleSwgZGVmYXVsdFZhbHVlKSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbG9jYWxpemVTeW5jKHJlc291cmNlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbG9jYWxpemF0aW9uID0gdGhpcy5jb25maWdTdGF0ZS5nZXRPbmUoJ2xvY2FsaXphdGlvbicpO1xyXG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsaXplcihsb2NhbGl6YXRpb24pKHJlc291cmNlTmFtZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgbG9jYWxpemVXaXRoRmFsbGJhY2soXHJcbiAgICByZXNvdXJjZU5hbWVzOiBzdHJpbmdbXSxcclxuICAgIGtleXM6IHN0cmluZ1tdLFxyXG4gICAgZGVmYXVsdFZhbHVlOiBzdHJpbmcsXHJcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZ1N0YXRlLmdldE9uZSQoJ2xvY2FsaXphdGlvbicpLnBpcGUoXHJcbiAgICAgIG1hcChjcmVhdGVMb2NhbGl6ZXJXaXRoRmFsbGJhY2spLFxyXG4gICAgICBtYXAobG9jYWxpemVXaXRoRmFsbGJhY2sgPT4gbG9jYWxpemVXaXRoRmFsbGJhY2socmVzb3VyY2VOYW1lcywga2V5cywgZGVmYXVsdFZhbHVlKSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbG9jYWxpemVXaXRoRmFsbGJhY2tTeW5jKHJlc291cmNlTmFtZXM6IHN0cmluZ1tdLCBrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbG9jYWxpemF0aW9uID0gdGhpcy5jb25maWdTdGF0ZS5nZXRPbmUoJ2xvY2FsaXphdGlvbicpO1xyXG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsaXplcldpdGhGYWxsYmFjayhsb2NhbGl6YXRpb24pKHJlc291cmNlTmFtZXMsIGtleXMsIGRlZmF1bHRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExvY2FsaXphdGlvbihcclxuICAgIHN0YXRlOiBBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25EdG8sXHJcbiAgICBrZXk6IHN0cmluZyB8IExvY2FsaXphdGlvbldpdGhEZWZhdWx0LFxyXG4gICAgLi4uaW50ZXJwb2xhdGVQYXJhbXM6IHN0cmluZ1tdXHJcbiAgKSB7XHJcbiAgICBpZiAoIWtleSkga2V5ID0gJyc7XHJcbiAgICBsZXQgZGVmYXVsdFZhbHVlOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGtleS5kZWZhdWx0VmFsdWU7XHJcbiAgICAgIGtleSA9IGtleS5rZXk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga2V5cyA9IGtleS5zcGxpdCgnOjonKSBhcyBzdHJpbmdbXTtcclxuICAgIGNvbnN0IHdhcm4gPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUpIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGtleXMubGVuZ3RoIDwgMikge1xyXG4gICAgICB3YXJuKCdUaGUgbG9jYWxpemF0aW9uIHNvdXJjZSBzZXBhcmF0b3IgKDo6KSBub3QgZm91bmQuJyk7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgKGtleSBhcyBzdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzdGF0ZS5sb2NhbGl6YXRpb24pIHJldHVybiBkZWZhdWx0VmFsdWUgfHwga2V5c1sxXTtcclxuXHJcbiAgICBjb25zdCBzb3VyY2VOYW1lID0ga2V5c1swXSB8fCBzdGF0ZS5sb2NhbGl6YXRpb24uZGVmYXVsdFJlc291cmNlTmFtZTtcclxuICAgIGNvbnN0IHNvdXJjZUtleSA9IGtleXNbMV07XHJcblxyXG4gICAgaWYgKHNvdXJjZU5hbWUgPT09ICdfJykge1xyXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8IHNvdXJjZUtleTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXNvdXJjZU5hbWUpIHtcclxuICAgICAgd2FybihcclxuICAgICAgICAnTG9jYWxpemF0aW9uIHNvdXJjZSBuYW1lIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBkZWZhdWx0UmVzb3VyY2VOYW1lIHdhcyBub3QgZGVmaW5lZCEnLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZSB8fCBzb3VyY2VLZXk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5sb2NhbGl6YXRpb25zJC52YWx1ZS5nZXQoc291cmNlTmFtZSk7XHJcbiAgICBpZiAoIXNvdXJjZSkge1xyXG4gICAgICB3YXJuKCdDb3VsZCBub3QgZmluZCBsb2NhbGl6YXRpb24gc291cmNlOiAnICsgc291cmNlTmFtZSk7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgc291cmNlS2V5O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbGl6YXRpb24gPSBzb3VyY2Vbc291cmNlS2V5XTtcclxuICAgIGlmICh0eXBlb2YgbG9jYWxpemF0aW9uID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8IHNvdXJjZUtleTtcclxuICAgIH1cclxuXHJcbiAgICBpbnRlcnBvbGF0ZVBhcmFtcyA9IGludGVycG9sYXRlUGFyYW1zLmZpbHRlcihwYXJhbXMgPT4gcGFyYW1zICE9IG51bGwpO1xyXG4gICAgaWYgKGxvY2FsaXphdGlvbikgbG9jYWxpemF0aW9uID0gaW50ZXJwb2xhdGUobG9jYWxpemF0aW9uLCBpbnRlcnBvbGF0ZVBhcmFtcyk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBsb2NhbGl6YXRpb24gIT09ICdzdHJpbmcnKSBsb2NhbGl6YXRpb24gPSAnJztcclxuXHJcbiAgICByZXR1cm4gbG9jYWxpemF0aW9uIHx8IGRlZmF1bHRWYWx1ZSB8fCAoa2V5IGFzIHN0cmluZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
1
|
+
import { registerLocaleData } from '@angular/common';
|
|
2
|
+
import { Injectable, Injector, isDevMode, Optional, SkipSelf } from '@angular/core';
|
|
3
|
+
import { BehaviorSubject, combineLatest, from, Subject } from 'rxjs';
|
|
4
|
+
import { filter, map, mapTo, switchMap } from 'rxjs/operators';
|
|
5
|
+
import { localizations$ } from '../tokens/localization.token';
|
|
6
|
+
import { CORE_OPTIONS } from '../tokens/options.token';
|
|
7
|
+
import { createLocalizer, createLocalizerWithFallback } from '../utils/localization-utils';
|
|
8
|
+
import { interpolate } from '../utils/string-utils';
|
|
9
|
+
import { ConfigStateService } from './config-state.service';
|
|
10
|
+
import { SessionStateService } from './session-state.service';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "./session-state.service";
|
|
13
|
+
import * as i2 from "./config-state.service";
|
|
14
|
+
export class LocalizationService {
|
|
15
|
+
constructor(sessionState, injector, otherInstance, configState) {
|
|
16
|
+
this.sessionState = sessionState;
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.configState = configState;
|
|
19
|
+
this.latestLang = this.sessionState.getLanguage();
|
|
20
|
+
this._languageChange$ = new Subject();
|
|
21
|
+
this.uiLocalizations$ = new BehaviorSubject(new Map());
|
|
22
|
+
this.localizations$ = new BehaviorSubject(new Map());
|
|
23
|
+
if (otherInstance)
|
|
24
|
+
throw new Error('LocalizationService should have only one instance.');
|
|
25
|
+
this.listenToSetLanguage();
|
|
26
|
+
this.initLocalizationValues();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns currently selected language
|
|
30
|
+
*/
|
|
31
|
+
get currentLang() {
|
|
32
|
+
return this.latestLang || this.sessionState.getLanguage();
|
|
33
|
+
}
|
|
34
|
+
get languageChange$() {
|
|
35
|
+
return this._languageChange$.asObservable();
|
|
36
|
+
}
|
|
37
|
+
initLocalizationValues() {
|
|
38
|
+
localizations$.subscribe(val => this.addLocalization(val));
|
|
39
|
+
const remoteLocalizations$ = this.configState.getDeep$('localization.values');
|
|
40
|
+
const currentLanguage$ = this.sessionState.getLanguage$();
|
|
41
|
+
const uiLocalizations$ = combineLatest([currentLanguage$, this.uiLocalizations$]).pipe(map(([currentLang, localizations]) => localizations.get(currentLang)));
|
|
42
|
+
combineLatest([remoteLocalizations$, uiLocalizations$])
|
|
43
|
+
.pipe(map(([remote, local]) => {
|
|
44
|
+
if (remote) {
|
|
45
|
+
if (!local) {
|
|
46
|
+
local = new Map();
|
|
47
|
+
}
|
|
48
|
+
Object.entries(remote).forEach(entry => {
|
|
49
|
+
const resourceName = entry[0];
|
|
50
|
+
const remoteTexts = entry[1];
|
|
51
|
+
let resource = local.get(resourceName) || {};
|
|
52
|
+
resource = Object.assign(Object.assign({}, resource), remoteTexts);
|
|
53
|
+
local.set(resourceName, resource);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return local;
|
|
57
|
+
}))
|
|
58
|
+
.subscribe(val => this.localizations$.next(val));
|
|
59
|
+
}
|
|
60
|
+
addLocalization(localizations) {
|
|
61
|
+
if (!localizations)
|
|
62
|
+
return;
|
|
63
|
+
const localizationMap = this.uiLocalizations$.value;
|
|
64
|
+
localizations.forEach(loc => {
|
|
65
|
+
const cultureMap = localizationMap.get(loc.culture) || new Map();
|
|
66
|
+
loc.resources.forEach(res => {
|
|
67
|
+
let resource = cultureMap.get(res.resourceName) || {};
|
|
68
|
+
resource = Object.assign(Object.assign({}, resource), res.texts);
|
|
69
|
+
cultureMap.set(res.resourceName, resource);
|
|
70
|
+
});
|
|
71
|
+
localizationMap.set(loc.culture, cultureMap);
|
|
72
|
+
});
|
|
73
|
+
this.uiLocalizations$.next(localizationMap);
|
|
74
|
+
}
|
|
75
|
+
listenToSetLanguage() {
|
|
76
|
+
this.sessionState
|
|
77
|
+
.onLanguageChange$()
|
|
78
|
+
.pipe(filter(lang => this.configState.getDeep('localization.currentCulture.cultureName') !== lang), switchMap(lang => this.configState.refreshAppState().pipe(mapTo(lang))), switchMap(lang => from(this.registerLocale(lang).then(() => lang))))
|
|
79
|
+
.subscribe(lang => this._languageChange$.next(lang));
|
|
80
|
+
}
|
|
81
|
+
registerLocale(locale) {
|
|
82
|
+
const { registerLocaleFn } = this.injector.get(CORE_OPTIONS);
|
|
83
|
+
return registerLocaleFn(locale).then(module => {
|
|
84
|
+
if (module === null || module === void 0 ? void 0 : module.default)
|
|
85
|
+
registerLocaleData(module.default);
|
|
86
|
+
this.latestLang = locale;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Returns an observable localized text with the given interpolation parameters in current language.
|
|
91
|
+
* @param key Localizaton key to replace with localized text
|
|
92
|
+
* @param interpolateParams Values to interpolate
|
|
93
|
+
*/
|
|
94
|
+
get(key, ...interpolateParams) {
|
|
95
|
+
return this.configState
|
|
96
|
+
.getAll$()
|
|
97
|
+
.pipe(map(state => this.getLocalization(state, key, ...interpolateParams)));
|
|
98
|
+
}
|
|
99
|
+
getResource(resourceName) {
|
|
100
|
+
return this.localizations$.value.get(resourceName);
|
|
101
|
+
}
|
|
102
|
+
getResource$(resourceName) {
|
|
103
|
+
return this.localizations$.pipe(map(res => res.get(resourceName)));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns localized text with the given interpolation parameters in current language.
|
|
107
|
+
* @param key Localization key to replace with localized text
|
|
108
|
+
* @param interpolateParams Values to intepolate.
|
|
109
|
+
*/
|
|
110
|
+
instant(key, ...interpolateParams) {
|
|
111
|
+
return this.getLocalization(this.configState.getAll(), key, ...interpolateParams);
|
|
112
|
+
}
|
|
113
|
+
localize(resourceName, key, defaultValue) {
|
|
114
|
+
return this.configState.getOne$('localization').pipe(map(createLocalizer), map(localize => localize(resourceName, key, defaultValue)));
|
|
115
|
+
}
|
|
116
|
+
localizeSync(resourceName, key, defaultValue) {
|
|
117
|
+
const localization = this.configState.getOne('localization');
|
|
118
|
+
return createLocalizer(localization)(resourceName, key, defaultValue);
|
|
119
|
+
}
|
|
120
|
+
localizeWithFallback(resourceNames, keys, defaultValue) {
|
|
121
|
+
return this.configState.getOne$('localization').pipe(map(createLocalizerWithFallback), map(localizeWithFallback => localizeWithFallback(resourceNames, keys, defaultValue)));
|
|
122
|
+
}
|
|
123
|
+
localizeWithFallbackSync(resourceNames, keys, defaultValue) {
|
|
124
|
+
const localization = this.configState.getOne('localization');
|
|
125
|
+
return createLocalizerWithFallback(localization)(resourceNames, keys, defaultValue);
|
|
126
|
+
}
|
|
127
|
+
getLocalization(state, key, ...interpolateParams) {
|
|
128
|
+
if (!key)
|
|
129
|
+
key = '';
|
|
130
|
+
let defaultValue;
|
|
131
|
+
if (typeof key !== 'string') {
|
|
132
|
+
defaultValue = key.defaultValue;
|
|
133
|
+
key = key.key;
|
|
134
|
+
}
|
|
135
|
+
const keys = key.split('::');
|
|
136
|
+
const warn = (message) => {
|
|
137
|
+
if (isDevMode)
|
|
138
|
+
console.warn(message);
|
|
139
|
+
};
|
|
140
|
+
if (keys.length < 2) {
|
|
141
|
+
warn('The localization source separator (::) not found.');
|
|
142
|
+
return defaultValue || key;
|
|
143
|
+
}
|
|
144
|
+
if (!state.localization)
|
|
145
|
+
return defaultValue || keys[1];
|
|
146
|
+
const sourceName = keys[0] || state.localization.defaultResourceName;
|
|
147
|
+
const sourceKey = keys[1];
|
|
148
|
+
if (sourceName === '_') {
|
|
149
|
+
return defaultValue || sourceKey;
|
|
150
|
+
}
|
|
151
|
+
if (!sourceName) {
|
|
152
|
+
warn('Localization source name is not specified and the defaultResourceName was not defined!');
|
|
153
|
+
return defaultValue || sourceKey;
|
|
154
|
+
}
|
|
155
|
+
const source = this.localizations$.value.get(sourceName);
|
|
156
|
+
if (!source) {
|
|
157
|
+
warn('Could not find localization source: ' + sourceName);
|
|
158
|
+
return defaultValue || sourceKey;
|
|
159
|
+
}
|
|
160
|
+
let localization = source[sourceKey];
|
|
161
|
+
if (typeof localization === 'undefined') {
|
|
162
|
+
return defaultValue || sourceKey;
|
|
163
|
+
}
|
|
164
|
+
interpolateParams = interpolateParams.filter(params => params != null);
|
|
165
|
+
if (localization)
|
|
166
|
+
localization = interpolate(localization, interpolateParams);
|
|
167
|
+
if (typeof localization !== 'string')
|
|
168
|
+
localization = '';
|
|
169
|
+
return localization || defaultValue || key;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
LocalizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationService, deps: [{ token: i1.SessionStateService }, { token: i0.Injector }, { token: LocalizationService, optional: true, skipSelf: true }, { token: i2.ConfigStateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
173
|
+
LocalizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationService, providedIn: 'root' });
|
|
174
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationService, decorators: [{
|
|
175
|
+
type: Injectable,
|
|
176
|
+
args: [{ providedIn: 'root' }]
|
|
177
|
+
}], ctorParameters: function () { return [{ type: i1.SessionStateService }, { type: i0.Injector }, { type: LocalizationService, decorators: [{
|
|
178
|
+
type: Optional
|
|
179
|
+
}, {
|
|
180
|
+
type: SkipSelf
|
|
181
|
+
}] }, { type: i2.ConfigStateService }]; } });
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2VydmljZXMvbG9jYWxpemF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBRzlELE1BQU0sT0FBTyxtQkFBbUI7SUFxQjlCLFlBQ1UsWUFBaUMsRUFDakMsUUFBa0IsRUFHMUIsYUFBa0MsRUFDMUIsV0FBK0I7UUFML0IsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJbEIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBMUJqQyxlQUFVLEdBQUcsSUFBSSxD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QUksU0FBUyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsc0NBQXNDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDMUQsT0FBTyxZQUFZLElBQUksU0FBUyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQ3ZDLE9BQU8sWUFBWSxJQUFJLFNBQVMsQ0FBQztTQUNsQztRQUVELGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN2RSxJQUFJLFlBQVk7WUFBRSxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUTtZQUFFLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFeEQsT0FBTyxZQUFZLElBQUksWUFBWSxJQUFLLEdBQWMsQ0FBQztJQUN6RCxDQUFDOztpSEFwT1UsbUJBQW1CLDZFQTBCYixtQkFBbUI7cUhBMUJ6QixtQkFBbUIsY0FETixNQUFNOzRGQUNuQixtQkFBbUI7a0JBRC9CLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFO21IQTJCZixtQkFBbUI7MEJBRmpDLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWdpc3RlckxvY2FsZURhdGEgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIGlzRGV2TW9kZSwgT3B0aW9uYWwsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBtYXBUbywgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQUJQIH0gZnJvbSAnLi4vbW9kZWxzL2NvbW1vbic7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25XaXRoRGVmYXVsdCB9IGZyb20gJy4uL21vZGVscy9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db25maWd1cmF0aW9uRHRvIH0gZnJvbSAnLi4vcHJveHkvdm9sby9hYnAvYXNwLW5ldC1jb3JlL212Yy9hcHBsaWNhdGlvbi1jb25maWd1cmF0aW9ucy9tb2RlbHMnO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9ucyQgfSBmcm9tICcuLi90b2tlbnMvbG9jYWxpemF0aW9uLnRva2VuJztcbmltcG9ydCB7IENPUkVfT1BUSU9OUyB9IGZyb20gJy4uL3Rva2Vucy9vcHRpb25zLnRva2VuJztcbmltcG9ydCB7IGNyZWF0ZUxvY2FsaXplciwgY3JlYXRlTG9jYWxpemVyV2l0aEZhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbHMvbG9jYWxpemF0aW9uLXV0aWxzJztcbmltcG9ydCB7IGludGVycG9sYXRlIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nLXV0aWxzJztcbmltcG9ydCB7IENvbmZpZ1N0YXRlU2VydmljZSB9IGZyb20gJy4vY29uZmlnLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2Vzc2lvblN0YXRlU2VydmljZSB9IGZyb20gJy4vc2Vzc2lvbi1zdGF0ZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBMb2NhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsYXRlc3RMYW5nID0gdGhpcy5zZXNzaW9uU3RhdGUuZ2V0TGFuZ3VhZ2UoKTtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDaGFuZ2UkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgdWlMb2NhbGl6YXRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoXG4gICAgbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PigpLFxuICApO1xuXG4gIHByaXZhdGUgbG9jYWxpemF0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpKTtcblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50bHkgc2VsZWN0ZWQgbGFuZ3VhZ2VcbiAgICovXG4gIGdldCBjdXJyZW50TGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxhdGVzdExhbmcgfHwgdGhpcy5zZXNzaW9uU3RhdGUuZ2V0TGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIGdldCBsYW5ndWFnZUNoYW5nZSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXNzaW9uU3RhdGU6IFNlc3Npb25TdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2tpcFNlbGYoKVxuICAgIG90aGVySW5zdGFuY2U6IExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdGF0ZTogQ29uZmlnU3RhdGVTZXJ2aWNlLFxuICApIHtcbiAgICBpZiAob3RoZXJJbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGl6YXRpb25TZXJ2aWNlIHNob3VsZCBoYXZlIG9ubHkgb25lIGluc3RhbmNlLicpO1xuXG4gICAgdGhpcy5saXN0ZW5Ub1NldExhbmd1YWdlKCk7XG4gICAgdGhpcy5pbml0TG9jYWxpemF0aW9uVmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRMb2NhbGl6YXRpb25WYWx1ZXMoKSB7XG4gICAgbG9jYWxpemF0aW9ucyQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLmFkZExvY2FsaXphdGlvbih2YWwpKTtcblxuICAgIGNvbnN0IHJlbW90ZUxvY2FsaXphdGlvbnMkID0gdGhpcy5jb25maWdTdGF0ZS5nZXREZWVwJCgnbG9jYWxpemF0aW9uLnZhbHVlcycpIGFzIE9ic2VydmFibGU8XG4gICAgICBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxuICAgID47XG4gICAgY29uc3QgY3VycmVudExhbmd1YWdlJCA9IHRoaXMuc2Vzc2lvblN0YXRlLmdldExhbmd1YWdlJCgpO1xuXG4gICAgY29uc3QgdWlMb2NhbGl6YXRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW2N1cnJlbnRMYW5ndWFnZSQsIHRoaXMudWlMb2NhbGl6YXRpb25zJF0pLnBpcGUoXG4gICAgICBtYXAoKFtjdXJyZW50TGFuZywgbG9jYWxpemF0aW9uc10pID0+IGxvY2FsaXphdGlvbnMuZ2V0KGN1cnJlbnRMYW5nKSksXG4gICAgKTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3JlbW90ZUxvY2FsaXphdGlvbnMkLCB1aUxvY2FsaXphdGlvbnMkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtyZW1vdGUsIGxvY2FsXSkgPT4ge1xuICAgICAgICAgIGlmIChyZW1vdGUpIHtcbiAgICAgICAgICAgIGlmICghbG9jYWwpIHtcbiAgICAgICAgICAgICAgbG9jYWwgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlbW90ZSkuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGVudHJ5WzBdO1xuICAgICAgICAgICAgICBjb25zdCByZW1vdGVUZXh0cyA9IGVudHJ5WzFdO1xuICAgICAgICAgICAgICBsZXQgcmVzb3VyY2UgPSBsb2NhbC5nZXQocmVzb3VyY2VOYW1lKSB8fCB7fTtcbiAgICAgICAgICAgICAgcmVzb3VyY2UgPSB7IC4uLnJlc291cmNlLCAuLi5yZW1vdGVUZXh0cyB9O1xuXG4gICAgICAgICAgICAgIGxvY2FsLnNldChyZXNvdXJjZU5hbWUsIHJlc291cmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBsb2NhbDtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLmxvY2FsaXphdGlvbnMkLm5leHQodmFsKSk7XG4gIH1cblxuICBhZGRMb2NhbGl6YXRpb24obG9jYWxpemF0aW9ucz86IEFCUC5Mb2NhbGl6YXRpb25bXSkge1xuICAgIGlmICghbG9jYWxpemF0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgbG9jYWxpemF0aW9uTWFwID0gdGhpcy51aUxvY2FsaXphdGlvbnMkLnZhbHVlO1xuXG4gICAgbG9jYWxpemF0aW9ucy5mb3JFYWNoKGxvYyA9PiB7XG4gICAgICBjb25zdCBjdWx0dXJlTWFwID1cbiAgICAgICAgbG9jYWxpemF0aW9uTWFwLmdldChsb2MuY3VsdHVyZSkgfHwgbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbiAgICAgIGxvYy5yZXNvdXJjZXMuZm9yRWFjaChyZXMgPT4ge1xuICAgICAgICBsZXQgcmVzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBjdWx0dXJlTWFwLmdldChyZXMucmVzb3VyY2VOYW1lKSB8fCB7fTtcblxuICAgICAgICByZXNvdXJjZSA9IHsgLi4ucmVzb3VyY2UsIC4uLnJlcy50ZXh0cyB9O1xuXG4gICAgICAgIGN1bHR1cmVNYXAuc2V0KHJlcy5yZXNvdXJjZU5hbWUsIHJlc291cmNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBsb2NhbGl6YXRpb25NYXAuc2V0KGxvYy5jdWx0dXJlLCBjdWx0dXJlTWFwKTtcbiAgICB9KTtcblxuICAgIHRoaXMudWlMb2NhbGl6YXRpb25zJC5uZXh0KGxvY2FsaXphdGlvbk1hcCk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRvU2V0TGFuZ3VhZ2UoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RhdGVcbiAgICAgIC5vbkxhbmd1YWdlQ2hhbmdlJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKFxuICAgICAgICAgIGxhbmcgPT4gdGhpcy5jb25maWdTdGF0ZS5nZXREZWVwKCdsb2NhbGl6YXRpb24uY3VycmVudEN1bHR1cmUuY3VsdHVyZU5hbWUnKSAhPT0gbGFuZyxcbiAgICAgICAgKSxcbiAgICAgICAgc3dpdGNoTWFwKGxhbmcgPT4gdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKS5waXBlKG1hcFRvKGxhbmcpKSksXG4gICAgICAgIHN3aXRjaE1hcChsYW5nID0+IGZyb20odGhpcy5yZWdpc3RlckxvY2FsZShsYW5nKS50aGVuKCgpID0+IGxhbmcpKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGxhbmcgPT4gdGhpcy5fbGFuZ3VhZ2VDaGFuZ2UkLm5leHQobGFuZykpO1xuICB9XG5cbiAgcmVnaXN0ZXJMb2NhbGUobG9jYWxlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IHJlZ2lzdGVyTG9jYWxlRm4gfTogQUJQLlJvb3QgPSB0aGlzLmluamVjdG9yLmdldChDT1JFX09QVElPTlMpO1xuXG4gICAgcmV0dXJuIHJlZ2lzdGVyTG9jYWxlRm4obG9jYWxlKS50aGVuKG1vZHVsZSA9PiB7XG4gICAgICBpZiAobW9kdWxlPy5kZWZhdWx0KSByZWdpc3RlckxvY2FsZURhdGEobW9kdWxlLmRlZmF1bHQpO1xuICAgICAgdGhpcy5sYXRlc3RMYW5nID0gbG9jYWxlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBsb2NhbGl6ZWQgdGV4dCB3aXRoIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIHBhcmFtZXRlcnMgaW4gY3VycmVudCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIGtleSBMb2NhbGl6YXRvbiBrZXkgdG8gcmVwbGFjZSB3aXRoIGxvY2FsaXplZCB0ZXh0XG4gICAqIEBwYXJhbSBpbnRlcnBvbGF0ZVBhcmFtcyBWYWx1ZXMgdG8gaW50ZXJwb2xhdGVcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyB8IExvY2FsaXphdGlvbldpdGhEZWZhdWx0LCAuLi5pbnRlcnBvbGF0ZVBhcmFtczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1N0YXRlXG4gICAgICAuZ2V0QWxsJCgpXG4gICAgICAucGlwZShtYXAoc3RhdGUgPT4gdGhpcy5nZXRMb2NhbGl6YXRpb24oc3RhdGUsIGtleSwgLi4uaW50ZXJwb2xhdGVQYXJhbXMpKSk7XG4gIH1cblxuICBnZXRSZXNvdXJjZShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvbnMkLnZhbHVlLmdldChyZXNvdXJjZU5hbWUpO1xuICB9XG5cbiAgZ2V0UmVzb3VyY2UkKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9ucyQucGlwZShtYXAocmVzID0+IHJlcy5nZXQocmVzb3VyY2VOYW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbG9jYWxpemVkIHRleHQgd2l0aCB0aGUgZ2l2ZW4gaW50ZXJwb2xhdGlvbiBwYXJhbWV0ZXJzIGluIGN1cnJlbnQgbGFuZ3VhZ2UuXG4gICAqIEBwYXJhbSBrZXkgTG9jYWxpemF0aW9uIGtleSB0byByZXBsYWNlIHdpdGggbG9jYWxpemVkIHRleHRcbiAgICogQHBhcmFtIGludGVycG9sYXRlUGFyYW1zIFZhbHVlcyB0byBpbnRlcG9sYXRlLlxuICAgKi9cbiAgaW5zdGFudChrZXk6IHN0cmluZyB8IExvY2FsaXphdGlvbldpdGhEZWZhdWx0LCAuLi5pbnRlcnBvbGF0ZVBhcmFtczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphdGlvbih0aGlzLmNvbmZpZ1N0YXRlLmdldEFsbCgpLCBrZXksIC4uLmludGVycG9sYXRlUGFyYW1zKTtcbiAgfVxuXG4gIGxvY2FsaXplKHJlc291cmNlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1N0YXRlLmdldE9uZSQoJ2xvY2FsaXphdGlvbicpLnBpcGUoXG4gICAgICBtYXAoY3JlYXRlTG9jYWxpemVyKSxcbiAgICAgIG1hcChsb2NhbGl6ZSA9PiBsb2NhbGl6ZShyZXNvdXJjZU5hbWUsIGtleSwgZGVmYXVsdFZhbHVlKSksXG4gICAgKTtcbiAgfVxuXG4gIGxvY2FsaXplU3luYyhyZXNvdXJjZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGl6YXRpb24gPSB0aGlzLmNvbmZpZ1N0YXRlLmdldE9uZSgnbG9jYWxpemF0aW9uJyk7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsaXplcihsb2NhbGl6YXRpb24pKHJlc291cmNlTmFtZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgbG9jYWxpemVXaXRoRmFsbGJhY2soXG4gICAgcmVzb3VyY2VOYW1lczogc3RyaW5nW10sXG4gICAga2V5czogc3RyaW5nW10sXG4gICAgZGVmYXVsdFZhbHVlOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnU3RhdGUuZ2V0T25lJCgnbG9jYWxpemF0aW9uJykucGlwZShcbiAgICAgIG1hcChjcmVhdGVMb2NhbGl6ZXJXaXRoRmFsbGJhY2spLFxuICAgICAgbWFwKGxvY2FsaXplV2l0aEZhbGxiYWNrID0+IGxvY2FsaXplV2l0aEZhbGxiYWNrKHJlc291cmNlTmFtZXMsIGtleXMsIGRlZmF1bHRWYWx1ZSkpLFxuICAgICk7XG4gIH1cblxuICBsb2NhbGl6ZVdpdGhGYWxsYmFja1N5bmMocmVzb3VyY2VOYW1lczogc3RyaW5nW10sIGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxpemF0aW9uID0gdGhpcy5jb25maWdTdGF0ZS5nZXRPbmUoJ2xvY2FsaXphdGlvbicpO1xuICAgIHJldHVybiBjcmVhdGVMb2NhbGl6ZXJXaXRoRmFsbGJhY2sobG9jYWxpemF0aW9uKShyZXNvdXJjZU5hbWVzLCBrZXlzLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbGl6YXRpb24oXG4gICAgc3RhdGU6IEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbkR0byxcbiAgICBrZXk6IHN0cmluZyB8IExvY2FsaXphdGlvbldpdGhEZWZhdWx0LFxuICAgIC4uLmludGVycG9sYXRlUGFyYW1zOiBzdHJpbmdbXVxuICApIHtcbiAgICBpZiAoIWtleSkga2V5ID0gJyc7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZTogc3RyaW5nO1xuXG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSBrZXkuZGVmYXVsdFZhbHVlO1xuICAgICAga2V5ID0ga2V5LmtleTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCc6OicpIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHdhcm4gPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoaXNEZXZNb2RlKSBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdhcm4oJ1RoZSBsb2NhbGl6YXRpb24gc291cmNlIHNlcGFyYXRvciAoOjopIG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgKGtleSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmxvY2FsaXphdGlvbikgcmV0dXJuIGRlZmF1bHRWYWx1ZSB8fCBrZXlzWzFdO1xuXG4gICAgY29uc3Qgc291cmNlTmFtZSA9IGtleXNbMF0gfHwgc3RhdGUubG9jYWxpemF0aW9uLmRlZmF1bHRSZXNvdXJjZU5hbWU7XG4gICAgY29uc3Qgc291cmNlS2V5ID0ga2V5c1sxXTtcblxuICAgIGlmIChzb3VyY2VOYW1lID09PSAnXycpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgc291cmNlS2V5O1xuICAgIH1cblxuICAgIGlmICghc291cmNlTmFtZSkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0xvY2FsaXphdGlvbiBzb3VyY2UgbmFtZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgZGVmYXVsdFJlc291cmNlTmFtZSB3YXMgbm90IGRlZmluZWQhJyxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgc291cmNlS2V5O1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMubG9jYWxpemF0aW9ucyQudmFsdWUuZ2V0KHNvdXJjZU5hbWUpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICB3YXJuKCdDb3VsZCBub3QgZmluZCBsb2NhbGl6YXRpb24gc291cmNlOiAnICsgc291cmNlTmFtZSk7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8IHNvdXJjZUtleTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxpemF0aW9uID0gc291cmNlW3NvdXJjZUtleV07XG4gICAgaWYgKHR5cGVvZiBsb2NhbGl6YXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8IHNvdXJjZUtleTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZVBhcmFtcyA9IGludGVycG9sYXRlUGFyYW1zLmZpbHRlcihwYXJhbXMgPT4gcGFyYW1zICE9IG51bGwpO1xuICAgIGlmIChsb2NhbGl6YXRpb24pIGxvY2FsaXphdGlvbiA9IGludGVycG9sYXRlKGxvY2FsaXphdGlvbiwgaW50ZXJwb2xhdGVQYXJhbXMpO1xuXG4gICAgaWYgKHR5cGVvZiBsb2NhbGl6YXRpb24gIT09ICdzdHJpbmcnKSBsb2NhbGl6YXRpb24gPSAnJztcblxuICAgIHJldHVybiBsb2NhbGl6YXRpb24gfHwgZGVmYXVsdFZhbHVlIHx8IChrZXkgYXMgc3RyaW5nKTtcbiAgfVxufVxuIl19
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
3
|
-
import { AbpTenantService } from '../proxy/pages/abp/multi-tenancy';
|
|
4
|
-
import { TENANT_KEY } from '../tokens/tenant-key.token';
|
|
5
|
-
import { ConfigStateService } from './config-state.service';
|
|
6
|
-
import { RestService } from './rest.service';
|
|
7
|
-
import { SessionStateService } from './session-state.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "./rest.service";
|
|
10
|
-
import * as i2 from "./session-state.service";
|
|
11
|
-
import * as i3 from "../proxy/pages/abp/multi-tenancy";
|
|
12
|
-
import * as i4 from "./config-state.service";
|
|
13
|
-
export class MultiTenancyService {
|
|
14
|
-
constructor(restService, sessionState, tenantService, configStateService, tenantKey) {
|
|
15
|
-
this.restService = restService;
|
|
16
|
-
this.sessionState = sessionState;
|
|
17
|
-
this.tenantService = tenantService;
|
|
18
|
-
this.configStateService = configStateService;
|
|
19
|
-
this.tenantKey = tenantKey;
|
|
20
|
-
this.domainTenant = null;
|
|
21
|
-
this.isTenantBoxVisible = true;
|
|
22
|
-
this.apiName = 'abp';
|
|
23
|
-
this.setTenantToState = (tenant) => {
|
|
24
|
-
this.sessionState.setTenant({ id: tenant.tenantId, name: tenant.name, isAvailable: true });
|
|
25
|
-
return this.configStateService.refreshAppState().pipe(map(_ => tenant));
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
setTenantByName(tenantName) {
|
|
29
|
-
return this.tenantService
|
|
30
|
-
.findTenantByName(tenantName, { [this.tenantKey]: '' })
|
|
31
|
-
.pipe(switchMap(this.setTenantToState));
|
|
32
|
-
}
|
|
33
|
-
setTenantById(tenantId) {
|
|
34
|
-
return this.tenantService
|
|
35
|
-
.findTenantById(tenantId, { [this.tenantKey]: '' })
|
|
36
|
-
.pipe(switchMap(this.setTenantToState));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
MultiTenancyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: MultiTenancyService, deps: [{ token: i1.RestService }, { token: i2.SessionStateService }, { token: i3.AbpTenantService }, { token: i4.ConfigStateService }, { token: TENANT_KEY }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
40
|
-
MultiTenancyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: MultiTenancyService, providedIn: 'root' });
|
|
41
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: MultiTenancyService, decorators: [{
|
|
42
|
-
type: Injectable,
|
|
43
|
-
args: [{ providedIn: 'root' }]
|
|
44
|
-
}], ctorParameters: function () { return [{ type: i1.RestService }, { type: i2.SessionStateService }, { type: i3.AbpTenantService }, { type: i4.ConfigStateService }, { type: undefined, decorators: [{
|
|
45
|
-
type: Inject,
|
|
46
|
-
args: [TENANT_KEY]
|
|
47
|
-
}] }]; } });
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { map, switchMap } from 'rxjs/operators';
|
|
3
|
+
import { AbpTenantService } from '../proxy/pages/abp/multi-tenancy';
|
|
4
|
+
import { TENANT_KEY } from '../tokens/tenant-key.token';
|
|
5
|
+
import { ConfigStateService } from './config-state.service';
|
|
6
|
+
import { RestService } from './rest.service';
|
|
7
|
+
import { SessionStateService } from './session-state.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./rest.service";
|
|
10
|
+
import * as i2 from "./session-state.service";
|
|
11
|
+
import * as i3 from "../proxy/pages/abp/multi-tenancy";
|
|
12
|
+
import * as i4 from "./config-state.service";
|
|
13
|
+
export class MultiTenancyService {
|
|
14
|
+
constructor(restService, sessionState, tenantService, configStateService, tenantKey) {
|
|
15
|
+
this.restService = restService;
|
|
16
|
+
this.sessionState = sessionState;
|
|
17
|
+
this.tenantService = tenantService;
|
|
18
|
+
this.configStateService = configStateService;
|
|
19
|
+
this.tenantKey = tenantKey;
|
|
20
|
+
this.domainTenant = null;
|
|
21
|
+
this.isTenantBoxVisible = true;
|
|
22
|
+
this.apiName = 'abp';
|
|
23
|
+
this.setTenantToState = (tenant) => {
|
|
24
|
+
this.sessionState.setTenant({ id: tenant.tenantId, name: tenant.name, isAvailable: true });
|
|
25
|
+
return this.configStateService.refreshAppState().pipe(map(_ => tenant));
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
setTenantByName(tenantName) {
|
|
29
|
+
return this.tenantService
|
|
30
|
+
.findTenantByName(tenantName, { [this.tenantKey]: '' })
|
|
31
|
+
.pipe(switchMap(this.setTenantToState));
|
|
32
|
+
}
|
|
33
|
+
setTenantById(tenantId) {
|
|
34
|
+
return this.tenantService
|
|
35
|
+
.findTenantById(tenantId, { [this.tenantKey]: '' })
|
|
36
|
+
.pipe(switchMap(this.setTenantToState));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
MultiTenancyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: MultiTenancyService, deps: [{ token: i1.RestService }, { token: i2.SessionStateService }, { token: i3.AbpTenantService }, { token: i4.ConfigStateService }, { token: TENANT_KEY }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
40
|
+
MultiTenancyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: MultiTenancyService, providedIn: 'root' });
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: MultiTenancyService, decorators: [{
|
|
42
|
+
type: Injectable,
|
|
43
|
+
args: [{ providedIn: 'root' }]
|
|
44
|
+
}], ctorParameters: function () { return [{ type: i1.RestService }, { type: i2.SessionStateService }, { type: i3.AbpTenantService }, { type: i4.ConfigStateService }, { type: undefined, decorators: [{
|
|
45
|
+
type: Inject,
|
|
46
|
+
args: [TENANT_KEY]
|
|
47
|
+
}] }]; } });
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktdGVuYW5jeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL3NlcnZpY2VzL211bHRpLXRlbmFuY3kuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBS3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQUc5RCxNQUFNLE9BQU8sbUJBQW1CO0lBWTlCLFlBQ1UsV0FBd0IsRUFDeEIsWUFBaUMsRUFDakMsYUFBK0IsRUFDL0Isa0JBQXNDLEVBQ25CLFNBQWlCO1FBSnBDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBaEI5QyxpQkFBWSxHQUFxQixJQUFJLENBQUM7UUFFdEMsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBRTFCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFUixxQkFBZ0IsR0FBRyxDQUFDLE1BQTJCLEVBQUUsRUFBRTtZQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQztJQVFDLENBQUM7SUFFSixlQUFlLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsYUFBYTthQUN0QixnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxhQUFhO2FBQ3RCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7aUhBOUJVLG1CQUFtQixrSkFpQnBCLFVBQVU7cUhBakJULG1CQUFtQixjQUROLE1BQU07NEZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWtCN0IsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFicFRlbmFudFNlcnZpY2UgfSBmcm9tICcuLi9wcm94eS9wYWdlcy9hYnAvbXVsdGktdGVuYW5jeSc7XG5pbXBvcnQge1xuICBDdXJyZW50VGVuYW50RHRvLFxuICBGaW5kVGVuYW50UmVzdWx0RHRvLFxufSBmcm9tICcuLi9wcm94eS92b2xvL2FicC9hc3AtbmV0LWNvcmUvbXZjL211bHRpLXRlbmFuY3kvbW9kZWxzJztcbmltcG9ydCB7IFRFTkFOVF9LRVkgfSBmcm9tICcuLi90b2tlbnMvdGVuYW50LWtleS50b2tlbic7XG5pbXBvcnQgeyBDb25maWdTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi9yZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2Vzc2lvblN0YXRlU2VydmljZSB9IGZyb20gJy4vc2Vzc2lvbi1zdGF0ZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNdWx0aVRlbmFuY3lTZXJ2aWNlIHtcbiAgZG9tYWluVGVuYW50OiBDdXJyZW50VGVuYW50RHRvID0gbnVsbDtcblxuICBpc1RlbmFudEJveFZpc2libGUgPSB0cnVlO1xuXG4gIGFwaU5hbWUgPSAnYWJwJztcblxuICBwcml2YXRlIHNldFRlbmFudFRvU3RhdGUgPSAodGVuYW50OiBGaW5kVGVuYW50UmVzdWx0RHRvKSA9PiB7XG4gICAgdGhpcy5zZXNzaW9uU3RhdGUuc2V0VGVuYW50KHsgaWQ6IHRlbmFudC50ZW5hbnRJZCwgbmFtZTogdGVuYW50Lm5hbWUsIGlzQXZhaWxhYmxlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1N0YXRlU2VydmljZS5yZWZyZXNoQXBwU3RhdGUoKS5waXBlKG1hcChfID0+IHRlbmFudCkpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Vzc2lvblN0YXRlOiBTZXNzaW9uU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogQWJwVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1N0YXRlU2VydmljZTogQ29uZmlnU3RhdGVTZXJ2aWNlLFxuICAgIEBJbmplY3QoVEVOQU5UX0tFWSkgcHVibGljIHRlbmFudEtleTogc3RyaW5nLFxuICApIHt9XG5cbiAgc2V0VGVuYW50QnlOYW1lKHRlbmFudE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnRlbmFudFNlcnZpY2VcbiAgICAgIC5maW5kVGVuYW50QnlOYW1lKHRlbmFudE5hbWUsIHsgW3RoaXMudGVuYW50S2V5XTogJycgfSlcbiAgICAgIC5waXBlKHN3aXRjaE1hcCh0aGlzLnNldFRlbmFudFRvU3RhdGUpKTtcbiAgfVxuXG4gIHNldFRlbmFudEJ5SWQodGVuYW50SWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnRlbmFudFNlcnZpY2VcbiAgICAgIC5maW5kVGVuYW50QnlJZCh0ZW5hbnRJZCwgeyBbdGhpcy50ZW5hbnRLZXldOiAnJyB9KVxuICAgICAgLnBpcGUoc3dpdGNoTWFwKHRoaXMuc2V0VGVuYW50VG9TdGF0ZSkpO1xuICB9XG59XG4iXX0=
|