{"version":3,"file":"ngx-translate-core.mjs","sources":["../../../projects/ngx-translate/src/lib/extraction-marker.ts","../../../projects/ngx-translate/src/lib/loading-translations-registry.ts","../../../projects/ngx-translate/src/lib/missing-translation-handler.ts","../../../projects/ngx-translate/src/lib/translate.compiler.ts","../../../projects/ngx-translate/src/lib/translate.loader.ts","../../../projects/ngx-translate/src/lib/util.ts","../../../projects/ngx-translate/src/lib/translate.parser.ts","../../../projects/ngx-translate/src/lib/translate.store.ts","../../../projects/ngx-translate/src/lib/translate.service.ts","../../../projects/ngx-translate/src/lib/translate.function.ts","../../../projects/ngx-translate/src/lib/translate-block.directive.ts","../../../projects/ngx-translate/src/lib/translate-content-key.ts","../../../projects/ngx-translate/src/lib/translate.directive.ts","../../../projects/ngx-translate/src/lib/translate.pipe.ts","../../../projects/ngx-translate/src/lib/translate.providers.ts","../../../projects/ngx-translate/src/lib/translate.service.interface.ts","../../../projects/ngx-translate/src/ngx-translate-core.ts"],"sourcesContent":["export function _<T extends string | string[]>(key: T): T {\n    return key;\n}\n","import { computed, Signal, signal, WritableSignal } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport type { InterpolatableTranslationObject, Language } from \"./translate.service.interface\";\n\nfunction omit<V>(map: Record<Language, V>, key: Language): Record<Language, V> {\n    const next: Record<Language, V> = {};\n    for (const k of Object.keys(map)) {\n        if (k !== key) next[k] = map[k];\n    }\n    return next;\n}\n\n/**\n * In-flight load registry — one entry per language currently being loaded.\n * Backed by a signal so `isLoading` can derive reactively from its contents.\n *\n * Invariants:\n * - Entries added by `loadAndCompileTranslations` before subscribe.\n * - Entries removed by `loadAndCompileTranslations`'s `tap` on the success\n *   path (synchronously between store update and subscriber notification, so\n *   subscribers observe this language gone from the registry — and\n *   `isLoading()` flips false if no other load is in flight) and by the\n *   `shareReplay`'d Observable's `finalize` for error / sync-throw /\n *   last-subscriber-unsubscribe paths. The success-path finalize is a safe\n *   no-op (idempotent `clearIfOwner`).\n * - Same-language back-to-back loads dedup via the existing `shareReplay`; the\n *   registry stays at one entry per language regardless of subscriber count.\n *   `isLoading` therefore toggles `0 -> 1 -> 0` once per language load, not\n *   once per subscriber. Set-based, not count-based — matches user intent\n *   (\"a language is loading\" not \"N callers asked\").\n * - `clearIfOwner(lang, token)` only removes the entry if it still matches the\n *   original Observable token captured at `set()` time. Prevents stale-finalize\n *   races where an old load's `finalize` would clobber a newer load's entry\n *   (e.g. `resetLang` followed by `reloadLang` while the old load is still\n *   mid-flight).\n * - `clear(lang)` is unconditional — used by `resetLang` to forcibly drop\n *   ownership regardless of which load owns the entry.\n *\n * Internal to the package — not re-exported from `public-api.ts`.\n */\nexport class LoadingTranslationsRegistry {\n    private state: WritableSignal<Record<Language, Observable<InterpolatableTranslationObject>>> =\n        signal({});\n\n    /** Reactive — `true` while at least one load is in flight. */\n    readonly hasAny: Signal<boolean> = computed(() => Object.keys(this.state()).length > 0);\n\n    /** `true` while THIS language is being loaded on this instance. */\n    isLoading(lang: Language): boolean {\n        return this.state()[lang] !== undefined;\n    }\n\n    get(lang: Language): Observable<InterpolatableTranslationObject> | undefined {\n        return this.state()[lang];\n    }\n\n    set(lang: Language, obs: Observable<InterpolatableTranslationObject>): void {\n        this.state.update((m) => ({ ...m, [lang]: obs }));\n    }\n\n    /** Unconditional clear. Used by `resetLang` to forcibly drop the entry. */\n    clear(lang: Language): void {\n        this.state.update((m) => omit(m, lang));\n    }\n\n    /**\n     * Token-aware clear. Used by `loadAndCompileTranslations`'s `finalize` so\n     * an old load's `finalize` cannot clobber a newer load's entry.\n     */\n    clearIfOwner(lang: Language, token: Observable<InterpolatableTranslationObject>): void {\n        this.state.update((m) => (m[lang] === token ? omit(m, lang) : m));\n    }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { TranslateService } from \"./translate.service\";\nimport { StrictTranslation } from \"./translate.service.interface\";\n\nexport interface MissingTranslationHandlerParams {\n    /**\n     * the key that's missing in translation files\n     */\n    key: string;\n\n    /**\n     * an instance of the service that was unable to translate the key.\n     */\n    translateService: TranslateService;\n\n    /**\n     * interpolation params that were passed along for translating the given key.\n     */\n    interpolateParams?: object;\n}\n\nexport abstract class MissingTranslationHandler {\n    /**\n     * A function that handles missing translations.\n     *\n     * @param params context for resolving a missing translation\n     * @returns a value or an observable\n     *\n     * If it returns a value, then this value is used.\n     * If it returns an observable, the value returned by this observable will be used (except if the method was \"instant\").\n     * If it returns undefined, the key will be used as a value\n     */\n    abstract handle(\n        params: MissingTranslationHandlerParams,\n    ): StrictTranslation | Observable<StrictTranslation>;\n}\n\n/**\n * This handler is just a placeholder that does nothing; in case you don't need a missing translation handler at all\n */\n@Injectable()\nexport class DefaultMissingTranslationHandler implements MissingTranslationHandler {\n    handle(params: MissingTranslationHandlerParams): string {\n        return params.key;\n    }\n}\n","import { Injectable } from \"@angular/core\";\nimport { InterpolateFunction } from \"./translate.parser\";\nimport {\n    InterpolatableTranslation,\n    InterpolatableTranslationObject,\n    TranslationObject,\n} from \"./translate.service.interface\";\n\nexport abstract class TranslateCompiler {\n    abstract compile(value: string, lang: string): InterpolatableTranslation;\n\n    abstract compileTranslations(\n        translations: TranslationObject,\n        lang: string,\n    ): InterpolatableTranslationObject;\n}\n\n/**\n * This compiler is just a placeholder that does nothing; in case you don't need a compiler at all\n */\n@Injectable()\nexport class TranslateNoOpCompiler extends TranslateCompiler {\n    compile(value: string, lang: string): string | InterpolateFunction {\n        void lang;\n        return value;\n    }\n\n    compileTranslations(\n        translations: TranslationObject,\n        lang: string,\n    ): InterpolatableTranslationObject {\n        void lang;\n        return translations;\n    }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\n\nimport { TranslationObject } from \"./translate.service.interface\";\n\nexport abstract class TranslateLoader {\n    abstract getTranslation(lang: string): Observable<TranslationObject>;\n}\n\n/**\n * This loader is just a placeholder that does nothing; in case you don't need a loader at all\n */\n@Injectable()\nexport class TranslateNoOpLoader extends TranslateLoader {\n    getTranslation(lang: string): Observable<TranslationObject> {\n        void lang;\n        return of({});\n    }\n}\n","import { InterpolatableTranslationObject } from \"./translate.service.interface\";\n\n/**\n * Determines if two objects or two values are equivalent.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `equals`.\n *\n * @param o1 Object or value to compare.\n * @param o2 Object or value to compare.\n * @returns true if arguments are equal.\n */\nexport function equals(o1: unknown, o2: unknown): boolean {\n    if (o1 === o2) return true;\n    if (o1 === null || o2 === null) return false;\n    if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n\n    const t1 = typeof o1,\n        t2 = typeof o2;\n    let length: number;\n\n    if (t1 == t2 && t1 == \"object\") {\n        if (Array.isArray(o1)) {\n            if (!Array.isArray(o2)) return false;\n            if ((length = o1.length) == o2.length) {\n                for (let key = 0; key < length; key++) {\n                    if (!equals(o1[key], o2[key])) return false;\n                }\n                return true;\n            }\n        } else {\n            if (Array.isArray(o2)) {\n                return false;\n            }\n            if (isDict(o1) && isDict(o2)) {\n                const keySet = Object.create(null);\n                for (const key in o1) {\n                    if (!equals(o1[key], o2[key])) {\n                        return false;\n                    }\n                    keySet[key] = true;\n                }\n                for (const key in o2) {\n                    if (!(key in keySet) && typeof o2[key] !== \"undefined\") {\n                        return false;\n                    }\n                }\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\nexport function isDefinedAndNotNull<T>(value: T | null | undefined): value is T {\n    return typeof value !== \"undefined\" && value !== null;\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T | null {\n    return value !== undefined;\n}\n\nexport function isDict(value: unknown): value is InterpolatableTranslationObject {\n    return isObject(value) && !isArray(value) && value !== null;\n}\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n    return typeof value === \"object\" && value !== null;\n}\n\nexport function isArray(value: unknown): value is unknown[] {\n    return Array.isArray(value);\n}\n\nexport function isString(value: unknown): value is string {\n    return typeof value === \"string\";\n}\n\nexport function isFunction(value: unknown): boolean {\n    return typeof value === \"function\";\n}\n\nfunction cloneDeep(value: unknown): unknown {\n    if (isArray(value)) {\n        return value.map((item) => cloneDeep(item));\n    } else if (isDict(value)) {\n        const cloned: Record<string, unknown> = {};\n        Object.keys(value).forEach((key) => {\n            cloned[key] = cloneDeep((value as Record<string, unknown>)[key]);\n        });\n        return cloned;\n    } else {\n        return value;\n    }\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nexport function mergeDeep(target: Readonly<unknown>, source: Readonly<unknown>): any {\n    if (!isObject(target)) {\n        return cloneDeep(source);\n    }\n\n    const output = cloneDeep(target);\n\n    if (isObject(output) && isObject(source)) {\n        /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n        Object.keys(source).forEach((key: any) => {\n            if (isDict(source[key])) {\n                if (key in target) {\n                    output[key] = mergeDeep(target[key] as Readonly<unknown>, source[key]);\n                } else {\n                    Object.assign(output, { [key]: source[key] });\n                }\n            } else {\n                Object.assign(output, { [key]: source[key] });\n            }\n        });\n    }\n    return output;\n}\n\n/**\n * Retrieves a value from a nested object using a dot-separated key path.\n *\n * Example usage:\n * ```ts\n * getValue({ key1: { keyA: 'valueI' }}, 'key1.keyA'); // returns 'valueI'\n * ```\n *\n * @param target The source object from which to retrieve the value.\n * @param key Dot-separated key path specifying the value to retrieve.\n * @returns The value at the specified key path, or `undefined` if not found.\n */\nexport function getValue(target: unknown, key: string): unknown {\n    const keys = key.split(\".\");\n\n    key = \"\";\n    do {\n        key += keys.shift();\n        const isLastKey = !keys.length;\n\n        if (isDefinedAndNotNull(target)) {\n            if (\n                isDict(target) &&\n                isDefined(target[key]) &&\n                (isDict(target[key]) || isArray(target[key]) || isLastKey)\n            ) {\n                target = target[key];\n                key = \"\";\n                continue;\n            }\n\n            if (isArray(target)) {\n                if (key === \"length\" && isLastKey) {\n                    target = target.length;\n                    key = \"\";\n                    continue;\n                }\n                if (/^\\d+$/.test(key)) {\n                    const index = parseInt(key, 10);\n                    if (\n                        isDefined(target[index]) &&\n                        (isDict(target[index]) || isArray(target[index]) || isLastKey)\n                    ) {\n                        target = target[index];\n                        key = \"\";\n                        continue;\n                    }\n                }\n            }\n        }\n\n        if (isLastKey) {\n            target = undefined;\n            continue;\n        }\n        key += \".\";\n    } while (keys.length);\n\n    return target;\n}\n\n/**\n * Sets a value on object using a dot separated key.\n * Returns a clone of the object without modifying it\n * insertValue({a:{b:{c: \"test\"}}}, 'a.b.c', \"test2\") ==> {a:{b:{c: \"test2\"}}}\n * @param target an object\n * @param key E.g. \"a.b.c\"\n * @param value to set\n */\nexport function insertValue<T>(target: Readonly<T>, key: string, value: unknown): T {\n    return mergeDeep(target, createNestedObject(key, value) as Readonly<unknown>);\n}\n\nfunction createNestedObject(\n    dotSeparatedKey: string,\n    value: unknown,\n): Record<string, unknown> | unknown {\n    return dotSeparatedKey.split(\".\").reduceRight<unknown>((acc, key) => ({ [key]: acc }), value);\n}\n","import { Injectable } from \"@angular/core\";\nimport { getValue, isArray, isFunction, isObject, isString } from \"./util\";\nimport { InterpolationParameters } from \"./translate.service.interface\";\n\nexport type InterpolateFunction = (params?: InterpolationParameters) => string;\n\nexport abstract class TranslateParser {\n    /**\n     * Interpolates a string to replace parameters\n     * \"This is a {{ key }}\" ==> \"This is a value\", with params = { key: \"value\" }\n     * @param expr\n     * @param params\n     */\n    abstract interpolate(\n        expr: InterpolateFunction | string,\n        params?: InterpolationParameters,\n    ): string | undefined;\n}\n\n@Injectable()\nexport class TranslateDefaultParser extends TranslateParser {\n    templateMatcher = /{{\\s?([^{}\\s]*)\\s?}}/g;\n\n    public interpolate(\n        expr: InterpolateFunction | string,\n        params?: InterpolationParameters,\n    ): string | undefined {\n        if (isString(expr)) {\n            return this.interpolateString(expr as string, params);\n        } else if (isFunction(expr)) {\n            return this.interpolateFunction(expr as InterpolateFunction, params);\n        }\n        return undefined;\n    }\n\n    protected interpolateFunction(\n        fn: InterpolateFunction,\n        params?: InterpolationParameters,\n    ): string {\n        return fn(params);\n    }\n\n    protected interpolateString(expr: string, params?: InterpolationParameters): string {\n        if (!params) {\n            return expr;\n        }\n\n        return expr.replace(this.templateMatcher, (substring: string, key: string) => {\n            const replacement = this.getInterpolationReplacement(params, key);\n            return replacement !== undefined ? replacement : substring;\n        });\n    }\n\n    /**\n     * Returns the replacement for an interpolation parameter\n     * @params:\n     */\n    protected getInterpolationReplacement(\n        params: InterpolationParameters,\n        key: string,\n    ): string | undefined {\n        return this.formatValue(getValue(params, key));\n    }\n\n    /**\n     * Converts a value into a useful string representation.\n     * @param value The value to format.\n     * @returns A string representation of the value.\n     */\n    protected formatValue(value: unknown): string | undefined {\n        if (isString(value)) {\n            return value;\n        }\n        if (typeof value === \"number\" || typeof value === \"boolean\") {\n            return value.toString();\n        }\n        if (value === null) {\n            return \"null\";\n        }\n        if (isArray(value)) {\n            return value.join(\", \");\n        }\n        if (isObject(value)) {\n            if (\n                typeof value.toString === \"function\" &&\n                value.toString !== Object.prototype.toString\n            ) {\n                return value.toString();\n            }\n            return JSON.stringify(value); // Pretty-print JSON if no meaningful toString()\n        }\n\n        return undefined;\n    }\n}\n","import { DestroyRef, Injectable, Signal, inject, signal } from \"@angular/core\";\nimport { Observable, Subject } from \"rxjs\";\nimport { getValue, mergeDeep } from \"./util\";\nimport {\n    InterpolatableTranslation,\n    InterpolatableTranslationObject,\n    Language,\n    TranslationChangeEvent,\n} from \"./translate.service.interface\";\n\nexport type DeepReadonly<T> = {\n    readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];\n};\n\n@Injectable()\nexport class TranslateStore {\n    private readonly _translations = signal<Record<Language, InterpolatableTranslationObject>>({});\n    readonly translations: Signal<Record<Language, InterpolatableTranslationObject>> =\n        this._translations.asReadonly();\n\n    private readonly _languages = signal<Language[]>([]);\n    readonly languages: Signal<Language[]> = this._languages.asReadonly();\n\n    private readonly _lastTranslationChange = signal<TranslationChangeEvent | null>(null);\n    readonly lastTranslationChange: Signal<TranslationChangeEvent | null> =\n        this._lastTranslationChange.asReadonly();\n\n    private readonly _translationChange$ = new Subject<TranslationChangeEvent>();\n    readonly translationChange$: Observable<TranslationChangeEvent> =\n        this._translationChange$.asObservable();\n\n    constructor() {\n        // Complete the Subject when the owning injector tears down. Without\n        // this, child-service stores on lazy routes leak `translationChange$`\n        // subscribers across navigations.\n        inject(DestroyRef).onDestroy(() => {\n            this._translationChange$.complete();\n        });\n    }\n\n    public getTranslations(language: Language): DeepReadonly<InterpolatableTranslationObject> {\n        return this.translations()[language];\n    }\n\n    public setTranslations(\n        language: Language,\n        translations: InterpolatableTranslationObject,\n        extend: boolean,\n    ): void {\n        this._translations.update((current) => ({\n            ...current,\n            [language]:\n                extend && this.hasTranslationFor(language)\n                    ? mergeDeep(current[language], translations)\n                    : translations,\n        }));\n        this.addLanguages([language]);\n        const event: TranslationChangeEvent = {\n            lang: language,\n            translations: this.getTranslations(language),\n        };\n        this._lastTranslationChange.set(event);\n        this._translationChange$.next(event);\n    }\n\n    public getLanguages(): readonly Language[] {\n        return this.languages();\n    }\n\n    public addLanguages(langs: Language[]): void {\n        this._languages.update((current) => Array.from(new Set([...current, ...langs])));\n    }\n\n    public hasTranslationFor(lang: string) {\n        return typeof this.translations()[lang] !== \"undefined\";\n    }\n\n    public deleteTranslations(lang: string) {\n        this._translations.update((current) => {\n            const { [lang]: _, ...rest } = current;\n            return rest;\n        });\n    }\n\n    public getTranslationValue(language: Language, key: string): InterpolatableTranslation {\n        return getValue(this.getTranslations(language), key) as InterpolatableTranslation;\n    }\n}\n","import {\n    computed,\n    DestroyRef,\n    inject,\n    Injectable,\n    InjectionToken,\n    Signal,\n    signal,\n    untracked,\n    WritableSignal,\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport {\n    concat,\n    defer,\n    EMPTY,\n    finalize,\n    forkJoin,\n    isObservable,\n    merge,\n    Observable,\n    of,\n    Subject,\n    tap,\n} from \"rxjs\";\nimport { concatMap, filter, map, shareReplay, switchMap, take } from \"rxjs/operators\";\nimport { LoadingTranslationsRegistry } from \"./loading-translations-registry\";\nimport { MissingTranslationHandler } from \"./missing-translation-handler\";\nimport { TranslateCompiler } from \"./translate.compiler\";\nimport { TranslateLoader } from \"./translate.loader\";\nimport { TranslateParser } from \"./translate.parser\";\nimport { DeepReadonly, TranslateStore } from \"./translate.store\";\nimport { insertValue, isArray, isDefinedAndNotNull, isDict, isString } from \"./util\";\nimport {\n    FallbackLangChangeEvent,\n    InterpolatableTranslation,\n    InterpolatableTranslationObject,\n    InterpolationParameters,\n    ITranslateService,\n    LangChangeEvent,\n    Language,\n    StrictTranslation,\n    Translation,\n    TranslationChangeEvent,\n    TranslationObject,\n} from \"./translate.service.interface\";\n\n/**\n * Configuration object for the translation service.\n *\n * Provides options to customize translation behavior, including setting the primary language,\n * specifying a fallback language, and other deprecated flags for legacy support.\n */\nexport interface TranslateServiceConfig {\n    lang?: Language;\n    fallbackLang?: Language | null;\n    isRoot: boolean;\n}\n\nexport const TRANSLATE_SERVICE_CONFIG = new InjectionToken<TranslateServiceConfig>(\n    \"TRANSLATE_CONFIG\",\n);\n\ndeclare interface Window {\n    navigator: {\n        languages?: string[];\n        language?: string;\n        browserLanguage?: string;\n        userLanguage?: string;\n    };\n}\n\ndeclare const window: Window;\n\nconst makeObservable = <T>(value: T | Observable<T>): Observable<T> => {\n    return isObservable(value) ? value : of(value);\n};\n\n@Injectable()\nexport class TranslateService implements ITranslateService {\n    protected readonly loadingTranslations = new LoadingTranslationsRegistry();\n    protected lastUseLanguage: Language | null = null;\n\n    protected currentLoader = inject(TranslateLoader);\n    protected compiler = inject(TranslateCompiler);\n    protected parser = inject(TranslateParser);\n    protected missingTranslationHandler = inject(MissingTranslationHandler);\n    protected store: TranslateStore = inject(TranslateStore);\n    private readonly destroyRef = inject(DestroyRef);\n\n    protected readonly parent: TranslateService | null;\n\n    protected get isRoot(): boolean {\n        return this.parent === null;\n    }\n\n    protected _onLangChange = new Subject<LangChangeEvent>();\n    protected _onFallbackLangChange = new Subject<FallbackLangChangeEvent>();\n    protected _currentLang: WritableSignal<Language | null> = signal(null);\n    protected _fallbackLang: WritableSignal<Language | null> = signal(null);\n    private _onTranslationRefresh: Observable<void> | null = null;\n\n    // Downward-inheritance: `true` if THIS service has loads in flight, OR any\n    // ancestor does. Walks the parent chain via the public `parent.isLoading()`\n    // getter (not by reaching into `parent.loadingTranslations`) so the\n    // encapsulation boundary holds. Angular signals re-collect dependencies on\n    // each evaluation; short-circuit is safe — the only signal whose flip\n    // could change the result is the one returned by short-circuit, and it IS\n    // tracked. Parent chain is acyclic (DI tree is acyclic; `skipSelf` only\n    // walks up), so no cycle guard needed.\n    //\n    // Set-based composition at each level: `loadingTranslations.hasAny()`\n    // stays true while ANY language has an in-flight load on this service,\n    // flips false only when the last entry is cleared.\n    private _isLoading: Signal<boolean> = computed(\n        () => this.loadingTranslations.hasAny() || (this.parent?.isLoading() ?? false),\n    );\n\n    /**\n     * Returns the root of this service's hierarchy — the topmost service in\n     * the `getParent()` chain. For an isolated subtree, returns the subtree's\n     * root (since `parent === null` at the isolation boundary).\n     *\n     * A root service returns itself. Equivalent to walking `getParent()` until\n     * it returns `null`, but provided as a convenience.\n     */\n    public getRoot(): TranslateService {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        let svc: TranslateService = this;\n        while (svc.parent) svc = svc.parent;\n        return svc;\n    }\n\n    /**\n     * Returns the service this one inherits translations from, or `null` if\n     * this is a root (a top-level service or an isolated subtree root).\n     *\n     * A `null` return means the service is the terminus of its translation\n     * fallback chain — equivalent to \"is this a root?\".\n     */\n    public getParent(): TranslateService | null {\n        return this.parent;\n    }\n\n    /**\n     * The language most recently requested via `use()`. Always read from the\n     * root, because `use()` delegates to the root (`parent!.use(lang)`) and only\n     * the root ever assigns `lastUseLanguage`. A child's own `lastUseLanguage`\n     * stays `null`, so reading it directly would make `get()` miss the child's\n     * in-flight load. `null` until the first `use()` runs.\n     */\n    protected getActiveRequestedLang(): Language | null {\n        return this.getRoot().lastUseLanguage;\n    }\n\n    protected hasTranslationInChain(lang: Language): boolean {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        for (let svc: TranslateService | null = this; svc; svc = svc.parent) {\n            if (svc.store.hasTranslationFor(lang)) return true;\n        }\n        return false;\n    }\n\n    protected chainTranslationChange$(): Observable<TranslationChangeEvent> {\n        const streams: Observable<TranslationChangeEvent>[] = [];\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        for (let svc: TranslateService | null = this; svc; svc = svc.parent) {\n            streams.push(svc.store.translationChange$);\n        }\n        return streams.length === 1 ? streams[0] : merge(...streams);\n    }\n\n    /**\n     * An Observable to listen to translation change events\n     * onTranslationChange.subscribe((params: TranslationChangeEvent) => {\n     *     // do something\n     * });\n     */\n    public get onTranslationChange(): Observable<TranslationChangeEvent> {\n        return this.store.translationChange$;\n    }\n\n    /**\n     * An Observable to listen to lang change events\n     * onLangChange.subscribe((params: LangChangeEvent) => {\n     *     // do something\n     * });\n     */\n    get onLangChange(): Observable<LangChangeEvent> {\n        if (this.isRoot) {\n            return this._onLangChange.asObservable();\n        }\n        return this.parent ? this.parent.onLangChange : EMPTY;\n    }\n\n    /**\n     * An Observable to listen to fallback lang change events\n     * onFallbackLangChange.subscribe((params: FallbackLangChangeEvent) => {\n     *     // do something\n     * });\n     */\n    get onFallbackLangChange(): Observable<FallbackLangChangeEvent> {\n        if (this.isRoot) {\n            return this._onFallbackLangChange.asObservable();\n        }\n        return this.parent ? this.parent.onFallbackLangChange : EMPTY;\n    }\n\n    /**\n     * A combined Observable that emits whenever translations might need to be refreshed.\n     * This includes: language changes, translation updates for the current or fallback language,\n     * and fallback language changes.\n     */\n    get onTranslationRefresh(): Observable<void> {\n        if (!this._onTranslationRefresh) {\n            const refresh$ = merge(\n                this.onTranslationChange.pipe(\n                    filter(\n                        (event) =>\n                            event.lang === this.getCurrentLang() ||\n                            event.lang === this.getFallbackLang(),\n                    ),\n                ),\n                this.onLangChange,\n                this.onFallbackLangChange,\n            ).pipe(map(() => void 0));\n\n            if (this.isRoot) {\n                this._onTranslationRefresh = refresh$;\n            } else {\n                this._onTranslationRefresh = this.parent\n                    ? merge(refresh$, this.parent.onTranslationRefresh)\n                    : refresh$;\n            }\n        }\n        return this._onTranslationRefresh;\n    }\n\n    constructor() {\n        const config: TranslateServiceConfig = {\n            isRoot: true,\n            fallbackLang: null,\n\n            ...inject<TranslateServiceConfig>(TRANSLATE_SERVICE_CONFIG, {\n                optional: true,\n            }),\n        };\n\n        // parent === null exactly means \"I am a root\" (including isolated-subtree roots).\n        // isRoot is now a getter derived from this single source of truth.\n        this.parent = config.isRoot\n            ? null\n            : inject(TranslateService, { optional: true, skipSelf: true });\n\n        const destroyRef = inject(DestroyRef);\n\n        if (this.isRoot) {\n            if (config.lang) {\n                this.use(config.lang);\n            }\n            if (config.fallbackLang) {\n                this.setFallbackLang(config.fallbackLang);\n            }\n        } else {\n            // Child services should initially load the root's current and fallback languages.\n            // Loader failures are warned contextually here — the internal no-op subscribe\n            // inside loadAndCompileTranslations would otherwise swallow them silently.\n            // Best-effort: takeUntilDestroyed tears down the subscription on host destroy,\n            // so a destroy-then-error race silently drops the warn.\n            const currentLang = this.getCurrentLang();\n            if (currentLang) {\n                this.loadOrExtendLanguage(currentLang)\n                    ?.pipe(takeUntilDestroyed(destroyRef))\n                    .subscribe({\n                        error: (err) => {\n                            console.warn(\n                                `@ngx-translate/core: child failed to load \"${currentLang}\". Cause:`,\n                                err,\n                            );\n                        },\n                    });\n            }\n            const fallbackLang = this.getFallbackLang();\n            // Dedup guard: currentLang === fallbackLang means both branches would\n            // resolve to the same in-flight observable (via the loading-translations\n            // registry's get-or-create) and double-log on error.\n            if (fallbackLang && fallbackLang !== currentLang) {\n                this.loadOrExtendLanguage(fallbackLang)\n                    ?.pipe(takeUntilDestroyed(destroyRef))\n                    .subscribe({\n                        error: (err) => {\n                            console.warn(\n                                `@ngx-translate/core: child failed to load \"${fallbackLang}\". Cause:`,\n                                err,\n                            );\n                        },\n                    });\n            }\n        }\n\n        // Child services should load translations when the language changes on the root\n        this.onLangChange.pipe(takeUntilDestroyed(destroyRef)).subscribe((event) => {\n            if (!this.isRoot) {\n                this.loadOrExtendLanguage(event.lang)\n                    ?.pipe(takeUntilDestroyed(destroyRef))\n                    .subscribe({\n                        error: (err) => {\n                            console.warn(\n                                `@ngx-translate/core: child failed to load \"${event.lang}\". Cause:`,\n                                err,\n                            );\n                        },\n                    });\n            }\n        });\n\n        this.onFallbackLangChange.pipe(takeUntilDestroyed(destroyRef)).subscribe((event) => {\n            if (!this.isRoot) {\n                this.loadOrExtendLanguage(event.lang)\n                    ?.pipe(takeUntilDestroyed(destroyRef))\n                    .subscribe({\n                        error: (err) => {\n                            console.warn(\n                                `@ngx-translate/core: child failed to load \"${event.lang}\". Cause:`,\n                                err,\n                            );\n                        },\n                    });\n            }\n        });\n\n        // Complete this service's Subjects when its injector tears down.\n        // Root singletons live as long as the app, but child services on\n        // lazy routes would otherwise pin their Subjects until GC.\n        destroyRef.onDestroy(() => {\n            this._onLangChange.complete();\n            this._onFallbackLangChange.complete();\n        });\n    }\n\n    /**\n     * Sets the fallback language to use if a translation is not found in the\n     * current language\n     */\n    public setFallbackLang(lang: Language): Observable<InterpolatableTranslationObject> {\n        if (!this.isRoot) {\n            return this.parent!.setFallbackLang(lang);\n        }\n\n        if (!this._fallbackLang()) {\n            // on init set the fallbackLang immediately, but do not emit a change yet\n            this._fallbackLang.set(lang);\n        }\n\n        const pending = this.loadOrExtendLanguage(lang);\n        if (isObservable(pending)) {\n            pending.pipe(take(1)).subscribe({\n                next: () => {\n                    this._fallbackLang.set(lang);\n                    this._onFallbackLangChange.next({\n                        lang: lang,\n                        translations: this.store.getTranslations(lang),\n                    });\n                },\n                error: (err) => {\n                    console.warn(\n                        `@ngx-translate/core: failed to load fallback \"${lang}\". Cause:`,\n                        err,\n                    );\n                },\n            });\n            return pending;\n        }\n\n        this._fallbackLang.set(lang);\n        this._onFallbackLangChange.next({\n            lang: lang,\n            translations: this.store.getTranslations(lang),\n        });\n        return of(this.store.getTranslations(lang));\n    }\n\n    /**\n     * Signal that is `true` while one or more language loads are in flight at\n     * this service or any of its ancestors in the service hierarchy.\n     *\n     * Loading scope propagates DOWNWARD: a load triggered at the root marks\n     * the root and all descendants as loading. A load triggered at a child\n     * (e.g. a lazy-route bootstrap fetching its translations) marks only that\n     * child's subtree. Siblings and ancestors are unaffected by a descendant's\n     * loads.\n     *\n     * Drive a spinner by reading it from the service injected at the scope\n     * where the spinner should live: root for an app-shell spinner, the\n     * nearest child for a local spinner inside a lazy-loaded subtree.\n     */\n    public get isLoading(): Signal<boolean> {\n        return this._isLoading;\n    }\n\n    /**\n     * Changes the lang currently used\n     */\n    public use(lang: Language): Observable<InterpolatableTranslationObject> {\n        if (!this.isRoot) {\n            return this.parent!.use(lang);\n        }\n\n        // Snapshot prior state so we can roll back if the loader fails.\n        const prevLang = this._currentLang();\n        const prevLastUseLang = this.lastUseLanguage;\n\n        // Remember the language that was called — used by changeLang() to discard\n        // late-arriving completions from superseded calls.\n        this.lastUseLanguage = lang;\n\n        if (!this._currentLang()) {\n            // on init set the currentLang immediately, but do not emit a change yet\n            this._currentLang.set(lang);\n        }\n\n        const pending = this.loadOrExtendLanguage(lang);\n        if (!isObservable(pending)) {\n            // Defensive: loadOrExtendLanguage is typed `Observable | undefined`.\n            // The undefined branch means \"nothing to load\" — synchronously activate.\n            this.changeLang(lang);\n            return of(this.store.getTranslations(lang));\n        }\n\n        pending.pipe(take(1)).subscribe({\n            next: () => {\n                this.changeLang(lang);\n            },\n            error: (err) => {\n                // Only roll back if THIS call is still the most-recent one.\n                // A later use() may have superseded it (symmetric with the\n                // changeLang() guard).\n                if (this.lastUseLanguage === lang) {\n                    this._currentLang.set(prevLang);\n                    this.lastUseLanguage = prevLastUseLang;\n                }\n                console.warn(\n                    `@ngx-translate/core: failed to load \"${lang}\". ` +\n                        `currentLang was NOT changed; remains ` +\n                        `\"${prevLang ?? \"null\"}\". Cause:`,\n                    err,\n                );\n            },\n        });\n        return pending;\n    }\n\n    /**\n     * Retrieves the given translations\n     */\n    protected loadOrExtendLanguage(\n        lang: Language,\n    ): Observable<InterpolatableTranslationObject> | undefined {\n        // if this language is unavailable, ask for it\n        if (!this.store.hasTranslationFor(lang)) {\n            return this.loadAndCompileTranslations(lang);\n        }\n\n        return of(this.store.getTranslations(lang));\n    }\n\n    /**\n     * @returns The loaded translations for the given language\n     */\n    public getTranslations(language: Language): DeepReadonly<InterpolatableTranslationObject> {\n        return this.store.getTranslations(language);\n    }\n\n    /**\n     * Changes the current lang\n     */\n    protected changeLang(lang: Language): void {\n        if (lang !== this.lastUseLanguage) {\n            // received new language data,\n            // but this was not the one requested last\n            return;\n        }\n\n        this._currentLang.set(lang);\n        this._onLangChange.next({ lang: lang, translations: this.store.getTranslations(lang) });\n    }\n\n    public getCurrentLang(): Language | null {\n        return this.isRoot ? this._currentLang() : (this.parent?.getCurrentLang() ?? null);\n    }\n\n    /**\n     * Loads translations for `lang` via the configured `TranslateLoader`,\n     * compiles them, and stores the result. Tracking via the protected\n     * `loadingTranslations` registry happens automatically.\n     *\n     * Subclasses that override this method bypass `isLoading` tracking\n     * unless they call `this.loadingTranslations.set(lang, obs)` and arrange\n     * a token-aware finalize (`this.loadingTranslations.clearIfOwner(lang, obs)`)\n     * from the override.\n     */\n    protected loadAndCompileTranslations(\n        lang: Language,\n    ): Observable<InterpolatableTranslationObject> {\n        const existing = this.loadingTranslations.get(lang);\n        if (existing) {\n            return existing;\n        }\n\n        const translations$ = this.currentLoader.getTranslation(lang).pipe(\n            map((res: TranslationObject) => this.compiler.compileTranslations(res, lang)),\n            tap((compiled: InterpolatableTranslationObject) => {\n                this.store.setTranslations(lang, compiled, false);\n                // Clear synchronously on success — this `tap` runs before\n                // `shareReplay` forwards `next` to subscribers, so subscribers\n                // receiving `next` observe `isLoading()` reflecting that this\n                // language is no longer in flight. The finalize below covers\n                // error / sync-throw / unsubscribe paths; clearIfOwner is\n                // idempotent so the double-clear on success is a safe no-op.\n                // Invariant: `tap` MUST stay before `shareReplay` in the pipe.\n                this.loadingTranslations.clearIfOwner(lang, translations$);\n            }),\n            // Token-aware clear: if `resetLang` + `reloadLang` raced between\n            // set() and finalize(), this load's finalize must NOT clobber the\n            // newer load's entry. clearIfOwner compares by reference identity.\n            finalize(() => this.loadingTranslations.clearIfOwner(lang, translations$)),\n            // cache the single result & share it across all subscribers\n            shareReplay({ bufferSize: 1, refCount: true }),\n        );\n\n        this.loadingTranslations.set(lang, translations$);\n\n        // Trigger loading if nobody subscribes from outside. The error callback\n        // is intentionally a no-op: use() and setFallbackLang() already emit a\n        // console.warn on loader failure for their own paths. Warning here\n        // would double-log for those callers. Bound to the service lifetime so a\n        // non-completing/hot custom loader cannot pin this subscription (and the\n        // upstream loader subscription) past service teardown.\n        translations$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n            // eslint-disable-next-line @typescript-eslint/no-empty-function\n            error: () => {},\n        });\n\n        return translations$;\n    }\n\n    /**\n     * Manually sets an object of translations for a given language,\n     * passing it through the configured {@link TranslateCompiler} first.\n     *\n     * If you already have translations in their final compiled form\n     * (e.g. interpolation functions produced at build time), use\n     * {@link setCompiledTranslation} instead — it stores the data\n     * directly and skips the compiler.\n     */\n    public setTranslation(\n        lang: Language,\n        translations: TranslationObject,\n        shouldMerge = false,\n    ): void {\n        const interpolatableTranslations: InterpolatableTranslationObject =\n            this.compiler.compileTranslations(translations, lang);\n        this.store.setTranslations(lang, interpolatableTranslations, shouldMerge);\n    }\n\n    /**\n     * Stores an already-compiled translation object for the given language,\n     * bypassing the configured {@link TranslateCompiler}.\n     *\n     * Use this when you have translations in their final, interpolator-ready\n     * form — e.g. interpolation functions produced at build time. For raw\n     * translations that still need to go through the compiler, use\n     * {@link setTranslation} instead.\n     */\n    public setCompiledTranslation(\n        lang: Language,\n        translations: InterpolatableTranslationObject,\n        shouldMerge = false,\n    ): void {\n        this.store.setTranslations(lang, translations, shouldMerge);\n    }\n\n    public getLangs(): readonly Language[] {\n        return this.store.getLanguages();\n    }\n\n    /**\n     * Add available languages\n     */\n    public addLangs(languages: Language[]): void {\n        this.store.addLanguages(languages);\n    }\n\n    protected getParsedResultForKey(\n        key: string,\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): StrictTranslation | Observable<StrictTranslation> {\n        const textToInterpolate = this.getTextToInterpolate(key, lang);\n\n        if (isDefinedAndNotNull(textToInterpolate)) {\n            return this.runInterpolation(textToInterpolate, interpolateParams);\n        }\n\n        const handler = this.getMissingTranslationHandler();\n        const res = handler.handle({\n            key,\n            translateService: this,\n            ...(interpolateParams !== undefined && { interpolateParams }),\n        });\n\n        return res !== undefined ? res : key;\n    }\n\n    protected getMissingTranslationHandler(): MissingTranslationHandler {\n        return this.missingTranslationHandler;\n    }\n\n    /**\n     * Gets the fallback language. null if none is defined\n     */\n    public getFallbackLang(): Language | null {\n        return this.isRoot ? this._fallbackLang() : (this.parent?.getFallbackLang() ?? null);\n    }\n\n    protected getTextToInterpolate(\n        key: string,\n        lang?: Language,\n    ): InterpolatableTranslation | undefined {\n        if (lang) {\n            const res = this.store.getTranslationValue(lang, key);\n            if (res !== undefined) {\n                return res;\n            }\n            return this.parent?.getTextToInterpolate(key, lang);\n        }\n\n        const currentLang = this.getCurrentLang();\n        const fallbackLang = this.getFallbackLang();\n\n        // 1. Try own store (currentLang)\n        let res: InterpolatableTranslation | undefined;\n        if (currentLang) {\n            res = this.store.getTranslationValue(currentLang, key);\n        }\n\n        // 2. Try own store (fallbackLang) - null values also trigger fallback\n        if (!isDefinedAndNotNull(res) && fallbackLang && fallbackLang !== currentLang) {\n            res = this.store.getTranslationValue(fallbackLang, key);\n        }\n\n        if (res !== undefined) {\n            return res;\n        }\n\n        // 3. Try parent\n        return this.parent?.getTextToInterpolate(key);\n    }\n\n    protected runInterpolation(\n        translations: InterpolatableTranslation,\n        interpolateParams?: InterpolationParameters,\n    ): StrictTranslation {\n        if (!isDefinedAndNotNull(translations)) {\n            return;\n        }\n\n        if (isArray(translations)) {\n            return this.runInterpolationOnArray(translations, interpolateParams);\n        }\n\n        if (isDict(translations)) {\n            return this.runInterpolationOnDict(translations, interpolateParams);\n        }\n\n        return this.parser.interpolate(translations, interpolateParams);\n    }\n\n    protected runInterpolationOnArray(\n        translations: InterpolatableTranslation,\n        interpolateParams: InterpolationParameters | undefined,\n    ) {\n        return (translations as StrictTranslation[]).map((translation) =>\n            this.runInterpolation(translation, interpolateParams),\n        );\n    }\n\n    protected runInterpolationOnDict(\n        translations: InterpolatableTranslationObject,\n        interpolateParams: InterpolationParameters | undefined,\n    ) {\n        const result: TranslationObject = {};\n        for (const key in translations) {\n            const res = this.runInterpolation(translations[key], interpolateParams);\n            if (res !== undefined) {\n                result[key] = res;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Returns the parsed result of the translations\n     */\n    public getParsedResult(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): StrictTranslation | Observable<StrictTranslation> {\n        return key instanceof Array\n            ? this.getParsedResultForArray(key, interpolateParams, lang)\n            : this.getParsedResultForKey(key, interpolateParams, lang);\n    }\n\n    protected getParsedResultForArray(\n        key: string[],\n        interpolateParams: InterpolationParameters | undefined,\n        lang?: Language,\n    ) {\n        const result: Record<string, StrictTranslation | Observable<StrictTranslation>> = {};\n\n        let observables = false;\n        for (const k of key) {\n            result[k] = this.getParsedResultForKey(k, interpolateParams, lang);\n            observables = observables || isObservable(result[k]);\n        }\n\n        if (!observables) {\n            return result as TranslationObject;\n        }\n\n        const sources: Observable<StrictTranslation>[] = key.map((k) => makeObservable(result[k]));\n        return forkJoin(sources).pipe(\n            map((arr: StrictTranslation[]) => {\n                const obj: TranslationObject = {};\n                arr.forEach((value: StrictTranslation, index: number) => {\n                    obj[key[index]] = value;\n                });\n                return obj;\n            }),\n        );\n    }\n\n    /**\n     * Gets the translated value of a key (or an array of keys)\n     * @returns the translated key, or an object of translated keys\n     */\n    public get(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Observable<Translation> {\n        if (!isDefinedAndNotNull(key) || !key.length) {\n            return of(\"\");\n        }\n\n        // check if we are loading a new translation to use.\n        // Use the ROOT's last-requested language (not this service's own\n        // lastUseLanguage, which a child never sets) so a child's in-flight\n        // load is found in its registry; fall back to the current language when\n        // no use() has run yet.\n        const effectiveLang = lang ?? this.getActiveRequestedLang() ?? this.getCurrentLang();\n        const pending = effectiveLang ? this.loadingTranslations.get(effectiveLang) : undefined;\n        if (pending) {\n            return pending.pipe(\n                concatMap(() => {\n                    return makeObservable(this.getParsedResult(key, interpolateParams, lang));\n                }),\n            );\n        }\n\n        return makeObservable(this.getParsedResult(key, interpolateParams, lang));\n    }\n\n    /**\n     * Returns a stream of translated values of a key (or an array of keys) which updates\n     * whenever the translation changes.\n     * @returns A stream of the translated key, or an object of translated keys\n     */\n    public getStreamOnTranslationChange(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Observable<Translation> {\n        if (!isDefinedAndNotNull(key) || !key.length) {\n            throw new Error(`Parameter \"key\" is required and cannot be empty`);\n        }\n\n        return concat(\n            defer(() => this.get(key, interpolateParams, lang)),\n            this.onTranslationChange.pipe(\n                switchMap(() => {\n                    const res = this.getParsedResult(key, interpolateParams, lang);\n                    return makeObservable(res);\n                }),\n            ),\n        );\n    }\n\n    /**\n     * Returns a stream of translated values of a key (or an array of keys) which updates\n     * whenever the language changes, the requested language's translations are\n     * (re)loaded, or the explicitly-requested `lang` argument's translations change.\n     *\n     * Without `lang`: re-emits on `onLangChange` (active-language switches via\n     * {@link use}). With `lang`: also re-emits when translations for that specific\n     * language are loaded or updated via `store.translationChange$`, so an\n     * explicit `stream(\"KEY\", undefined, \"de\")` updates once \"de\" finishes\n     * loading.\n     *\n     * @returns A stream of the translated key, or an object of translated keys\n     */\n    public stream(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Observable<Translation> {\n        if (!isDefinedAndNotNull(key) || !key.length) {\n            throw new Error(`Parameter \"key\" required`);\n        }\n\n        const reemit$: Observable<unknown> = lang\n            ? merge(\n                  this.onLangChange,\n                  this.chainTranslationChange$().pipe(filter((e) => e.lang === lang)),\n              )\n            : this.onLangChange;\n\n        return concat(\n            defer(() => this.get(key, interpolateParams, lang)),\n            reemit$.pipe(\n                switchMap(() => {\n                    const res = this.getParsedResult(key, interpolateParams, lang);\n                    return makeObservable(res);\n                }),\n            ),\n        );\n    }\n\n    /**\n     * Returns a translation instantly from the internal state of loaded translation.\n     * All rules regarding the current language, the preferred language of even fallback languages\n     * will be used except any promise handling.\n     *\n     * When `lang` is provided, the lookup goes directly to the specified language,\n     * bypassing the current language and fallback chain.\n     */\n    public instant(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Translation {\n        if (!isDefinedAndNotNull(key) || key.length === 0) {\n            return \"\";\n        }\n\n        if (lang && !this.hasTranslationInChain(lang)) {\n            this.warnUnloadedInstantLang(lang);\n        }\n\n        const result = this.getParsedResult(key, interpolateParams, lang);\n\n        return isObservable(result) ? this.keyToObject(key) : result;\n    }\n\n    private warnedUnloadedInstantLangs = new Set<Language>();\n    private warnUnloadedInstantLang(lang: Language): void {\n        // Delegate to the root so the warn budget is shared across the isolated\n        // subtree. With parent === null at isolated boundaries, getRoot() stops\n        // at the right place — one warn per (isolated subtree, lang) pair.\n        const root = this.getRoot();\n        if (root !== this) {\n            root.warnUnloadedInstantLang(lang);\n            return;\n        }\n        if (this.warnedUnloadedInstantLangs.has(lang)) return;\n        // instant() runs inside the translate() computed; keep the Set write and\n        // console.warn out of the reactive graph so they never register as a\n        // producer during signal evaluation.\n        untracked(() => {\n            this.warnedUnloadedInstantLangs.add(lang);\n            console.warn(\n                `@ngx-translate/core: instant() called with lang=\"${lang}\" but no ` +\n                    `translations are loaded for that language. Returning the key as ` +\n                    `fallback. Load with use(\"${lang}\") or setTranslation(\"${lang}\", ...) first.`,\n            );\n        });\n    }\n\n    /**\n     * Returns a Signal that provides the translated value and automatically\n     * updates when the language changes or translations are reloaded.\n     *\n     * Parameters accept plain values or arrow functions. Signal reads inside\n     * the function are tracked reactively. Signals themselves are also\n     * accepted directly, since Signal<T> is callable.\n     *\n     * @param key The translation key (or array of keys), a function returning one\n     * @param params Optional interpolation parameters, or a function returning them\n     * @param lang Optional language override, or a function returning one\n     * @returns A Signal that emits the translated value(s)\n     *\n     * @example\n     * // Static key\n     * greeting = this.translate.translate('HELLO');\n     *\n     * @example\n     * // Derived key from another signal (no separate computed needed)\n     * model = signal({ currentKey: 'HELLO' });\n     * greeting = this.translate.translate(() => this.model().currentKey);\n     *\n     * @example\n     * // Multi-key lookup\n     * labels = this.translate.translate(['SAVE', 'CANCEL']);\n     */\n    public translate(\n        key: string | string[] | (() => string | string[]),\n        params?: InterpolationParameters | (() => InterpolationParameters | undefined),\n        lang?: Language | (() => Language | undefined),\n    ): Signal<Translation | TranslationObject> {\n        return computed(() => {\n            const currentKey = typeof key === \"function\" ? key() : key;\n            const currentParams = typeof params === \"function\" ? params() : params;\n            const currentLang = typeof lang === \"function\" ? lang() : lang;\n\n            return this.instant(currentKey, currentParams, currentLang);\n        });\n    }\n\n    protected keyToObject(key: string | string[]) {\n        if (Array.isArray(key)) {\n            return key.reduce((acc: Record<string, string>, currKey: string) => {\n                acc[currKey] = currKey;\n                return acc;\n            }, {});\n        }\n        return key;\n    }\n\n    /**\n     * Sets the translated value of a key, after compiling it\n     */\n    public set(\n        key: string,\n        translation: string | TranslationObject,\n        lang: Language = this.getCurrentLang()!,\n    ): void {\n        this.store.setTranslations(\n            lang,\n            insertValue(\n                this.store.getTranslations(lang),\n                key,\n                isString(translation)\n                    ? this.compiler.compile(translation, lang)\n                    : this.compiler.compileTranslations(translation, lang),\n            ),\n            false,\n        );\n    }\n\n    /**\n     * Allows reloading the lang file from the file\n     */\n    public reloadLang(lang: Language): Observable<InterpolatableTranslationObject> {\n        this.resetLang(lang);\n        return this.loadAndCompileTranslations(lang);\n    }\n\n    /**\n     * Deletes stored translations for `lang` and clears the in-flight registry\n     * entry — `isLoading()` flips to `false` immediately on this service.\n     *\n     * Does NOT cancel the underlying network call: if the loader is mid-flight\n     * when this method returns, the request can still complete and `tap()`\n     * translations back into the store. To replace state and re-fetch\n     * deterministically, follow with `reloadLang(lang)`.\n     */\n    public resetLang(lang: Language): void {\n        // Unconditional clear — `resetLang`'s contract is \"forget this entry\n        // NOW\", regardless of which load owns it.\n        this.loadingTranslations.clear(lang);\n        this.store.deleteTranslations(lang);\n    }\n\n    /**\n     * Returns the language code name from the browser, e.g. \"de\"\n     */\n    public static getBrowserLang(): Language | undefined {\n        if (typeof window === \"undefined\" || !window.navigator) {\n            return undefined;\n        }\n\n        const browserLang = this.getBrowserCultureLang();\n\n        return browserLang ? browserLang.split(/[-_]/)[0] : undefined;\n    }\n\n    /**\n     * Returns the culture language code name from the browser, e.g. \"de-DE\"\n     */\n    public static getBrowserCultureLang(): Language | undefined {\n        if (typeof window === \"undefined\" || typeof window.navigator === \"undefined\") {\n            return undefined;\n        }\n\n        return window.navigator.languages\n            ? window.navigator.languages[0]\n            : window.navigator.language ||\n                  window.navigator.browserLanguage ||\n                  window.navigator.userLanguage;\n    }\n\n    public getBrowserLang(): Language | undefined {\n        return TranslateService.getBrowserLang();\n    }\n\n    public getBrowserCultureLang(): Language | undefined {\n        return TranslateService.getBrowserCultureLang();\n    }\n\n    /**\n     * The current language as a reactive Signal.\n     * Use `getCurrentLang()` for a non-reactive snapshot.\n     */\n    get currentLang(): Signal<Language | null> {\n        return this.isRoot ? this._currentLang.asReadonly() : this.parent!.currentLang;\n    }\n\n    /**\n     * The fallback language as a reactive Signal.\n     * Use `getFallbackLang()` for a non-reactive snapshot.\n     */\n    get fallbackLang(): Signal<Language | null> {\n        return this.isRoot ? this._fallbackLang.asReadonly() : this.parent!.fallbackLang;\n    }\n}\n","import { inject, Signal } from \"@angular/core\";\nimport { TranslateService } from \"./translate.service\";\nimport {\n    InterpolationParameters,\n    Language,\n    Translation,\n    TranslationObject,\n} from \"./translate.service.interface\";\n\n/**\n * Returns a Signal with the translation for the given key, resolved against\n * the current language. Must be called in an Angular injection context.\n *\n * Parameters accept plain values or arrow functions. Signal reads inside\n * the function are tracked reactively. Signals themselves are also accepted\n * directly, since Signal<T> is callable.\n *\n * @example\n * greeting = translate('HELLO');\n *\n * @example\n * model = signal({ currentKey: 'HELLO' });\n * greeting = translate(() => this.model().currentKey);\n */\nexport function translate(\n    key: string | string[] | (() => string | string[]),\n    params?: InterpolationParameters | (() => InterpolationParameters | undefined),\n    lang?: Language | (() => Language | undefined),\n): Signal<Translation | TranslationObject> {\n    return inject(TranslateService).translate(key, params, lang);\n}\n","import { Directive, inject, OnInit, TemplateRef, ViewContainerRef } from \"@angular/core\";\nimport { TranslateService } from \"./translate.service\";\nimport { InterpolationParameters, Translation } from \"./translate.service.interface\";\n\nexport class TranslateBlockContext {\n    constructor(public $implicit: (key: string, params?: InterpolationParameters) => Translation) {}\n}\n\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: \"[translateBlock]\",\n    standalone: true,\n})\nexport class TranslateBlockDirective implements OnInit {\n    private templateRef = inject(TemplateRef<TranslateBlockContext>);\n    private viewContainer = inject(ViewContainerRef);\n    private translateService = inject(TranslateService);\n\n    ngOnInit(): void {\n        const translateFn = (key: string, params?: InterpolationParameters): Translation => {\n            // instant() internally reads the store's translations() signal, which establishes\n            // Angular signal tracking during template evaluation — no explicit subscription needed.\n            return this.translateService.instant(key, params);\n        };\n\n        this.viewContainer.createEmbeddedView(\n            this.templateRef,\n            new TranslateBlockContext(translateFn),\n        );\n    }\n\n    static ngTemplateContextGuard(\n        _dir: TranslateBlockDirective,\n        _ctx: unknown,\n    ): _ctx is TranslateBlockContext {\n        return true;\n    }\n}\n","import { ChangeDetectorRef, ElementRef } from \"@angular/core\";\nimport { TranslateService } from \"./translate.service\";\nimport { InterpolationParameters, StrictTranslation } from \"./translate.service.interface\";\nimport { isDefinedAndNotNull, isString } from \"./util\";\n\ninterface ExtendedNode extends Text {\n    originalContent: string;\n    currentValue: string;\n    lookupKey: string;\n    lastKey: string | null;\n    data: string;\n}\n\n/**\n * @deprecated Using element content as a translation key is deprecated and\n * will be removed in v19. Use `[translate]=\"'KEY'\"` or `*translateBlock=\"let t\"`\n * instead.\n */\nexport class ContentKeyHandler {\n    private lastParams?: InterpolationParameters;\n\n    constructor(\n        private element: ElementRef,\n        private changeDetectorRef: ChangeDetectorRef,\n        private translateService: TranslateService,\n    ) {\n        // Pass the offending element as a second `console.warn` arg so DevTools\n        // can highlight it. Warn per element rather than once-per-page because\n        // a single console line for an entire app of 50+ legacy elements is\n        // not actionable; this matches the spirit of Angular's own\n        // deprecation warnings (e.g. `provideHttpClient` migration warnings).\n        console.warn(\n            \"@ngx-translate/core: Using element content as a translation key \" +\n                \"is deprecated and will be removed in v19. \" +\n                'Use [translate]=\"\\'KEY\\'\" or *translateBlock=\"let t\" instead.',\n            this.element?.nativeElement,\n        );\n    }\n\n    checkNodes(currentParams: InterpolationParameters | undefined, forceUpdate = false): void {\n        const nodes: NodeList = this.element.nativeElement.childNodes;\n        if (!nodes.length) {\n            return;\n        }\n\n        nodes.forEach((n) => {\n            const node = n as ExtendedNode;\n            if (node.nodeType === 3) {\n                let key!: string;\n                if (forceUpdate) {\n                    node.lastKey = null;\n                }\n                if (isDefinedAndNotNull(node.lookupKey)) {\n                    key = node.lookupKey;\n                } else {\n                    const content = this.getContent(node);\n                    const trimmedContent = content.trim();\n                    if (trimmedContent.length) {\n                        node.lookupKey = trimmedContent;\n                        if (content !== node.currentValue) {\n                            key = trimmedContent;\n                            node.originalContent = content || node.originalContent;\n                        } else if (node.originalContent) {\n                            key = node.originalContent.trim();\n                        }\n                    }\n                }\n                this.updateValue(key, node, currentParams);\n            }\n        });\n    }\n\n    private updateValue(\n        key: string,\n        node: ExtendedNode,\n        currentParams: InterpolationParameters | undefined,\n    ): void {\n        if (!key) {\n            return;\n        }\n\n        if (node.lastKey === key && this.lastParams === currentParams) {\n            return;\n        }\n\n        this.lastParams = currentParams;\n\n        const res: StrictTranslation = this.translateService.instant(key, currentParams);\n\n        if (res !== key || !node.lastKey) {\n            node.lastKey = key;\n        }\n        if (!node.originalContent) {\n            node.originalContent = this.getContent(node);\n        }\n\n        if (isString(res)) {\n            node.currentValue = res;\n        } else if (!isDefinedAndNotNull(res)) {\n            node.currentValue = node.originalContent || key;\n        } else {\n            node.currentValue = JSON.stringify(res);\n        }\n\n        this.setContent(node, node.originalContent.replace(key, node.currentValue));\n        this.changeDetectorRef.markForCheck();\n    }\n\n    private getContent(node: ExtendedNode): string {\n        return (isDefinedAndNotNull(node.textContent) ? node.textContent : node.data) as string;\n    }\n\n    private setContent(node: ExtendedNode, content: string): void {\n        if (isDefinedAndNotNull(node.textContent)) {\n            node.textContent = content;\n        } else {\n            node.data = content;\n        }\n    }\n}\n","import {\n    AfterViewChecked,\n    ChangeDetectorRef,\n    DestroyRef,\n    Directive,\n    effect,\n    ElementRef,\n    inject,\n    Injector,\n    Input,\n    signal,\n    Signal,\n    WritableSignal,\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { TranslateService } from \"./translate.service\";\nimport { equals, isDefinedAndNotNull, isString } from \"./util\";\nimport {\n    InterpolationParameters,\n    Translation,\n    TranslationObject,\n} from \"./translate.service.interface\";\nimport { ContentKeyHandler } from \"./translate-content-key\";\n\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: \"[translate],[ngx-translate]\",\n    standalone: true,\n})\nexport class TranslateDirective implements AfterViewChecked {\n    private translateService = inject(TranslateService);\n    private element = inject(ElementRef);\n    private destroyRef = inject(DestroyRef);\n    private changeDetectorRef = inject(ChangeDetectorRef);\n    private injector = inject(Injector);\n\n    private key!: string;\n    private currentParams?: InterpolationParameters;\n\n    // Signal-based explicit key path\n    private keySignal: WritableSignal<string> | null = null;\n    private paramsSignal: WritableSignal<InterpolationParameters | undefined> | null = null;\n    private translationSignal: Signal<Translation | TranslationObject> | null = null;\n    private effectCreated = false;\n\n    // Deprecated content-as-key path\n    private contentKeyHandler: ContentKeyHandler | null = null;\n\n    @Input() set translate(key: string) {\n        if (key) {\n            this.key = key;\n\n            if (!this.keySignal) {\n                this.keySignal = signal(key);\n                this.paramsSignal = signal<InterpolationParameters | undefined>(this.currentParams);\n                this.translationSignal = this.translateService.translate(\n                    this.keySignal,\n                    this.paramsSignal,\n                );\n                this.setupEffect();\n            } else {\n                this.keySignal.set(key);\n            }\n        }\n    }\n\n    @Input() set translateParams(params: InterpolationParameters) {\n        if (!equals(this.currentParams, params)) {\n            this.currentParams = params;\n\n            if (this.paramsSignal) {\n                this.paramsSignal.set(params);\n            } else if (this.contentKeyHandler) {\n                this.contentKeyHandler.checkNodes(params, true);\n            }\n        }\n    }\n\n    constructor() {\n        this.translateService.onTranslationRefresh\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe(() => {\n                if (this.translationSignal) {\n                    this.writeTranslationToDOM();\n                } else if (this.contentKeyHandler) {\n                    this.contentKeyHandler.checkNodes(this.currentParams, true);\n                }\n            });\n    }\n\n    ngAfterViewChecked() {\n        if (!this.keySignal && !this.contentKeyHandler) {\n            // No explicit key was bound — activate deprecated content-as-key path\n            this.contentKeyHandler = new ContentKeyHandler(\n                this.element,\n                this.changeDetectorRef,\n                this.translateService,\n            );\n        }\n\n        if (this.contentKeyHandler) {\n            this.contentKeyHandler.checkNodes(this.currentParams);\n        }\n    }\n\n    private setupEffect(): void {\n        if (this.effectCreated) {\n            return;\n        }\n        this.effectCreated = true;\n\n        effect(\n            () => {\n                const value = this.translationSignal!();\n                this.writeToDOM(value);\n            },\n            { injector: this.injector },\n        );\n    }\n\n    private writeTranslationToDOM(): void {\n        if (this.translationSignal) {\n            const value = this.translationSignal();\n            this.writeToDOM(value);\n        }\n    }\n\n    private writeToDOM(value: Translation | TranslationObject): void {\n        const el = this.element.nativeElement;\n        let text: string;\n\n        if (isString(value)) {\n            text = value as string;\n        } else if (!isDefinedAndNotNull(value)) {\n            text = this.key;\n        } else {\n            text = JSON.stringify(value);\n        }\n\n        el.textContent = text;\n        this.changeDetectorRef.markForCheck();\n    }\n}\n","import { inject, Injectable, Pipe, PipeTransform, Signal } from \"@angular/core\";\nimport { TranslateService } from \"./translate.service\";\nimport { equals, isDefinedAndNotNull, isDict, isString } from \"./util\";\nimport { InterpolationParameters, Translation } from \"./translate.service.interface\";\n\n@Injectable()\n@Pipe({\n    name: \"translate\",\n    standalone: true,\n    pure: false, // required to update the value when the signal changes\n})\nexport class TranslatePipe implements PipeTransform {\n    private translateService = inject(TranslateService);\n\n    private cachedSignal: Signal<Translation> | null = null;\n    private lastKey: string | null = null;\n    private lastParams: InterpolationParameters | undefined;\n\n    /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n    transform(query: string | undefined | null, ...args: any[]): any {\n        if (!query || !query.length) {\n            return query;\n        }\n\n        const interpolateParams = this.parseArgs(args);\n\n        // Only recreate signal if key or params changed\n        if (query !== this.lastKey || !equals(interpolateParams, this.lastParams)) {\n            this.cachedSignal = this.translateService.translate(query, interpolateParams);\n            this.lastKey = query;\n            this.lastParams = interpolateParams;\n        }\n\n        return this.cachedSignal!();\n    }\n\n    private parseArgs(args: unknown[]): InterpolationParameters | undefined {\n        if (!isDefinedAndNotNull(args[0]) || !args.length) {\n            return undefined;\n        }\n\n        if (isString(args[0]) && args[0].length) {\n            // we accept objects written in the template such as {n:1}, {'n':1}, {n:'v'}\n            // this is why we might need to change it to real JSON objects such as {\"n\":1} or {\"n\":\"v\"}\n            const validArgs: string = args[0]\n                .replace(/(')?([a-zA-Z0-9_]+)(')?(\\s)?:/g, '\"$2\":')\n                .replace(/:(\\s)?(')(.*?)(')/g, ':\"$3\"');\n            try {\n                return JSON.parse(validArgs);\n            } catch (e) {\n                void e;\n                throw new SyntaxError(\n                    `Wrong parameter in TranslatePipe. Expected a valid Object, received: ${args[0]}`,\n                );\n            }\n        }\n\n        if (isDict(args[0])) {\n            return args[0] as InterpolationParameters;\n        }\n\n        return undefined;\n    }\n}\n","import { ClassProvider, FactoryProvider, Provider, ProviderToken, Type } from \"@angular/core\";\nimport {\n    DefaultMissingTranslationHandler,\n    MissingTranslationHandler,\n} from \"./missing-translation-handler\";\nimport { TranslateCompiler, TranslateNoOpCompiler } from \"./translate.compiler\";\nimport { TranslateLoader, TranslateNoOpLoader } from \"./translate.loader\";\nimport { TranslateDefaultParser, TranslateParser } from \"./translate.parser\";\nimport {\n    TRANSLATE_SERVICE_CONFIG,\n    TranslateService,\n    TranslateServiceConfig,\n} from \"./translate.service\";\nimport { TranslateStore } from \"./translate.store\";\nimport { Language } from \"./translate.service.interface\";\n\n/**\n * Provider shape accepted by the four plugin slots on\n * {@link RootTranslateServiceConfig} and {@link ChildTranslateServiceConfig}.\n *\n * Accepts any Angular {@link Provider} — including bare classes (TypeProvider)\n * and bare factory functions. When a bare class or factory is passed, it is\n * automatically wrapped by the corresponding `provideTranslate*` helper so it\n * is registered under the correct DI token.\n */\nexport type TranslateProvider = Provider | (() => unknown);\n\nexport interface TranslateProviders {\n    loader?: TranslateProvider;\n    compiler?: TranslateProvider;\n    parser?: TranslateProvider;\n    missingTranslationHandler?: TranslateProvider;\n}\n\nexport type ChildTranslateServiceConfig = Partial<TranslateProviders>;\n\nexport interface RootTranslateServiceConfig extends ChildTranslateServiceConfig {\n    fallbackLang?: Language;\n    lang?: Language;\n}\n\nfunction isClass<T>(fn: Type<T> | (() => T)): fn is Type<T> {\n    return /^class\\s/.test(Function.prototype.toString.call(fn));\n}\n\nfunction toProvider<T>(\n    token: ProviderToken<T>,\n    value: Type<T> | (() => T),\n): ClassProvider | FactoryProvider {\n    return isClass(value)\n        ? { provide: token, useClass: value }\n        : { provide: token, useFactory: value };\n}\n\nexport function provideTranslateLoader(loader: Type<TranslateLoader>): ClassProvider;\nexport function provideTranslateLoader(factory: () => TranslateLoader): FactoryProvider;\nexport function provideTranslateLoader(\n    loaderOrFactory: Type<TranslateLoader> | (() => TranslateLoader),\n): ClassProvider | FactoryProvider {\n    return toProvider(TranslateLoader, loaderOrFactory);\n}\n\nexport function provideTranslateCompiler(compiler: Type<TranslateCompiler>): ClassProvider;\nexport function provideTranslateCompiler(factory: () => TranslateCompiler): FactoryProvider;\nexport function provideTranslateCompiler(\n    compilerOrFactory: Type<TranslateCompiler> | (() => TranslateCompiler),\n): ClassProvider | FactoryProvider {\n    return toProvider(TranslateCompiler, compilerOrFactory);\n}\n\nexport function provideTranslateParser(parser: Type<TranslateParser>): ClassProvider;\nexport function provideTranslateParser(factory: () => TranslateParser): FactoryProvider;\nexport function provideTranslateParser(\n    parserOrFactory: Type<TranslateParser> | (() => TranslateParser),\n): ClassProvider | FactoryProvider {\n    return toProvider(TranslateParser, parserOrFactory);\n}\n\nexport function provideMissingTranslationHandler(\n    handler: Type<MissingTranslationHandler>,\n): ClassProvider;\nexport function provideMissingTranslationHandler(\n    factory: () => MissingTranslationHandler,\n): FactoryProvider;\nexport function provideMissingTranslationHandler(\n    handlerOrFactory: Type<MissingTranslationHandler> | (() => MissingTranslationHandler),\n): ClassProvider | FactoryProvider {\n    return toProvider(MissingTranslationHandler, handlerOrFactory);\n}\n\nexport function provideTranslateService(config: RootTranslateServiceConfig = {}): Provider[] {\n    return defaultProviders({ ...config, isRoot: true });\n}\n\nexport function provideChildTranslateService(config: ChildTranslateServiceConfig = {}): Provider[] {\n    return defaultProviders({ ...config, isRoot: false });\n}\n\ninterface InternalProvidersConfig extends RootTranslateServiceConfig {\n    isRoot: boolean;\n}\n\n/**\n * Resolves a plugin slot to a concrete Angular provider.\n *\n * - If `value` is `undefined`, the default class is wrapped with `toProvider`.\n * - If `value` is a function (bare class or bare factory), it is auto-wrapped\n *   via `toProvider`, which uses `isClass` to pick `useClass` vs `useFactory`.\n *   A bare class additionally triggers a one-line `console.warn` nudging the\n *   caller toward the explicit `provideTranslate*` helper. Bare factories\n *   pass through silently — they are the documented compact form.\n * - Otherwise `value` is already a proper Provider object and is passed through.\n */\nfunction resolvePluginProvider<T>(\n    token: ProviderToken<T>,\n    value: TranslateProvider | undefined,\n    defaultClass: Type<T>,\n    fieldName: keyof TranslateProviders,\n    helperName: string,\n): Provider {\n    if (value === undefined) return toProvider(token, defaultClass);\n    if (typeof value === \"function\") {\n        if (isClass(value as Type<T> | (() => T))) {\n            const className = (value as { name?: string }).name || \"YourClass\";\n            console.warn(\n                `@ngx-translate/core: \"${fieldName}\" received a bare class (${className}); ` +\n                    `auto-wrapping with ${helperName}(). For clarity, prefer ` +\n                    `${fieldName}: ${helperName}(${className}).`,\n            );\n        }\n        return toProvider(token, value as Type<T> | (() => T));\n    }\n    return value as Provider;\n}\n\nfunction defaultProviders(config: InternalProvidersConfig): Provider[] {\n    const providers: Provider[] = [];\n\n    const loader = resolvePluginProvider(\n        TranslateLoader,\n        config.loader,\n        TranslateNoOpLoader,\n        \"loader\",\n        \"provideTranslateLoader\",\n    );\n    const compiler = resolvePluginProvider(\n        TranslateCompiler,\n        config.compiler,\n        TranslateNoOpCompiler,\n        \"compiler\",\n        \"provideTranslateCompiler\",\n    );\n    const parser = resolvePluginProvider(\n        TranslateParser,\n        config.parser,\n        TranslateDefaultParser,\n        \"parser\",\n        \"provideTranslateParser\",\n    );\n    const missingTranslationHandler = resolvePluginProvider(\n        MissingTranslationHandler,\n        config.missingTranslationHandler,\n        DefaultMissingTranslationHandler,\n        \"missingTranslationHandler\",\n        \"provideMissingTranslationHandler\",\n    );\n\n    providers.push(loader, compiler, parser, missingTranslationHandler);\n    providers.push(TranslateStore);\n\n    const serviceConfig: TranslateServiceConfig = {\n        fallbackLang: config.fallbackLang ?? null,\n        lang: config.lang,\n        isRoot: config.isRoot,\n    };\n\n    providers.push({\n        provide: TRANSLATE_SERVICE_CONFIG,\n        useValue: serviceConfig,\n    });\n\n    providers.push({\n        provide: TranslateService,\n        useClass: TranslateService,\n    });\n\n    return providers;\n}\n","import { InterpolateFunction } from \"./translate.parser\";\nimport { Signal } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type InterpolationParameters = Record<string, any>;\nexport type StrictTranslation = string | StrictTranslation[] | TranslationObject | undefined | null;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Translation = StrictTranslation | any;\n\nexport interface TranslationObject {\n    [key: string]: StrictTranslation;\n}\n\nexport type InterpolatableTranslation =\n    | string\n    | InterpolatableTranslation[]\n    | InterpolateFunction\n    | InterpolatableTranslationObject\n    | undefined\n    | null;\n\nexport interface InterpolatableTranslationObject {\n    [key: string]: InterpolatableTranslation;\n}\n\nexport type Language = string;\n\nexport interface TranslationChangeEvent {\n    translations: InterpolatableTranslationObject;\n    lang: string;\n}\n\nexport interface LangChangeEvent {\n    lang: string;\n    translations: InterpolatableTranslationObject;\n}\n\nexport interface FallbackLangChangeEvent {\n    lang: string;\n    translations: InterpolatableTranslationObject;\n}\n\nexport abstract class ITranslateService {\n    public abstract readonly onTranslationChange: Observable<TranslationChangeEvent>;\n    public abstract readonly onLangChange: Observable<LangChangeEvent>;\n    public abstract readonly onFallbackLangChange: Observable<FallbackLangChangeEvent>;\n\n    /**\n     * A combined Observable that emits whenever translations might need to be refreshed.\n     * This includes: language changes, translation updates for the current language,\n     * and fallback language changes.\n     */\n    public abstract readonly onTranslationRefresh: Observable<void>;\n\n    public abstract use(lang: Language): Observable<InterpolatableTranslationObject>;\n\n    public abstract setFallbackLang(lang: Language): Observable<InterpolatableTranslationObject>;\n    public abstract getFallbackLang(): Language | null;\n\n    public abstract addLangs(languages: Language[]): void;\n    public abstract getLangs(): readonly Language[];\n    public abstract reloadLang(lang: Language): Observable<InterpolatableTranslationObject>;\n    public abstract resetLang(lang: Language): void;\n\n    public abstract instant(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Translation;\n\n    /**\n     * Returns a Signal that provides the translated value and automatically updates\n     * whenever the currentLang, fallbackLang, or the translations change.\n     *\n     * Parameters accept plain values or arrow functions. Signal reads inside\n     * the function are tracked reactively. Signals themselves are also accepted\n     * directly, since Signal<T> is callable.\n     *\n     * @param key - The translation key (or array of keys), a function returning one\n     * @param params - Optional interpolation parameters, or a function returning them\n     * @param lang - Optional language override, or a function returning one\n     * @returns A Signal that emits the translated value\n     */\n    public abstract translate(\n        key: string | string[] | (() => string | string[]),\n        params?: InterpolationParameters | (() => InterpolationParameters | undefined),\n        lang?: Language | (() => Language | undefined),\n    ): Signal<Translation | TranslationObject>;\n\n    public abstract stream(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Observable<Translation>;\n\n    public abstract getStreamOnTranslationChange(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Observable<Translation>;\n\n    public abstract set(\n        key: string,\n        translation: string | TranslationObject,\n        lang?: Language,\n    ): void;\n\n    public abstract get(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): Observable<Translation>;\n\n    public abstract setTranslation(\n        lang: Language,\n        translations: TranslationObject,\n        shouldMerge?: boolean,\n    ): void;\n\n    public abstract setCompiledTranslation(\n        lang: Language,\n        translations: InterpolatableTranslationObject,\n        shouldMerge?: boolean,\n    ): void;\n\n    public abstract getParsedResult(\n        key: string | string[],\n        interpolateParams?: InterpolationParameters,\n        lang?: Language,\n    ): StrictTranslation | Observable<StrictTranslation>;\n\n    public abstract getBrowserLang(): Language | undefined;\n\n    public abstract getBrowserCultureLang(): Language | undefined;\n\n    /**\n     * The current language as a reactive Signal.\n     * Use `getCurrentLang()` for a non-reactive snapshot.\n     */\n    public abstract readonly currentLang: Signal<Language | null>;\n\n    /**\n     * The fallback language as a reactive Signal.\n     * Use `getFallbackLang()` for a non-reactive snapshot.\n     */\n    public abstract readonly fallbackLang: Signal<Language | null>;\n\n    /**\n     * `true` while one or more language loads are in flight at this service\n     * or any of its ancestors in the service hierarchy.\n     *\n     * Loading scope propagates DOWNWARD: a load triggered at the root marks\n     * the root and all descendants as loading. A load triggered at a child\n     * (e.g. a lazy-route bootstrap fetching its translations) marks only that\n     * child's subtree. Siblings and ancestors are unaffected by a descendant's\n     * loads.\n     *\n     * Drive a spinner by reading it from the service injected at the scope\n     * where the spinner should live: root for an app-shell spinner, the\n     * nearest child for a local spinner inside a lazy-loaded subtree.\n     */\n    public abstract readonly isLoading: Signal<boolean>;\n\n    /**\n     * Returns the current language as a plain value (non-reactive).\n     * Use `currentLang` signal for reactive usage.\n     */\n    public abstract getCurrentLang(): Language | null;\n\n    /**\n     * Returns the loaded translations for the given language.\n     */\n    public abstract getTranslations(language: Language): InterpolatableTranslationObject;\n\n    /**\n     * Returns the service this one inherits translations from, or `null` if\n     * this is a root (a top-level service or an isolated subtree root).\n     *\n     * A `null` return means the service is the terminus of its translation\n     * fallback chain — equivalent to \"is this a root?\".\n     */\n    public abstract getParent(): ITranslateService | null;\n\n    /**\n     * Returns the root of this service's hierarchy — the topmost service in\n     * the `getParent()` chain. For an isolated subtree, returns the subtree's\n     * root (since `getParent()` returns `null` at the isolation boundary).\n     *\n     * A root service returns itself.\n     */\n    public abstract getRoot(): ITranslateService;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}