@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
JavaScript
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==