UNPKG

@ogs-gmbh/ngx-translate

Version:

A lightweight, REST-based Angular i18n library designed for seamless internationalization with minimal setup. It supports dynamic language switching & flexible translation management via RESTful APIs.

54 lines 9.13 kB
import { ChangeDetectorRef, Pipe, inject } from "@angular/core"; import { TRANSLATION_CONFIG_TOKEN } from "../public-api"; import { EMPTY, catchError, filter } from "rxjs"; import { TRANSLATION_SCOPE_TOKEN } from "../tokens/scope.token"; import { TranslationService } from "../services/translation.service"; import { resolveScope } from "../utils/translate.util"; import * as i0 from "@angular/core"; export class TranslationPipe { _translationServiceSubscription = null; _lastValue = null; _hasTranslationChanged = false; _translationService = inject(TranslationService); _changeDetectorRef = inject(ChangeDetectorRef); _translationScopeToken = inject(TRANSLATION_SCOPE_TOKEN, { optional: true }); _translationConfig = inject(TRANSLATION_CONFIG_TOKEN, { optional: true }); transform(value, token, scope, fallback) { if (this._translationServiceSubscription !== null) return this._lastValue ?? value; this._translationServiceSubscription = this._translationService.translateTokenByLocale$(token, value, this._resolveScope(scope)) .pipe(catchError((_httpErrorResponse, _) => { const fallbackToSourceLocale = fallback ?? this._translationConfig?.fallbackToSourceLocale; if (fallbackToSourceLocale) this._updateLastValue(value); return EMPTY; }), filter((translation) => translation !== this._lastValue)) .subscribe({ next: (translation) => { this._hasTranslationChanged = translation !== this._lastValue; this._updateLastValue(translation); } }); return this._lastValue ?? value; } ngOnDestroy() { this._translationServiceSubscription?.unsubscribe(); } _resolveScope(scope) { return resolveScope(this._translationConfig, scope ?? this._translationScopeToken); } _updateLastValue(newValue) { this._lastValue = newValue; this._hasTranslationChanged && this._changeDetectorRef.markForCheck(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: TranslationPipe, name: "translate", pure: false }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationPipe, decorators: [{ type: Pipe, args: [{ name: "translate", pure: false }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24ucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9waXBlcy90cmFuc2xhdGlvbi5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBYSxJQUFJLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQTJCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxLQUFLLEVBQTRCLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU92RCxNQUFNLE9BQU8sZUFBZTtJQUNsQiwrQkFBK0IsR0FBd0IsSUFBSSxDQUFDO0lBRTVELFVBQVUsR0FBa0IsSUFBSSxDQUFDO0lBRWpDLHNCQUFzQixHQUFZLEtBQUssQ0FBQztJQUUvQixtQkFBbUIsR0FBdUIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFckUsa0JBQWtCLEdBQXNCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWxFLHNCQUFzQixHQUFrQixNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU1RixrQkFBa0IsR0FBbUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEgsU0FBUyxDQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsS0FBc0QsRUFBRSxRQUFrQjtRQUN4SCxJQUFJLElBQUksQ0FBQywrQkFBK0IsS0FBSyxJQUFJO1lBQy9DLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFFbEMsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDN0gsSUFBSSxDQUNILFVBQVUsQ0FBQyxDQUFDLGtCQUFxQyxFQUFFLENBQXFCLEVBQXNCLEVBQUU7WUFDOUYsTUFBTSxzQkFBc0IsR0FBd0IsUUFBUSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQztZQUVoSCxJQUFJLHNCQUFzQjtnQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLEVBQ0YsTUFBTSxDQUFDLENBQUMsV0FBbUIsRUFBVyxFQUFFLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDMUU7YUFDQSxTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxXQUFtQixFQUFRLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxXQUFXLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7U0FDRixDQUFDLENBQUM7UUFFTCxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQywrQkFBK0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRU8sYUFBYSxDQUF5RCxLQUFTO1FBQ3JGLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLHNCQUEyQixDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVPLGdCQUFnQixDQUFFLFFBQWdCO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEUsQ0FBQzt3R0FwRFUsZUFBZTtzR0FBZixlQUFlOzs0RkFBZixlQUFlO2tCQUozQixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxXQUFXO29CQUNqQixJQUFJLEVBQUUsS0FBSztpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIFBpcGUsIFBpcGVUcmFuc2Zvcm0sIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTcGVjaWZpY1RyYW5zbGF0ZUNvbmZpZywgVFJBTlNMQVRJT05fQ09ORklHX1RPS0VOIH0gZnJvbSBcIi4uL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGNhdGNoRXJyb3IsIGZpbHRlciB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBUUkFOU0xBVElPTl9TQ09QRV9UT0tFTiB9IGZyb20gXCIuLi90b2tlbnMvc2NvcGUudG9rZW5cIjtcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZXNvbHZlU2NvcGUgfSBmcm9tIFwiLi4vdXRpbHMvdHJhbnNsYXRlLnV0aWxcIjtcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5cbkBQaXBlKHtcbiAgbmFtZTogXCJ0cmFuc2xhdGVcIixcbiAgcHVyZTogZmFsc2Vcbn0pXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb25QaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9sYXN0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2hhc1RyYW5zbGF0aW9uQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0aW9uU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGlvblNjb3BlVG9rZW46IHN0cmluZyB8IG51bGwgPSBpbmplY3QoVFJBTlNMQVRJT05fU0NPUEVfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRpb25Db25maWc6IFNwZWNpZmljVHJhbnNsYXRlQ29uZmlnIHwgbnVsbCA9IGluamVjdChUUkFOU0xBVElPTl9DT05GSUdfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHVibGljIHRyYW5zZm9ybSAodmFsdWU6IHN0cmluZywgdG9rZW46IHN0cmluZywgc2NvcGU/OiBSZWFkb25seTxBcnJheTxzdHJpbmcgfCBudWxsPiB8IHN0cmluZyB8IG51bGw+LCBmYWxsYmFjaz86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl90cmFuc2xhdGlvblNlcnZpY2VTdWJzY3JpcHRpb24gIT09IG51bGwpXG4gICAgICByZXR1cm4gdGhpcy5fbGFzdFZhbHVlID8/IHZhbHVlO1xuXG4gICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlU3Vic2NyaXB0aW9uID0gdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZVRva2VuQnlMb2NhbGUkKHRva2VuLCB2YWx1ZSwgdGhpcy5fcmVzb2x2ZVNjb3BlKHNjb3BlKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChfaHR0cEVycm9yUmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlLCBfOiBPYnNlcnZhYmxlPHN0cmluZz4pOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrVG9Tb3VyY2VMb2NhbGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxsYmFjayA/PyB0aGlzLl90cmFuc2xhdGlvbkNvbmZpZz8uZmFsbGJhY2tUb1NvdXJjZUxvY2FsZTtcblxuICAgICAgICAgIGlmIChmYWxsYmFja1RvU291cmNlTG9jYWxlKVxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGFzdFZhbHVlKHZhbHVlKTtcblxuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcigodHJhbnNsYXRpb246IHN0cmluZyk6IGJvb2xlYW4gPT4gdHJhbnNsYXRpb24gIT09IHRoaXMuX2xhc3RWYWx1ZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAodHJhbnNsYXRpb246IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhc1RyYW5zbGF0aW9uQ2hhbmdlZCA9IHRyYW5zbGF0aW9uICE9PSB0aGlzLl9sYXN0VmFsdWU7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlTGFzdFZhbHVlKHRyYW5zbGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fbGFzdFZhbHVlID8/IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95ICgpOiB2b2lkIHtcbiAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlU2NvcGU8VCBleHRlbmRzIFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVsbD4gfCBzdHJpbmcgfCBudWxsPihzY29wZT86IFQpOiBUIHtcbiAgICByZXR1cm4gcmVzb2x2ZVNjb3BlKHRoaXMuX3RyYW5zbGF0aW9uQ29uZmlnLCBzY29wZSA/PyB0aGlzLl90cmFuc2xhdGlvblNjb3BlVG9rZW4gYXMgVCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVMYXN0VmFsdWUgKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9sYXN0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLl9oYXNUcmFuc2xhdGlvbkNoYW5nZWQgJiYgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==