@sumaris-net/ngx-components 0.28.3 → 0.28.4

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.
@@ -1,8 +1,7 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { TranslateService } from '@ngx-translate/core';
3
- import { mergeMap } from 'rxjs/operators';
4
- import { of } from 'rxjs';
5
- import { isNil, isNilOrBlank } from '../functions';
3
+ import { map } from 'rxjs/operators';
4
+ import { isNil, isNilOrBlank, isNotNilOrBlank } from '../functions';
6
5
  import * as i0 from "@angular/core";
7
6
  import * as i1 from "@ngx-translate/core";
8
7
  export class TranslateContextService {
@@ -11,23 +10,41 @@ export class TranslateContextService {
11
10
  }
12
11
  get(key, context, interpolateParams) {
13
12
  // No context: do a normal translate
14
- if (!isNil(context))
13
+ if (!key || !isNil(context))
15
14
  return this.translate.get(key, interpolateParams);
16
15
  // Compute a contextual i18n key, using the context as suffix
17
- const contextKey = this.contextualKey(key, context);
16
+ const contextualKeys = this.contextualKeys(key, context);
18
17
  // Return the contextual translation, or default of not exists
19
- return this.translate.get(contextKey, interpolateParams)
20
- .pipe(mergeMap(translation => (translation !== contextKey) ? of(translation) : this.translate.get(key)));
18
+ return this.translate.get(contextualKeys, interpolateParams)
19
+ .pipe(map(translations => this.findFirstValid(contextualKeys, translations) || key));
21
20
  }
22
21
  instant(key, context, interpolateParams) {
23
22
  // No context: do a normal translate
24
- if (isNilOrBlank(context))
23
+ if (!key || isNilOrBlank(context))
25
24
  return this.translate.instant(key, interpolateParams);
26
25
  // Compute a contextual i18n key, using the context as suffix
27
- const contextualKey = this.contextualKey(key, context);
28
- // Return the contextual translation, or default of not exists
29
- const translation = this.translate.instant(contextualKey, interpolateParams);
30
- return (translation !== contextualKey) ? translation : this.translate.instant(key, interpolateParams);
26
+ const contextualKeys = this.contextualKeys(key, context);
27
+ const translations = this.translate.instant(contextualKeys, interpolateParams);
28
+ return this.findFirstValid(contextualKeys, translations) || key;
29
+ }
30
+ /**
31
+ * Compute contextual i18n keys, using the context as suffix.<br>
32
+ * Suffix can be simple name (like 'aaa' - will return ['<key>.aaa']) or complexe (like 'aaa.bbb' - will return ['<key>.aaa.bbb', '<key>.aaa']
33
+ *
34
+ * @param key
35
+ * @param context
36
+ * @private
37
+ */
38
+ contextualKeys(key, context) {
39
+ return context.split('.')
40
+ .filter(isNotNilOrBlank)
41
+ .reduce((res, item) => {
42
+ const inheritedContext = res.length > 0 ? (res[res.length - 1] + '.') : '';
43
+ return res.concat(inheritedContext + item);
44
+ }, [])
45
+ .reverse() // Start with children, ends with parent key
46
+ .map(contextItem => this.contextualKey(key, contextItem))
47
+ .concat(key);
31
48
  }
32
49
  /**
33
50
  * Compute a contextual i18n key, using the context as suffix
@@ -47,6 +64,14 @@ export class TranslateContextService {
47
64
  ? `${context}${key}`
48
65
  : parts.slice(0, parts.length - 1).concat(context + parts[parts.length - 1]).join('.');
49
66
  }
67
+ findFirstValid(keys, translations) {
68
+ // For eac contextual key: try to find translation, then use the first valid
69
+ for (let key of keys) {
70
+ if (translations[key] !== key)
71
+ return translations[key];
72
+ }
73
+ return undefined;
74
+ }
50
75
  }
51
76
  TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
52
77
  TranslateContextService.decorators = [
@@ -55,4 +80,4 @@ TranslateContextService.decorators = [
55
80
  TranslateContextService.ctorParameters = () => [
56
81
  { type: TranslateService }
57
82
  ];
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLWNvbnRleHQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3NlcnZpY2VzL3RyYW5zbGF0ZS1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFhLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxNQUFNLGNBQWMsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyx1QkFBdUI7SUFFbEMsWUFDWSxTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtJQUV2QyxDQUFDO0lBR0QsR0FBRyxDQUFDLEdBQVcsRUFBRSxPQUFnQixFQUFFLGlCQUEwQjtRQUMzRCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZFLDZEQUE2RDtRQUM3RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwRCw4REFBOEQ7UUFDOUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7YUFDckQsSUFBSSxDQUNILFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ2xHLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVcsRUFBRSxPQUFnQixFQUFFLGlCQUEwQjtRQUMvRCxvQ0FBb0M7UUFDcEMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUVqRiw2REFBNkQ7UUFDN0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkQsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sQ0FBQyxXQUFXLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUV4QyxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUIsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7U0FDekI7UUFFRCw2REFBNkQ7UUFDN0QsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNwQixDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNGLENBQUM7Ozs7WUF0REYsVUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7O1lBTnhCLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHttZXJnZU1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2lzTmlsLCBpc05pbE9yQmxhbmt9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlQ29udGV4dFNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gIH1cblxuXG4gIGdldChrZXk6IHN0cmluZywgY29udGV4dD86IHN0cmluZywgaW50ZXJwb2xhdGVQYXJhbXM/OiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIE5vIGNvbnRleHQ6IGRvIGEgbm9ybWFsIHRyYW5zbGF0ZVxuICAgIGlmICghaXNOaWwoY29udGV4dCkpIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5nZXQoa2V5LCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG5cbiAgICAvLyBDb21wdXRlIGEgY29udGV4dHVhbCBpMThuIGtleSwgdXNpbmcgdGhlIGNvbnRleHQgYXMgc3VmZml4XG4gICAgY29uc3QgY29udGV4dEtleSA9IHRoaXMuY29udGV4dHVhbEtleShrZXksIGNvbnRleHQpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb250ZXh0dWFsIHRyYW5zbGF0aW9uLCBvciBkZWZhdWx0IG9mIG5vdCBleGlzdHNcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuZ2V0KGNvbnRleHRLZXksIGludGVycG9sYXRlUGFyYW1zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1lcmdlTWFwKHRyYW5zbGF0aW9uID0+ICh0cmFuc2xhdGlvbiAhPT0gY29udGV4dEtleSkgPyBvZih0cmFuc2xhdGlvbikgOiB0aGlzLnRyYW5zbGF0ZS5nZXQoa2V5KSlcbiAgICAgICk7XG4gIH1cblxuICBpbnN0YW50KGtleTogc3RyaW5nLCBjb250ZXh0Pzogc3RyaW5nLCBpbnRlcnBvbGF0ZVBhcmFtcz86IE9iamVjdCk6IGFueSB7XG4gICAgLy8gTm8gY29udGV4dDogZG8gYSBub3JtYWwgdHJhbnNsYXRlXG4gICAgaWYgKGlzTmlsT3JCbGFuayhjb250ZXh0KSkgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoa2V5LCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG5cbiAgICAvLyBDb21wdXRlIGEgY29udGV4dHVhbCBpMThuIGtleSwgdXNpbmcgdGhlIGNvbnRleHQgYXMgc3VmZml4XG4gICAgY29uc3QgY29udGV4dHVhbEtleSA9IHRoaXMuY29udGV4dHVhbEtleShrZXksIGNvbnRleHQpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb250ZXh0dWFsIHRyYW5zbGF0aW9uLCBvciBkZWZhdWx0IG9mIG5vdCBleGlzdHNcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoY29udGV4dHVhbEtleSwgaW50ZXJwb2xhdGVQYXJhbXMpO1xuICAgIHJldHVybiAodHJhbnNsYXRpb24gIT09IGNvbnRleHR1YWxLZXkpID8gdHJhbnNsYXRpb24gOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGtleSwgaW50ZXJwb2xhdGVQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYSBjb250ZXh0dWFsIGkxOG4ga2V5LCB1c2luZyB0aGUgY29udGV4dCBhcyBzdWZmaXhcbiAgICpcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gY29udGV4dFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29udGV4dHVhbEtleShrZXk6IHN0cmluZywgY29udGV4dDogc3RyaW5nKSB7XG5cbiAgICAvLyBBcHBlbmQgYSBkb3Qgb24gY29udGV4dCBpZiBtaXNzaW5nXG4gICAgaWYgKCFjb250ZXh0LmVuZHNXaXRoKCcuJykpIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0ICsgJy4nO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgYSBjb250ZXh0dWFsIGkxOG4ga2V5LCB1c2luZyB0aGUgY29udGV4dCBhcyBzdWZmaXhcbiAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdCgnLicpO1xuICAgIHJldHVybiAocGFydHMubGVuZ3RoID09PSAxKVxuICAgICAgPyBgJHtjb250ZXh0fSR7a2V5fWBcbiAgICAgIDogcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSkuY29uY2F0KGNvbnRleHQgKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSkuam9pbignLicpO1xuICB9XG59XG4iXX0=
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLWNvbnRleHQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3NlcnZpY2VzL3RyYW5zbGF0ZS1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDOzs7QUFJbEUsTUFBTSxPQUFPLHVCQUF1QjtJQUVsQyxZQUNZLFNBQTJCO1FBQTNCLGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBRXZDLENBQUM7SUFHRCxHQUFHLENBQUMsR0FBVyxFQUFFLE9BQWdCLEVBQUUsaUJBQTBCO1FBQzNELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFL0UsNkRBQTZEO1FBQzdELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXpELDhEQUE4RDtRQUM5RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQzthQUN6RCxJQUFJLENBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQzlFLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVcsRUFBRSxPQUFnQixFQUFFLGlCQUEwQjtRQUMvRCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUV6Riw2REFBNkQ7UUFDN0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFHL0UsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQUMsR0FBVyxFQUFFLE9BQWU7UUFDekMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUN0QixNQUFNLENBQUMsZUFBZSxDQUFDO2FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0UsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFFLGdCQUFnQixHQUFHLElBQUksQ0FBQyxDQUFBO1FBQzdDLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDTCxPQUFPLEVBQUUsQ0FBQyw0Q0FBNEM7YUFDdEQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDeEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWU7UUFFeEMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLE9BQU8sR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO1NBQ3pCO1FBRUQsNkRBQTZEO1FBQzdELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQWMsRUFBRSxZQUF1QztRQUM1RSw0RUFBNEU7UUFDNUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRztnQkFBRSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6RDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Ozs7WUFsRkYsVUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7O1lBTnhCLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHttYXAsIG1lcmdlTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7aXNOaWwsIGlzTmlsT3JCbGFuaywgaXNOb3ROaWxPckJsYW5rfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuXG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZUNvbnRleHRTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge1xuICB9XG5cblxuICBnZXQoa2V5OiBzdHJpbmcsIGNvbnRleHQ/OiBzdHJpbmcsIGludGVycG9sYXRlUGFyYW1zPzogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyBObyBjb250ZXh0OiBkbyBhIG5vcm1hbCB0cmFuc2xhdGVcbiAgICBpZiAoIWtleSB8fCAhaXNOaWwoY29udGV4dCkpIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5nZXQoa2V5LCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG5cbiAgICAvLyBDb21wdXRlIGEgY29udGV4dHVhbCBpMThuIGtleSwgdXNpbmcgdGhlIGNvbnRleHQgYXMgc3VmZml4XG4gICAgY29uc3QgY29udGV4dHVhbEtleXMgPSB0aGlzLmNvbnRleHR1YWxLZXlzKGtleSwgY29udGV4dCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNvbnRleHR1YWwgdHJhbnNsYXRpb24sIG9yIGRlZmF1bHQgb2Ygbm90IGV4aXN0c1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5nZXQoY29udGV4dHVhbEtleXMsIGludGVycG9sYXRlUGFyYW1zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCh0cmFuc2xhdGlvbnMgPT4gdGhpcy5maW5kRmlyc3RWYWxpZChjb250ZXh0dWFsS2V5cywgdHJhbnNsYXRpb25zKSB8fCBrZXkpXG4gICAgICApO1xuICB9XG5cbiAgaW5zdGFudChrZXk6IHN0cmluZywgY29udGV4dD86IHN0cmluZywgaW50ZXJwb2xhdGVQYXJhbXM/OiBPYmplY3QpOiBhbnkge1xuICAgIC8vIE5vIGNvbnRleHQ6IGRvIGEgbm9ybWFsIHRyYW5zbGF0ZVxuICAgIGlmICgha2V5IHx8IGlzTmlsT3JCbGFuayhjb250ZXh0KSkgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoa2V5LCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG5cbiAgICAvLyBDb21wdXRlIGEgY29udGV4dHVhbCBpMThuIGtleSwgdXNpbmcgdGhlIGNvbnRleHQgYXMgc3VmZml4XG4gICAgY29uc3QgY29udGV4dHVhbEtleXMgPSB0aGlzLmNvbnRleHR1YWxLZXlzKGtleSwgY29udGV4dCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChjb250ZXh0dWFsS2V5cywgaW50ZXJwb2xhdGVQYXJhbXMpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5maW5kRmlyc3RWYWxpZChjb250ZXh0dWFsS2V5cywgdHJhbnNsYXRpb25zKSB8fCBrZXk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBjb250ZXh0dWFsIGkxOG4ga2V5cywgdXNpbmcgdGhlIGNvbnRleHQgYXMgc3VmZml4Ljxicj5cbiAgICogU3VmZml4IGNhbiBiZSBzaW1wbGUgbmFtZSAobGlrZSAnYWFhJyAtIHdpbGwgcmV0dXJuIFsnPGtleT4uYWFhJ10pIG9yIGNvbXBsZXhlIChsaWtlICdhYWEuYmJiJyAtIHdpbGwgcmV0dXJuIFsnPGtleT4uYWFhLmJiYicsICc8a2V5Pi5hYWEnXVxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbSBjb250ZXh0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250ZXh0dWFsS2V5cyhrZXk6IHN0cmluZywgY29udGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjb250ZXh0LnNwbGl0KCcuJylcbiAgICAgIC5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKVxuICAgICAgLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGluaGVyaXRlZENvbnRleHQgPSByZXMubGVuZ3RoID4gMCA/IChyZXNbcmVzLmxlbmd0aCAtIDFdICsgJy4nKSA6ICcnO1xuICAgICAgICByZXR1cm4gcmVzLmNvbmNhdCggaW5oZXJpdGVkQ29udGV4dCArIGl0ZW0pXG4gICAgICB9LCBbXSlcbiAgICAgIC5yZXZlcnNlKCkgLy8gU3RhcnQgd2l0aCBjaGlsZHJlbiwgZW5kcyB3aXRoIHBhcmVudCBrZXlcbiAgICAgIC5tYXAoY29udGV4dEl0ZW0gPT4gdGhpcy5jb250ZXh0dWFsS2V5KGtleSwgY29udGV4dEl0ZW0pKVxuICAgICAgLmNvbmNhdChrZXkpXG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBhIGNvbnRleHR1YWwgaTE4biBrZXksIHVzaW5nIHRoZSBjb250ZXh0IGFzIHN1ZmZpeFxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbSBjb250ZXh0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250ZXh0dWFsS2V5KGtleTogc3RyaW5nLCBjb250ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgLy8gQXBwZW5kIGEgZG90IG9uIGNvbnRleHQgaWYgbWlzc2luZ1xuICAgIGlmICghY29udGV4dC5lbmRzV2l0aCgnLicpKSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dCArICcuJztcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGEgY29udGV4dHVhbCBpMThuIGtleSwgdXNpbmcgdGhlIGNvbnRleHQgYXMgc3VmZml4XG4gICAgY29uc3QgcGFydHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gKHBhcnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgID8gYCR7Y29udGV4dH0ke2tleX1gXG4gICAgICA6IHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpLmNvbmNhdChjb250ZXh0ICsgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0pLmpvaW4oJy4nKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEZpcnN0VmFsaWQoa2V5czogc3RyaW5nW10sIHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gICAgLy8gRm9yIGVhYyBjb250ZXh0dWFsIGtleTogdHJ5IHRvIGZpbmQgdHJhbnNsYXRpb24sIHRoZW4gdXNlIHRoZSBmaXJzdCB2YWxpZFxuICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAodHJhbnNsYXRpb25zW2tleV0gIT09IGtleSkgcmV0dXJuIHRyYW5zbGF0aW9uc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -36,7 +36,7 @@ import { MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteModule, MAT_AUT
36
36
  import { __awaiter, __decorate } from 'tslib';
37
37
  import * as i1$6 from '@angular/forms';
38
38
  import { NG_VALUE_ACCESSOR, FormGroupDirective, AbstractControl, FormGroup, FormArray, FormControl, ReactiveFormsModule, Validators, FormBuilder } from '@angular/forms';
39
- import { timer, merge, fromEvent, Subscription, BehaviorSubject, Subject, isObservable, of, noop as noop$8, Observable, defer, from, combineLatest, EMPTY } from 'rxjs';
39
+ import { timer, merge, fromEvent, Subscription, BehaviorSubject, Subject, isObservable, noop as noop$8, Observable, defer, of, from, combineLatest, EMPTY } from 'rxjs';
40
40
  import { filter, first, map, takeUntil, startWith, debounceTime, takeWhile, switchMap, tap, distinctUntilChanged, mergeMap, catchError, throttleTime, skip } from 'rxjs/operators';
41
41
  import * as i1$1 from '@ngx-translate/core';
42
42
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
@@ -2431,23 +2431,41 @@ class TranslateContextService {
2431
2431
  }
2432
2432
  get(key, context, interpolateParams) {
2433
2433
  // No context: do a normal translate
2434
- if (!isNil(context))
2434
+ if (!key || !isNil(context))
2435
2435
  return this.translate.get(key, interpolateParams);
2436
2436
  // Compute a contextual i18n key, using the context as suffix
2437
- const contextKey = this.contextualKey(key, context);
2437
+ const contextualKeys = this.contextualKeys(key, context);
2438
2438
  // Return the contextual translation, or default of not exists
2439
- return this.translate.get(contextKey, interpolateParams)
2440
- .pipe(mergeMap(translation => (translation !== contextKey) ? of(translation) : this.translate.get(key)));
2439
+ return this.translate.get(contextualKeys, interpolateParams)
2440
+ .pipe(map(translations => this.findFirstValid(contextualKeys, translations) || key));
2441
2441
  }
2442
2442
  instant(key, context, interpolateParams) {
2443
2443
  // No context: do a normal translate
2444
- if (isNilOrBlank(context))
2444
+ if (!key || isNilOrBlank(context))
2445
2445
  return this.translate.instant(key, interpolateParams);
2446
2446
  // Compute a contextual i18n key, using the context as suffix
2447
- const contextualKey = this.contextualKey(key, context);
2448
- // Return the contextual translation, or default of not exists
2449
- const translation = this.translate.instant(contextualKey, interpolateParams);
2450
- return (translation !== contextualKey) ? translation : this.translate.instant(key, interpolateParams);
2447
+ const contextualKeys = this.contextualKeys(key, context);
2448
+ const translations = this.translate.instant(contextualKeys, interpolateParams);
2449
+ return this.findFirstValid(contextualKeys, translations) || key;
2450
+ }
2451
+ /**
2452
+ * Compute contextual i18n keys, using the context as suffix.<br>
2453
+ * Suffix can be simple name (like 'aaa' - will return ['<key>.aaa']) or complexe (like 'aaa.bbb' - will return ['<key>.aaa.bbb', '<key>.aaa']
2454
+ *
2455
+ * @param key
2456
+ * @param context
2457
+ * @private
2458
+ */
2459
+ contextualKeys(key, context) {
2460
+ return context.split('.')
2461
+ .filter(isNotNilOrBlank)
2462
+ .reduce((res, item) => {
2463
+ const inheritedContext = res.length > 0 ? (res[res.length - 1] + '.') : '';
2464
+ return res.concat(inheritedContext + item);
2465
+ }, [])
2466
+ .reverse() // Start with children, ends with parent key
2467
+ .map(contextItem => this.contextualKey(key, contextItem))
2468
+ .concat(key);
2451
2469
  }
2452
2470
  /**
2453
2471
  * Compute a contextual i18n key, using the context as suffix
@@ -2467,6 +2485,14 @@ class TranslateContextService {
2467
2485
  ? `${context}${key}`
2468
2486
  : parts.slice(0, parts.length - 1).concat(context + parts[parts.length - 1]).join('.');
2469
2487
  }
2488
+ findFirstValid(keys, translations) {
2489
+ // For eac contextual key: try to find translation, then use the first valid
2490
+ for (let key of keys) {
2491
+ if (translations[key] !== key)
2492
+ return translations[key];
2493
+ }
2494
+ return undefined;
2495
+ }
2470
2496
  }
2471
2497
  TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2472
2498
  TranslateContextService.decorators = [