@tilde-nlp/ngx-common 4.0.20 → 4.0.21

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.
@@ -9,19 +9,31 @@ export class LanguageTranslatePipe {
9
9
  constructor(translate) {
10
10
  this.translate = translate;
11
11
  this.languagesLocalizationKey = 'LANGUAGES';
12
+ this.translationCache = new Map();
13
+ this.translate.onLangChange.subscribe(() => {
14
+ this.translationCache.clear();
15
+ this.lastUiLanguage = this.translate.currentLang;
16
+ });
17
+ this.lastUiLanguage = this.translate.currentLang;
12
18
  }
13
19
  transform(fullLangCode, hideRegion = false) {
14
20
  if (!fullLangCode) {
15
21
  return '';
16
22
  }
17
- const langCodeWithoutRegion = fullLangCode.split('-')[0];
23
+ if (this.lastUiLanguage !== this.translate.currentLang) {
24
+ this.translationCache.clear();
25
+ this.lastUiLanguage = this.translate.currentLang;
26
+ }
27
+ const cacheKey = `${fullLangCode}:${hideRegion}`;
28
+ if (this.translationCache.has(cacheKey)) {
29
+ return this.translationCache.get(cacheKey);
30
+ }
31
+ const langCodeWithoutRegion = this.getLanguageFromLanguageCode(fullLangCode);
18
32
  const isCodeAndRegionSame = this.isLanguageCodeSameAsRegion(fullLangCode);
19
33
  const langCodeForTranslation = isCodeAndRegionSame ? langCodeWithoutRegion : fullLangCode;
20
- return this.getTranslation(langCodeForTranslation, hideRegion);
21
- }
22
- isLanguageCodeSameAsRegion(fullLangCode) {
23
- const [code, region, extra] = fullLangCode.split('-');
24
- return code === region?.toLowerCase() && !extra;
34
+ const translation = this.getTranslation(langCodeForTranslation, hideRegion);
35
+ this.translationCache.set(cacheKey, translation);
36
+ return translation;
25
37
  }
26
38
  getTranslation(langCode, hideRegion) {
27
39
  const languageTranslations = this.translate.instant(this.languagesLocalizationKey);
@@ -39,7 +51,32 @@ export class LanguageTranslatePipe {
39
51
  }
40
52
  getLanguageTranslationFromLanguageCode(currentLang, code) {
41
53
  const languageNamesInCurrentLang = new Intl.DisplayNames([currentLang], { type: 'language' });
42
- return this.capitalizeFirstLetter(languageNamesInCurrentLang.of(code));
54
+ const regionNamesInCurrentLang = new Intl.DisplayNames([currentLang], { type: 'region' });
55
+ let translation;
56
+ try {
57
+ const language = this.getLanguageFromLanguageCode(code);
58
+ const region = this.getRegionFromLanguageCode(code);
59
+ const languagetranslation = languageNamesInCurrentLang.of(language);
60
+ const regionTranslation = regionNamesInCurrentLang.of(region);
61
+ translation = `${languagetranslation} (${regionTranslation})`;
62
+ }
63
+ catch {
64
+ translation = languageNamesInCurrentLang.of(code);
65
+ }
66
+ return this.capitalizeFirstLetter(translation);
67
+ }
68
+ isLanguageCodeSameAsRegion(fullLangCode) {
69
+ const [code, region, extra] = fullLangCode.split('-');
70
+ return code === region?.toLowerCase() && !extra;
71
+ }
72
+ getRegionFromLanguageCode(fullLangCode) {
73
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
74
+ const [_code, region, extra] = fullLangCode.split('-');
75
+ const regionCode = extra ? `${region}-${extra}` : `${region}`;
76
+ return regionCode.toUpperCase();
77
+ }
78
+ getLanguageFromLanguageCode(fullLangCode) {
79
+ return fullLangCode.split('-')[0].toLowerCase();
43
80
  }
44
81
  capitalizeFirstLetter(text) {
45
82
  return text.charAt(0).toUpperCase() + text.slice(1);
@@ -54,4 +91,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
54
91
  pure: false,
55
92
  }]
56
93
  }], ctorParameters: function () { return [{ type: i1.TranslateService }]; } });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtdHJhbnNsYXRlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvcGlwZXMvbGFuZ3VhZ2UtdHJhbnNsYXRlL2xhbmd1YWdlLXRyYW5zbGF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7QUFPcEQ7OztFQUdFO0FBQ0YsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUE2QixTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUZ2Qyw2QkFBd0IsR0FBRyxXQUFXLENBQUM7SUFFRyxDQUFDO0lBRTVELFNBQVMsQ0FBQyxZQUFvQixFQUFFLFVBQVUsR0FBRyxLQUFLO1FBQ2hELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE1BQU0scUJBQXFCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRSxNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBRTFGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sMEJBQTBCLENBQUMsWUFBb0I7UUFDckQsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksS0FBSyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDbEQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxRQUFnQixFQUFFLFVBQW9CO1FBQzNELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbkYsSUFBSSxXQUFXO1FBQ2I7OztVQUdFO1FBQ0Ysb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXBGLElBQUksVUFBVSxFQUFFO1lBQ2QsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDaEQ7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sc0NBQXNDLENBQUMsV0FBbUIsRUFBRSxJQUFZO1FBQzlFLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM5RixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFXLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRU8scUJBQXFCLENBQUMsSUFBWTtRQUN4QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDOytHQTlDVSxxQkFBcUI7NkdBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFSakMsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsbUJBQW1CO29CQUN6QixJQUFJLEVBQUUsS0FBSztpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5cclxuQFBpcGUoe1xyXG4gIG5hbWU6ICdsYW5ndWFnZVRyYW5zbGF0ZScsXHJcbiAgcHVyZTogZmFsc2UsXHJcbn0pXHJcbi8qKlxyXG4gIFRoaXMgcGlwZSBzZWFyY2hlcyBmb3IgYSBsYW5ndWFnZSBjb2RlIHRyYW5zbGF0aW9uIHdpdGhpbiBvdXIgSlNPTiBmaWxlcy4gXHJcbiAgSWYgdGhlIHRyYW5zbGF0aW9uIGZvciBhIGdpdmVuIGxhbmd1YWdlIGNvZGUgaXMgbm90IGZvdW5kIHRoZXJlLCBpdCByZXRyaWV2ZXMgaXQgZnJvbSB0aGUgYnJvd3NlcidzIEludGwgb2JqZWN0LlxyXG4qL1xyXG5leHBvcnQgY2xhc3MgTGFuZ3VhZ2VUcmFuc2xhdGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZXNMb2NhbGl6YXRpb25LZXkgPSAnTEFOR1VBR0VTJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XHJcblxyXG4gIHRyYW5zZm9ybShmdWxsTGFuZ0NvZGU6IHN0cmluZywgaGlkZVJlZ2lvbiA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgIGlmICghZnVsbExhbmdDb2RlKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYW5nQ29kZVdpdGhvdXRSZWdpb24gPSBmdWxsTGFuZ0NvZGUuc3BsaXQoJy0nKVswXTtcclxuICAgIGNvbnN0IGlzQ29kZUFuZFJlZ2lvblNhbWUgPSB0aGlzLmlzTGFuZ3VhZ2VDb2RlU2FtZUFzUmVnaW9uKGZ1bGxMYW5nQ29kZSk7XHJcbiAgICBjb25zdCBsYW5nQ29kZUZvclRyYW5zbGF0aW9uID0gaXNDb2RlQW5kUmVnaW9uU2FtZSA/IGxhbmdDb2RlV2l0aG91dFJlZ2lvbiA6IGZ1bGxMYW5nQ29kZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbihsYW5nQ29kZUZvclRyYW5zbGF0aW9uLCBoaWRlUmVnaW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNMYW5ndWFnZUNvZGVTYW1lQXNSZWdpb24oZnVsbExhbmdDb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IFtjb2RlLCByZWdpb24sIGV4dHJhXSA9IGZ1bGxMYW5nQ29kZS5zcGxpdCgnLScpO1xyXG4gICAgcmV0dXJuIGNvZGUgPT09IHJlZ2lvbj8udG9Mb3dlckNhc2UoKSAmJiAhZXh0cmE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRyYW5zbGF0aW9uKGxhbmdDb2RlOiBzdHJpbmcsIGhpZGVSZWdpb24/OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxhbmd1YWdlVHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmxhbmd1YWdlc0xvY2FsaXphdGlvbktleSk7XHJcbiAgICBsZXQgdHJhbnNsYXRpb24gPVxyXG4gICAgICAvKipcclxuICAgICAgICAgIGUuZy4gSW4gY2FzZSB3ZSBuZWVkIHRvIGRpc3BsYXkgXCJlbi1HQlwiIGxhbmd1YWdlIGNvZGUgYXMgXCJCcml0aXNoXCIgd2UgY2FuIGRvIHRoaXNcclxuICAgICAgICBieSBhZGRpbmcgXCJFTl9HQlwiOiBcIkJyaXRpc2hcIiBpbiBsb2NhbGl6YXRpb24gZmlsZXMgdW5kZXIgXCJMQU5HVUFHRVNcIiBrZXkuIFxyXG4gICAgICAqL1xyXG4gICAgICBsYW5ndWFnZVRyYW5zbGF0aW9uc1tsYW5nQ29kZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoJy0nLCAnXycpXSA/P1xyXG4gICAgICB0aGlzLmdldExhbmd1YWdlVHJhbnNsYXRpb25Gcm9tTGFuZ3VhZ2VDb2RlKHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nLCBsYW5nQ29kZSk7XHJcblxyXG4gICAgaWYgKGhpZGVSZWdpb24pIHtcclxuICAgICAgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbi5zcGxpdCgnKCcpWzBdLnRyaW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJhbnNsYXRpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExhbmd1YWdlVHJhbnNsYXRpb25Gcm9tTGFuZ3VhZ2VDb2RlKGN1cnJlbnRMYW5nOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsYW5ndWFnZU5hbWVzSW5DdXJyZW50TGFuZyA9IG5ldyBJbnRsLkRpc3BsYXlOYW1lcyhbY3VycmVudExhbmddLCB7IHR5cGU6ICdsYW5ndWFnZScgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIobGFuZ3VhZ2VOYW1lc0luQ3VycmVudExhbmcub2YoY29kZSkgYXMgc3RyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtdHJhbnNsYXRlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvcGlwZXMvbGFuZ3VhZ2UtdHJhbnNsYXRlL2xhbmd1YWdlLXRyYW5zbGF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7QUFPcEQ7OztFQUdFO0FBQ0YsTUFBTSxPQUFPLHFCQUFxQjtJQU9oQyxZQUE2QixTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQU52Qyw2QkFBd0IsR0FBRyxXQUFXLENBQUM7UUFJaEQscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFHbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDbkQsQ0FBQztJQUVELFNBQVMsQ0FBQyxZQUFvQixFQUFFLFVBQVUsR0FBRyxLQUFLO1FBQ2hELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUNsRDtRQUVELE1BQU0s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QUssQ0FBQztJQUNsRCxDQUFDO0lBRU8seUJBQXlCLENBQUMsWUFBb0I7UUFDcEQsNkRBQTZEO1FBQzdELE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUM5RCxPQUFPLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sMkJBQTJCLENBQUMsWUFBb0I7UUFDdEQsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFZO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7K0dBbEdVLHFCQUFxQjs2R0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQVJqQyxJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLElBQUksRUFBRSxLQUFLO2lCQUNaIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2xhbmd1YWdlVHJhbnNsYXRlJyxcclxuICBwdXJlOiBmYWxzZSxcclxufSlcclxuLyoqXHJcbiAgVGhpcyBwaXBlIHNlYXJjaGVzIGZvciBhIGxhbmd1YWdlIGNvZGUgdHJhbnNsYXRpb24gd2l0aGluIG91ciBKU09OIGZpbGVzLiBcclxuICBJZiB0aGUgdHJhbnNsYXRpb24gZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2UgY29kZSBpcyBub3QgZm91bmQgdGhlcmUsIGl0IHJldHJpZXZlcyBpdCBmcm9tIHRoZSBicm93c2VyJ3MgSW50bCBvYmplY3QuXHJcbiovXHJcbmV4cG9ydCBjbGFzcyBMYW5ndWFnZVRyYW5zbGF0ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlc0xvY2FsaXphdGlvbktleSA9ICdMQU5HVUFHRVMnO1xyXG5cclxuICBwcml2YXRlIGxhc3RVaUxhbmd1YWdlOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgdHJhbnNsYXRpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy50cmFuc2xhdGlvbkNhY2hlLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMubGFzdFVpTGFuZ3VhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcclxuICAgIH0pO1xyXG4gICAgdGhpcy5sYXN0VWlMYW5ndWFnZSA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtKGZ1bGxMYW5nQ29kZTogc3RyaW5nLCBoaWRlUmVnaW9uID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFmdWxsTGFuZ0NvZGUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmxhc3RVaUxhbmd1YWdlICE9PSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZykge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgdGhpcy5sYXN0VWlMYW5ndWFnZSA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7ZnVsbExhbmdDb2RlfToke2hpZGVSZWdpb259YDtcclxuXHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGlvbkNhY2hlLmhhcyhjYWNoZUtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25DYWNoZS5nZXQoY2FjaGVLZXkpITtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYW5nQ29kZVdpdGhvdXRSZWdpb24gPSB0aGlzLmdldExhbmd1YWdlRnJvbUxhbmd1YWdlQ29kZShmdWxsTGFuZ0NvZGUpO1xyXG4gICAgY29uc3QgaXNDb2RlQW5kUmVnaW9uU2FtZSA9IHRoaXMuaXNMYW5ndWFnZUNvZGVTYW1lQXNSZWdpb24oZnVsbExhbmdDb2RlKTtcclxuICAgIGNvbnN0IGxhbmdDb2RlRm9yVHJhbnNsYXRpb24gPSBpc0NvZGVBbmRSZWdpb25TYW1lID8gbGFuZ0NvZGVXaXRob3V0UmVnaW9uIDogZnVsbExhbmdDb2RlO1xyXG5cclxuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5nZXRUcmFuc2xhdGlvbihsYW5nQ29kZUZvclRyYW5zbGF0aW9uLCBoaWRlUmVnaW9uKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zbGF0aW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCB0cmFuc2xhdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbihsYW5nQ29kZTogc3RyaW5nLCBoaWRlUmVnaW9uPzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsYW5ndWFnZVRyYW5zbGF0aW9ucyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5sYW5ndWFnZXNMb2NhbGl6YXRpb25LZXkpO1xyXG4gICAgbGV0IHRyYW5zbGF0aW9uID1cclxuICAgICAgLyoqXHJcbiAgICAgICAgICBlLmcuIEluIGNhc2Ugd2UgbmVlZCB0byBkaXNwbGF5IFwiZW4tR0JcIiBsYW5ndWFnZSBjb2RlIGFzIFwiQnJpdGlzaFwiIHdlIGNhbiBkbyB0aGlzXHJcbiAgICAgICAgYnkgYWRkaW5nIFwiRU5fR0JcIjogXCJCcml0aXNoXCIgaW4gbG9jYWxpemF0aW9uIGZpbGVzIHVuZGVyIFwiTEFOR1VBR0VTXCIga2V5LiBcclxuICAgICAgKi9cclxuICAgICAgbGFuZ3VhZ2VUcmFuc2xhdGlvbnNbbGFuZ0NvZGUudG9VcHBlckNhc2UoKS5yZXBsYWNlKCctJywgJ18nKV0gPz9cclxuICAgICAgdGhpcy5nZXRMYW5ndWFnZVRyYW5zbGF0aW9uRnJvbUxhbmd1YWdlQ29kZSh0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZywgbGFuZ0NvZGUpO1xyXG5cclxuICAgIGlmIChoaWRlUmVnaW9uKSB7XHJcbiAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb24uc3BsaXQoJygnKVswXS50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMYW5ndWFnZVRyYW5zbGF0aW9uRnJvbUxhbmd1YWdlQ29kZShjdXJyZW50TGFuZzogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGFuZ3VhZ2VOYW1lc0luQ3VycmVudExhbmcgPSBuZXcgSW50bC5EaXNwbGF5TmFtZXMoW2N1cnJlbnRMYW5nXSwgeyB0eXBlOiAnbGFuZ3VhZ2UnIH0pO1xyXG4gICAgY29uc3QgcmVnaW9uTmFtZXNJbkN1cnJlbnRMYW5nID0gbmV3IEludGwuRGlzcGxheU5hbWVzKFtjdXJyZW50TGFuZ10sIHsgdHlwZTogJ3JlZ2lvbicgfSk7XHJcblxyXG4gICAgbGV0IHRyYW5zbGF0aW9uOiBzdHJpbmc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldExhbmd1YWdlRnJvbUxhbmd1YWdlQ29kZShjb2RlKTtcclxuICAgICAgY29uc3QgcmVnaW9uID0gdGhpcy5nZXRSZWdpb25Gcm9tTGFuZ3VhZ2VDb2RlKGNvZGUpO1xyXG5cclxuICAgICAgY29uc3QgbGFuZ3VhZ2V0cmFuc2xhdGlvbiA9IGxhbmd1YWdlTmFtZXNJbkN1cnJlbnRMYW5nLm9mKGxhbmd1YWdlKTtcclxuICAgICAgY29uc3QgcmVnaW9uVHJhbnNsYXRpb24gPSByZWdpb25OYW1lc0luQ3VycmVudExhbmcub2YocmVnaW9uKTtcclxuXHJcbiAgICAgIHRyYW5zbGF0aW9uID0gYCR7bGFuZ3VhZ2V0cmFuc2xhdGlvbn0gKCR7cmVnaW9uVHJhbnNsYXRpb259KWA7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgdHJhbnNsYXRpb24gPSBsYW5ndWFnZU5hbWVzSW5DdXJyZW50TGFuZy5vZihjb2RlKSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRyYW5zbGF0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNMYW5ndWFnZUNvZGVTYW1lQXNSZWdpb24oZnVsbExhbmdDb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IFtjb2RlLCByZWdpb24sIGV4dHJhXSA9IGZ1bGxMYW5nQ29kZS5zcGxpdCgnLScpO1xyXG4gICAgcmV0dXJuIGNvZGUgPT09IHJlZ2lvbj8udG9Mb3dlckNhc2UoKSAmJiAhZXh0cmE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlZ2lvbkZyb21MYW5ndWFnZUNvZGUoZnVsbExhbmdDb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgY29uc3QgW19jb2RlLCByZWdpb24sIGV4dHJhXSA9IGZ1bGxMYW5nQ29kZS5zcGxpdCgnLScpO1xyXG4gICAgY29uc3QgcmVnaW9uQ29kZSA9IGV4dHJhID8gYCR7cmVnaW9ufS0ke2V4dHJhfWAgOiBgJHtyZWdpb259YDtcclxuICAgIHJldHVybiByZWdpb25Db2RlLnRvVXBwZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExhbmd1YWdlRnJvbUxhbmd1YWdlQ29kZShmdWxsTGFuZ0NvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZnVsbExhbmdDb2RlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -618,19 +618,31 @@ class LanguageTranslatePipe {
618
618
  constructor(translate) {
619
619
  this.translate = translate;
620
620
  this.languagesLocalizationKey = 'LANGUAGES';
621
+ this.translationCache = new Map();
622
+ this.translate.onLangChange.subscribe(() => {
623
+ this.translationCache.clear();
624
+ this.lastUiLanguage = this.translate.currentLang;
625
+ });
626
+ this.lastUiLanguage = this.translate.currentLang;
621
627
  }
622
628
  transform(fullLangCode, hideRegion = false) {
623
629
  if (!fullLangCode) {
624
630
  return '';
625
631
  }
626
- const langCodeWithoutRegion = fullLangCode.split('-')[0];
632
+ if (this.lastUiLanguage !== this.translate.currentLang) {
633
+ this.translationCache.clear();
634
+ this.lastUiLanguage = this.translate.currentLang;
635
+ }
636
+ const cacheKey = `${fullLangCode}:${hideRegion}`;
637
+ if (this.translationCache.has(cacheKey)) {
638
+ return this.translationCache.get(cacheKey);
639
+ }
640
+ const langCodeWithoutRegion = this.getLanguageFromLanguageCode(fullLangCode);
627
641
  const isCodeAndRegionSame = this.isLanguageCodeSameAsRegion(fullLangCode);
628
642
  const langCodeForTranslation = isCodeAndRegionSame ? langCodeWithoutRegion : fullLangCode;
629
- return this.getTranslation(langCodeForTranslation, hideRegion);
630
- }
631
- isLanguageCodeSameAsRegion(fullLangCode) {
632
- const [code, region, extra] = fullLangCode.split('-');
633
- return code === region?.toLowerCase() && !extra;
643
+ const translation = this.getTranslation(langCodeForTranslation, hideRegion);
644
+ this.translationCache.set(cacheKey, translation);
645
+ return translation;
634
646
  }
635
647
  getTranslation(langCode, hideRegion) {
636
648
  const languageTranslations = this.translate.instant(this.languagesLocalizationKey);
@@ -648,7 +660,32 @@ class LanguageTranslatePipe {
648
660
  }
649
661
  getLanguageTranslationFromLanguageCode(currentLang, code) {
650
662
  const languageNamesInCurrentLang = new Intl.DisplayNames([currentLang], { type: 'language' });
651
- return this.capitalizeFirstLetter(languageNamesInCurrentLang.of(code));
663
+ const regionNamesInCurrentLang = new Intl.DisplayNames([currentLang], { type: 'region' });
664
+ let translation;
665
+ try {
666
+ const language = this.getLanguageFromLanguageCode(code);
667
+ const region = this.getRegionFromLanguageCode(code);
668
+ const languagetranslation = languageNamesInCurrentLang.of(language);
669
+ const regionTranslation = regionNamesInCurrentLang.of(region);
670
+ translation = `${languagetranslation} (${regionTranslation})`;
671
+ }
672
+ catch {
673
+ translation = languageNamesInCurrentLang.of(code);
674
+ }
675
+ return this.capitalizeFirstLetter(translation);
676
+ }
677
+ isLanguageCodeSameAsRegion(fullLangCode) {
678
+ const [code, region, extra] = fullLangCode.split('-');
679
+ return code === region?.toLowerCase() && !extra;
680
+ }
681
+ getRegionFromLanguageCode(fullLangCode) {
682
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
683
+ const [_code, region, extra] = fullLangCode.split('-');
684
+ const regionCode = extra ? `${region}-${extra}` : `${region}`;
685
+ return regionCode.toUpperCase();
686
+ }
687
+ getLanguageFromLanguageCode(fullLangCode) {
688
+ return fullLangCode.split('-')[0].toLowerCase();
652
689
  }
653
690
  capitalizeFirstLetter(text) {
654
691
  return text.charAt(0).toUpperCase() + text.slice(1);