UNPKG

@jsverse/transloco

Version:

The internationalization (i18n) library for Angular

106 lines 16 kB
import { assertInInjectionContext, computed, inject, Injector, isSignal, runInInjectionContext, } from '@angular/core'; import { toObservable, toSignal } from '@angular/core/rxjs-interop'; import { of, switchMap } from 'rxjs'; import { TRANSLOCO_SCOPE } from './transloco-scope'; import { TranslocoService } from './transloco.service'; /** * Gets the translated value of a key as Signal * * @example * text = translateSignal('hello'); * textList = translateSignal(['green', 'blue']); * textVar = translateSignal('hello', { variable: 'world' }); * textSpanish = translateSignal('hello', { variable: 'world' }, 'es'); * textTodosScope = translateSignal('hello', { variable: 'world' }, { scope: 'todos' }); * * @example * dynamicKey = signal('hello'); * dynamicParam = signal({ variable: 'world' }); * text = translateSignal(this.dynamicKey, this.dynamicParam); * */ export function translateSignal(key, params, lang, injector) { if (!injector) { assertInInjectionContext(translateSignal); } injector ??= inject(Injector); const result = runInInjectionContext(injector, () => { const service = inject(TranslocoService); const scope = resolveScope(lang); return computerKeysAndParams(key, params).pipe(switchMap((dynamic) => service.selectTranslate(dynamic.key, dynamic.params, scope))); }); return toSignal(result, { initialValue: Array.isArray(key) ? [''] : '' }); } /** * Gets the translated object of a key as Signal * * @example * object = translateObjectSignal('nested.object'); * title = object().title; * * @example * dynamicKey = signal('nested.object'); * dynamicParam = signal({ variable: 'world' }); * object = translateObjectSignal(this.dynamicKey, this.dynamicParam); */ export function translateObjectSignal(key, params, lang, injector) { if (!injector) { assertInInjectionContext(translateObjectSignal); } injector ??= inject(Injector); const result = runInInjectionContext(injector, () => { const service = inject(TranslocoService); const scope = resolveScope(lang); return computerKeysAndParams(key, params).pipe(switchMap((dynamic) => service.selectTranslateObject(dynamic.key, dynamic.params, scope))); }); return toSignal(result, { initialValue: Array.isArray(key) ? [] : {} }); } function computerParams(params) { if (isSignal(params)) { return computed(() => params()); } return computed(() => { return Object.entries(params).reduce((acc, [key, value]) => { acc[key] = isSignal(value) ? value() : value; return acc; }, {}); }); } function computerKeys(keys) { if (Array.isArray(keys)) { return computed(() => keys.map((key) => (isSignal(key) ? key() : key))); } return computed(() => keys()); } function isSignalKey(key) { return Array.isArray(key) ? key.some(isSignal) : isSignal(key); } function isSignalParams(params) { return params ? isSignal(params) || Object.values(params).some(isSignal) : false; } function computerKeysAndParams(key, params) { // Avoid async effect from toObservable for those that do not need it if (!isSignalKey(key) && !isSignalParams(params)) { return of({ key, params, }); } const computedKeys = isSignalKey(key) ? computerKeys(key) : computed(() => key); const computedParams = isSignalParams(params) ? computerParams(params) : computed(() => params); return toObservable(computed(() => ({ key: computedKeys(), params: computedParams() }))); } function resolveScope(scope) { if (typeof scope === 'undefined' || scope === '') { const translocoScope = inject(TRANSLOCO_SCOPE, { optional: true }); return translocoScope ?? undefined; } return scope; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdHJhbnNsb2NvL3NyYy9saWIvdHJhbnNsb2NvLnNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixxQkFBcUIsR0FFdEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFrQnZEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLEdBQU0sRUFDTixNQUE4QixFQUM5QixJQUFnQixFQUNoQixRQUFtQjtJQUVuQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxPQUFPLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzVDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ3BCLE9BQU8sQ0FBQyxl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QUFLLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsT0FBTyxjQUFjLElBQUksU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBpc1NpZ25hbCxcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxuICBTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVFJBTlNMT0NPX1NDT1BFIH0gZnJvbSAnLi90cmFuc2xvY28tc2NvcGUnO1xuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJy4vdHJhbnNsb2NvLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb24sIFRyYW5zbG9jb1Njb3BlIH0gZnJvbSAnLi90cmFuc2xvY28udHlwZXMnO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4vdXRpbHMvdHlwZS51dGlscyc7XG5cbnR5cGUgU2NvcGVUeXBlID0gc3RyaW5nIHwgVHJhbnNsb2NvU2NvcGUgfCBUcmFuc2xvY29TY29wZVtdO1xudHlwZSBTaWduYWxLZXkgPSBTaWduYWw8c3RyaW5nPiB8IFNpZ25hbDxzdHJpbmdbXT4gfCBTaWduYWw8c3RyaW5nPltdO1xudHlwZSBUcmFuc2xhdGVTaWduYWxLZXkgPSBzdHJpbmcgfCBzdHJpbmdbXSB8IFNpZ25hbEtleTtcbnR5cGUgVHJhbnNsYXRlU2lnbmFsUGFyYW1zID1cbiAgfCBIYXNoTWFwXG4gIHwgSGFzaE1hcDxTaWduYWw8c3RyaW5nPj5cbiAgfCBTaWduYWw8SGFzaE1hcD47XG50eXBlIFRyYW5zbGF0ZVNpZ25hbFJlZjxUPiA9IFQgZXh0ZW5kcyB1bmtub3duW10gfCBTaWduYWw8c3RyaW5nW10+XG4gID8gU2lnbmFsPHN0cmluZ1tdPlxuICA6IFNpZ25hbDxzdHJpbmc+O1xudHlwZSBUcmFuc2xhdGVPYmplY3RTaWduYWxSZWY8VD4gPSBUIGV4dGVuZHMgdW5rbm93bltdIHwgU2lnbmFsPHN0cmluZ1tdPlxuICA/IFNpZ25hbDxUcmFuc2xhdGlvbltdPlxuICA6IFNpZ25hbDxUcmFuc2xhdGlvbj47XG5cbi8qKlxuICogR2V0cyB0aGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhIGtleSBhcyBTaWduYWxcbiAqXG4gKiBAZXhhbXBsZVxuICogdGV4dCA9IHRyYW5zbGF0ZVNpZ25hbCgnaGVsbG8nKTtcbiAqIHRleHRMaXN0ID0gdHJhbnNsYXRlU2lnbmFsKFsnZ3JlZW4nLCAnYmx1ZSddKTtcbiAqIHRleHRWYXIgPSB0cmFuc2xhdGVTaWduYWwoJ2hlbGxvJywgeyB2YXJpYWJsZTogJ3dvcmxkJyB9KTtcbiAqIHRleHRTcGFuaXNoID0gdHJhbnNsYXRlU2lnbmFsKCdoZWxsbycsIHsgdmFyaWFibGU6ICd3b3JsZCcgfSwgJ2VzJyk7XG4gKiB0ZXh0VG9kb3NTY29wZSA9IHRyYW5zbGF0ZVNpZ25hbCgnaGVsbG8nLCB7IHZhcmlhYmxlOiAnd29ybGQnIH0sIHsgc2NvcGU6ICd0b2RvcycgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGR5bmFtaWNLZXkgPSBzaWduYWwoJ2hlbGxvJyk7XG4gKiBkeW5hbWljUGFyYW0gPSBzaWduYWwoeyB2YXJpYWJsZTogJ3dvcmxkJyB9KTtcbiAqIHRleHQgPSB0cmFuc2xhdGVTaWduYWwodGhpcy5keW5hbWljS2V5LCB0aGlzLmR5bmFtaWNQYXJhbSk7XG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlU2lnbmFsPFQgZXh0ZW5kcyBUcmFuc2xhdGVTaWduYWxLZXk+KFxuICBrZXk6IFQsXG4gIHBhcmFtcz86IFRyYW5zbGF0ZVNpZ25hbFBhcmFtcyxcbiAgbGFuZz86IFNjb3BlVHlwZSxcbiAgaW5qZWN0b3I/OiBJbmplY3Rvcixcbik6IFRyYW5zbGF0ZVNpZ25hbFJlZjxUPiB7XG4gIGlmICghaW5qZWN0b3IpIHtcbiAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQodHJhbnNsYXRlU2lnbmFsKTtcbiAgfVxuICBpbmplY3RvciA/Pz0gaW5qZWN0KEluamVjdG9yKTtcbiAgY29uc3QgcmVzdWx0ID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcbiAgICBjb25zdCBzY29wZSA9IHJlc29sdmVTY29wZShsYW5nKTtcbiAgICByZXR1cm4gY29tcHV0ZXJLZXlzQW5kUGFyYW1zKGtleSwgcGFyYW1zKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChkeW5hbWljKSA9PlxuICAgICAgICBzZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZShkeW5hbWljLmtleSwgZHluYW1pYy5wYXJhbXMsIHNjb3BlKSxcbiAgICAgICksXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiB0b1NpZ25hbChyZXN1bHQsIHsgaW5pdGlhbFZhbHVlOiBBcnJheS5pc0FycmF5KGtleSkgPyBbJyddIDogJycgfSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdHJhbnNsYXRlZCBvYmplY3Qgb2YgYSBrZXkgYXMgU2lnbmFsXG4gKlxuICogQGV4YW1wbGVcbiAqIG9iamVjdCA9IHRyYW5zbGF0ZU9iamVjdFNpZ25hbCgnbmVzdGVkLm9iamVjdCcpO1xuICogdGl0bGUgPSBvYmplY3QoKS50aXRsZTtcbiAqXG4gKiBAZXhhbXBsZVxuICogZHluYW1pY0tleSA9IHNpZ25hbCgnbmVzdGVkLm9iamVjdCcpO1xuICogZHluYW1pY1BhcmFtID0gc2lnbmFsKHsgdmFyaWFibGU6ICd3b3JsZCcgfSk7XG4gKiBvYmplY3QgPSB0cmFuc2xhdGVPYmplY3RTaWduYWwodGhpcy5keW5hbWljS2V5LCB0aGlzLmR5bmFtaWNQYXJhbSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVPYmplY3RTaWduYWw8VCBleHRlbmRzIFRyYW5zbGF0ZVNpZ25hbEtleT4oXG4gIGtleTogVCxcbiAgcGFyYW1zPzogVHJhbnNsYXRlU2lnbmFsUGFyYW1zLFxuICBsYW5nPzogU2NvcGVUeXBlLFxuICBpbmplY3Rvcj86IEluamVjdG9yLFxuKTogVHJhbnNsYXRlT2JqZWN0U2lnbmFsUmVmPFQ+IHtcbiAgaWYgKCFpbmplY3Rvcikge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCh0cmFuc2xhdGVPYmplY3RTaWduYWwpO1xuICB9XG4gIGluamVjdG9yID8/PSBpbmplY3QoSW5qZWN0b3IpO1xuICBjb25zdCByZXN1bHQgPSBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuICAgIGNvbnN0IHNjb3BlID0gcmVzb2x2ZVNjb3BlKGxhbmcpO1xuICAgIHJldHVybiBjb21wdXRlcktleXNBbmRQYXJhbXMoa2V5LCBwYXJhbXMpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGR5bmFtaWMpID0+XG4gICAgICAgIHNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlT2JqZWN0KFxuICAgICAgICAgIGR5bmFtaWMua2V5LFxuICAgICAgICAgIGR5bmFtaWMucGFyYW1zLFxuICAgICAgICAgIHNjb3BlIGFzIHN0cmluZyxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiB0b1NpZ25hbChyZXN1bHQsIHsgaW5pdGlhbFZhbHVlOiBBcnJheS5pc0FycmF5KGtleSkgPyBbXSA6IHt9IH0pO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlclBhcmFtcyhwYXJhbXM6IEhhc2hNYXA8U2lnbmFsPHN0cmluZz4+IHwgU2lnbmFsPEhhc2hNYXA+KSB7XG4gIGlmIChpc1NpZ25hbChwYXJhbXMpKSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHBhcmFtcygpKTtcbiAgfVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwYXJhbXMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY1trZXldID0gaXNTaWduYWwodmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBIYXNoTWFwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVyS2V5cyhcbiAga2V5czogU2lnbmFsPHN0cmluZz4gfCBTaWduYWw8c3RyaW5nW10+IHwgU2lnbmFsPHN0cmluZz5bXSxcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBrZXlzLm1hcCgoa2V5KSA9PiAoaXNTaWduYWwoa2V5KSA/IGtleSgpIDoga2V5KSkpO1xuICB9XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiBrZXlzKCkpO1xufVxuXG5mdW5jdGlvbiBpc1NpZ25hbEtleShrZXk6IFRyYW5zbGF0ZVNpZ25hbEtleSk6IGtleSBpcyBTaWduYWxLZXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShrZXkpID8ga2V5LnNvbWUoaXNTaWduYWwpIDogaXNTaWduYWwoa2V5KTtcbn1cblxuZnVuY3Rpb24gaXNTaWduYWxQYXJhbXMoXG4gIHBhcmFtcz86IEhhc2hNYXAsXG4pOiBwYXJhbXMgaXMgSGFzaE1hcDxTaWduYWw8c3RyaW5nPj4gfCBTaWduYWw8SGFzaE1hcD4ge1xuICByZXR1cm4gcGFyYW1zXG4gICAgPyBpc1NpZ25hbChwYXJhbXMpIHx8IE9iamVjdC52YWx1ZXMocGFyYW1zKS5zb21lKGlzU2lnbmFsKVxuICAgIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVyS2V5c0FuZFBhcmFtcyhcbiAga2V5OiBUcmFuc2xhdGVTaWduYWxLZXksXG4gIHBhcmFtcz86IFRyYW5zbGF0ZVNpZ25hbFBhcmFtcyxcbik6IE9ic2VydmFibGU8e1xuICBrZXk6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBwYXJhbXM6IEhhc2hNYXAgfCB1bmRlZmluZWQ7XG59PiB7XG4gIC8vIEF2b2lkIGFzeW5jIGVmZmVjdCBmcm9tIHRvT2JzZXJ2YWJsZSBmb3IgdGhvc2UgdGhhdCBkbyBub3QgbmVlZCBpdFxuICBpZiAoIWlzU2lnbmFsS2V5KGtleSkgJiYgIWlzU2lnbmFsUGFyYW1zKHBhcmFtcykpIHtcbiAgICByZXR1cm4gb2Yoe1xuICAgICAga2V5LFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGNvbXB1dGVkS2V5cyA9IGlzU2lnbmFsS2V5KGtleSlcbiAgICA/IGNvbXB1dGVyS2V5cyhrZXkpXG4gICAgOiBjb21wdXRlZCgoKSA9PiBrZXkpO1xuICBjb25zdCBjb21wdXRlZFBhcmFtcyA9IGlzU2lnbmFsUGFyYW1zKHBhcmFtcylcbiAgICA/IGNvbXB1dGVyUGFyYW1zKHBhcmFtcylcbiAgICA6IGNvbXB1dGVkKCgpID0+IHBhcmFtcyk7XG4gIHJldHVybiB0b09ic2VydmFibGUoXG4gICAgY29tcHV0ZWQoKCkgPT4gKHsga2V5OiBjb21wdXRlZEtleXMoKSwgcGFyYW1zOiBjb21wdXRlZFBhcmFtcygpIH0pKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVNjb3BlKHNjb3BlPzogU2NvcGVUeXBlKSB7XG4gIGlmICh0eXBlb2Ygc2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHNjb3BlID09PSAnJykge1xuICAgIGNvbnN0IHRyYW5zbG9jb1Njb3BlID0gaW5qZWN0KFRSQU5TTE9DT19TQ09QRSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdHJhbnNsb2NvU2NvcGUgPz8gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzY29wZTtcbn1cbiJdfQ==