@jsverse/transloco
Version:
The internationalization (i18n) library for Angular
98 lines • 14.2 kB
JavaScript
import { ChangeDetectorRef, Inject, Optional, Pipe, } from '@angular/core';
import { forkJoin, switchMap } from 'rxjs';
import { TranslocoService } from './transloco.service';
import { TRANSLOCO_SCOPE } from './transloco-scope';
import { TRANSLOCO_LANG } from './transloco-lang';
import { listenOrNotOperator, shouldListenToLangChanges, } from './utils/lang.utils';
import { LangResolver } from './lang-resolver';
import { ScopeResolver } from './scope-resolver';
import { resolveInlineLoader } from './utils/scope.utils';
import * as i0 from "@angular/core";
import * as i1 from "./transloco.service";
export class TranslocoPipe {
service;
providerScope;
providerLang;
cdr;
subscription = null;
lastValue = '';
lastKey;
path;
langResolver = new LangResolver();
scopeResolver;
constructor(service, providerScope, providerLang, cdr) {
this.service = service;
this.providerScope = providerScope;
this.providerLang = providerLang;
this.cdr = cdr;
this.scopeResolver = new ScopeResolver(this.service);
}
// null is for handling strict mode + async pipe types https://github.com/jsverse/transloco/issues/311
// null is for handling strict mode + optional chaining types https://github.com/jsverse/transloco/issues/488
transform(key, params, inlineLang) {
if (!key) {
return key;
}
const keyName = params ? `${key}${JSON.stringify(params)}` : key;
if (keyName === this.lastKey) {
return this.lastValue;
}
this.lastKey = keyName;
this.subscription?.unsubscribe();
const listenToLangChange = shouldListenToLangChanges(this.service, this.providerLang || inlineLang);
this.subscription = this.service.langChanges$
.pipe(switchMap((activeLang) => {
const lang = this.langResolver.resolve({
inline: inlineLang,
provider: this.providerLang,
active: activeLang,
});
return Array.isArray(this.providerScope)
? forkJoin(this.providerScope.map((providerScope) => this.resolveScope(lang, providerScope)))
: this.resolveScope(lang, this.providerScope);
}), listenOrNotOperator(listenToLangChange))
.subscribe(() => this.updateValue(key, params));
return this.lastValue;
}
ngOnDestroy() {
this.subscription?.unsubscribe();
// Caretaker note: it's important to clean up references to subscriptions since they save the `next`
// callback within its `destination` property, preventing classes from being GC'd.
this.subscription = null;
}
updateValue(key, params) {
const lang = this.langResolver.resolveLangBasedOnScope(this.path);
this.lastValue = this.service.translate(key, params, lang);
this.cdr.markForCheck();
}
resolveScope(lang, providerScope) {
const resolvedScope = this.scopeResolver.resolve({
inline: undefined,
provider: providerScope,
});
this.path = this.langResolver.resolveLangPath(lang, resolvedScope);
const inlineLoader = resolveInlineLoader(providerScope, resolvedScope);
return this.service._loadDependencies(this.path, inlineLoader);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TranslocoPipe, deps: [{ token: i1.TranslocoService }, { token: TRANSLOCO_SCOPE, optional: true }, { token: TRANSLOCO_LANG, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe });
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.9", ngImport: i0, type: TranslocoPipe, isStandalone: true, name: "transloco", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TranslocoPipe, decorators: [{
type: Pipe,
args: [{
name: 'transloco',
pure: false,
standalone: true,
}]
}], ctorParameters: () => [{ type: i1.TranslocoService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [TRANSLOCO_SCOPE]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [TRANSLOCO_LANG]
}] }, { type: i0.ChangeDetectorRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsTUFBTSxFQUVOLFFBQVEsRUFDUixJQUFJLEdBRUwsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBNEIsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQix5QkFBeUIsR0FDMUIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFPMUQsTUFBTSxPQUFPLGFBQWE7SUFTZDtJQUdBO0lBR0E7SUFDQTtJQWZGLFlBQVksR0FBd0IsSUFBSSxDQUFDO0lBQ3pDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDZixPQUFPLENBQXFCO0lBQzVCLElBQUksQ0FBcUI7SUFDekIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDbEMsYUFBYSxDQUFpQjtJQUV0QyxZQUNVLE9BQXlCLEVBR3pCLGFBQWtELEVBR2xELFlBQWdDLEVBQ2hDLEdBQXNCO1FBUHRCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBR3pCLGtCQUFhLEdBQWIsYUFBYSxDQUFxQztRQUdsRCxpQkFBWSxHQUFa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QUM7UUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdkUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDakUsQ0FBQzt1R0EvRlUsYUFBYSxrREFXZCxlQUFlLDZCQUdmLGNBQWM7cUdBZGIsYUFBYTs7MkZBQWIsYUFBYTtrQkFMekIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsV0FBVztvQkFDakIsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFXSSxRQUFROzswQkFDUixNQUFNOzJCQUFDLGVBQWU7OzBCQUV0QixRQUFROzswQkFDUixNQUFNOzJCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgSW5qZWN0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBQaXBlLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT3JBcnJheSB9IGZyb20gJ0Bqc3ZlcnNlL3V0aWxzJztcblxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJy4vdHJhbnNsb2NvLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb24sIFRyYW5zbG9jb1Njb3BlIH0gZnJvbSAnLi90cmFuc2xvY28udHlwZXMnO1xuaW1wb3J0IHsgVFJBTlNMT0NPX1NDT1BFIH0gZnJvbSAnLi90cmFuc2xvY28tc2NvcGUnO1xuaW1wb3J0IHsgVFJBTlNMT0NPX0xBTkcgfSBmcm9tICcuL3RyYW5zbG9jby1sYW5nJztcbmltcG9ydCB7XG4gIGxpc3Rlbk9yTm90T3BlcmF0b3IsXG4gIHNob3VsZExpc3RlblRvTGFuZ0NoYW5nZXMsXG59IGZyb20gJy4vdXRpbHMvbGFuZy51dGlscyc7XG5pbXBvcnQgeyBMYW5nUmVzb2x2ZXIgfSBmcm9tICcuL2xhbmctcmVzb2x2ZXInO1xuaW1wb3J0IHsgU2NvcGVSZXNvbHZlciB9IGZyb20gJy4vc2NvcGUtcmVzb2x2ZXInO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4vdXRpbHMvdHlwZS51dGlscyc7XG5pbXBvcnQgeyByZXNvbHZlSW5saW5lTG9hZGVyIH0gZnJvbSAnLi91dGlscy9zY29wZS51dGlscyc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ3RyYW5zbG9jbycsXG4gIHB1cmU6IGZhbHNlLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xvY29QaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RWYWx1ZSA9ICcnO1xuICBwcml2YXRlIGxhc3RLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbGFuZ1Jlc29sdmVyID0gbmV3IExhbmdSZXNvbHZlcigpO1xuICBwcml2YXRlIHNjb3BlUmVzb2x2ZXIhOiBTY29wZVJlc29sdmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogVHJhbnNsb2NvU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoVFJBTlNMT0NPX1NDT1BFKVxuICAgIHByaXZhdGUgcHJvdmlkZXJTY29wZTogT3JBcnJheTxUcmFuc2xvY29TY29wZT4gfCB1bmRlZmluZWQsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFRSQU5TTE9DT19MQU5HKVxuICAgIHByaXZhdGUgcHJvdmlkZXJMYW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICB0aGlzLnNjb3BlUmVzb2x2ZXIgPSBuZXcgU2NvcGVSZXNvbHZlcih0aGlzLnNlcnZpY2UpO1xuICB9XG5cbiAgLy8gbnVsbCBpcyBmb3IgaGFuZGxpbmcgc3RyaWN0IG1vZGUgKyBhc3luYyBwaXBlIHR5cGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3ZlcnNlL3RyYW5zbG9jby9pc3N1ZXMvMzExXG4gIC8vIG51bGwgaXMgZm9yIGhhbmRsaW5nIHN0cmljdCBtb2RlICsgb3B0aW9uYWwgY2hhaW5pbmcgdHlwZXMgaHR0cHM6Ly9naXRodWIuY29tL2pzdmVyc2UvdHJhbnNsb2NvL2lzc3Vlcy80ODhcbiAgdHJhbnNmb3JtKFxuICAgIGtleT86IHN0cmluZyB8IG51bGwsXG4gICAgcGFyYW1zPzogSGFzaE1hcCxcbiAgICBpbmxpbmVMYW5nPzogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4ga2V5IGFzIGFueTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlOYW1lID0gcGFyYW1zID8gYCR7a2V5fSR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gIDoga2V5O1xuXG4gICAgaWYgKGtleU5hbWUgPT09IHRoaXMubGFzdEtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMubGFzdEtleSA9IGtleU5hbWU7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBsaXN0ZW5Ub0xhbmdDaGFuZ2UgPSBzaG91bGRMaXN0ZW5Ub0xhbmdDaGFuZ2VzKFxuICAgICAgdGhpcy5zZXJ2aWNlLFxuICAgICAgdGhpcy5wcm92aWRlckxhbmcgfHwgaW5saW5lTGFuZyxcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnNlcnZpY2UubGFuZ0NoYW5nZXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChhY3RpdmVMYW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ1Jlc29sdmVyLnJlc29sdmUoe1xuICAgICAgICAgICAgaW5saW5lOiBpbmxpbmVMYW5nLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMucHJvdmlkZXJMYW5nLFxuICAgICAgICAgICAgYWN0aXZlOiBhY3RpdmVMYW5nLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5wcm92aWRlclNjb3BlKVxuICAgICAgICAgICAgPyBmb3JrSm9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyU2NvcGUubWFwKChwcm92aWRlclNjb3BlKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlU2NvcGUobGFuZywgcHJvdmlkZXJTY29wZSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLnJlc29sdmVTY29wZShsYW5nLCB0aGlzLnByb3ZpZGVyU2NvcGUpO1xuICAgICAgICB9KSxcbiAgICAgICAgbGlzdGVuT3JOb3RPcGVyYXRvcihsaXN0ZW5Ub0xhbmdDaGFuZ2UpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZVZhbHVlKGtleSwgcGFyYW1zKSk7XG5cbiAgICByZXR1cm4gdGhpcy5sYXN0VmFsdWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAvLyBDYXJldGFrZXIgbm90ZTogaXQncyBpbXBvcnRhbnQgdG8gY2xlYW4gdXAgcmVmZXJlbmNlcyB0byBzdWJzY3JpcHRpb25zIHNpbmNlIHRoZXkgc2F2ZSB0aGUgYG5leHRgXG4gICAgLy8gY2FsbGJhY2sgd2l0aGluIGl0cyBgZGVzdGluYXRpb25gIHByb3BlcnR5LCBwcmV2ZW50aW5nIGNsYXNzZXMgZnJvbSBiZWluZyBHQydkLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHBhcmFtcz86IEhhc2hNYXAgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nUmVzb2x2ZXIucmVzb2x2ZUxhbmdCYXNlZE9uU2NvcGUodGhpcy5wYXRoISk7XG4gICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLnNlcnZpY2UudHJhbnNsYXRlKGtleSwgcGFyYW1zLCBsYW5nKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVNjb3BlKFxuICAgIGxhbmc6IHN0cmluZyxcbiAgICBwcm92aWRlclNjb3BlOiBUcmFuc2xvY29TY29wZSB8IG51bGwsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24gfCBUcmFuc2xhdGlvbltdPiB7XG4gICAgY29uc3QgcmVzb2x2ZWRTY29wZSA9IHRoaXMuc2NvcGVSZXNvbHZlci5yZXNvbHZlKHtcbiAgICAgIGlubGluZTogdW5kZWZpbmVkLFxuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyU2NvcGUsXG4gICAgfSk7XG4gICAgdGhpcy5wYXRoID0gdGhpcy5sYW5nUmVzb2x2ZXIucmVzb2x2ZUxhbmdQYXRoKGxhbmcsIHJlc29sdmVkU2NvcGUpO1xuICAgIGNvbnN0IGlubGluZUxvYWRlciA9IHJlc29sdmVJbmxpbmVMb2FkZXIocHJvdmlkZXJTY29wZSwgcmVzb2x2ZWRTY29wZSk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLl9sb2FkRGVwZW5kZW5jaWVzKHRoaXMucGF0aCwgaW5saW5lTG9hZGVyKTtcbiAgfVxufVxuIl19