ngx-atomic-i18n 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/FIFO.model.mjs +64 -0
- package/esm2022/lib/translate.pipe.mjs +18 -0
- package/esm2022/lib/translate.provider.mjs +121 -0
- package/esm2022/lib/translate.token.mjs +15 -0
- package/esm2022/lib/translate.type.mjs +10 -0
- package/esm2022/lib/translate.util.mjs +245 -0
- package/esm2022/lib/translation-core.service.mjs +312 -0
- package/esm2022/lib/translation.directive.mjs +35 -0
- package/esm2022/lib/translation.loader.csr.mjs +44 -0
- package/esm2022/lib/translation.loader.ssr.mjs +89 -0
- package/esm2022/lib/translation.service.mjs +165 -0
- package/esm2022/ngx-atomic-i18n.mjs +5 -0
- package/esm2022/public-api.mjs +15 -0
- package/fesm2022/ngx-atomic-i18n.mjs +1099 -0
- package/fesm2022/ngx-atomic-i18n.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/FIFO.model.d.ts +21 -0
- package/lib/translate.pipe.d.ts +10 -0
- package/lib/translate.provider.d.ts +17 -0
- package/lib/translate.token.d.ts +15 -0
- package/lib/translate.type.d.ts +103 -0
- package/lib/translate.util.d.ts +28 -0
- package/lib/translation-core.service.d.ts +55 -0
- package/lib/translation.directive.d.ts +15 -0
- package/lib/translation.loader.csr.d.ts +10 -0
- package/lib/translation.loader.ssr.d.ts +17 -0
- package/lib/translation.service.d.ts +60 -0
- package/package.json +48 -0
- package/public-api.d.ts +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-atomic-i18n.mjs","sources":["../../../projects/ngx-atomic-i18n/src/lib/translate.token.ts","../../../projects/ngx-atomic-i18n/src/lib/translate.util.ts","../../../projects/ngx-atomic-i18n/src/lib/FIFO.model.ts","../../../projects/ngx-atomic-i18n/src/lib/translation-core.service.ts","../../../projects/ngx-atomic-i18n/src/lib/translation.service.ts","../../../projects/ngx-atomic-i18n/src/lib/translate.pipe.ts","../../../projects/ngx-atomic-i18n/src/lib/translation.directive.ts","../../../projects/ngx-atomic-i18n/src/lib/translate.type.ts","../../../projects/ngx-atomic-i18n/src/lib/translation.loader.csr.ts","../../../projects/ngx-atomic-i18n/src/lib/translation.loader.ssr.ts","../../../projects/ngx-atomic-i18n/src/lib/translate.provider.ts","../../../projects/ngx-atomic-i18n/src/public-api.ts","../../../projects/ngx-atomic-i18n/src/ngx-atomic-i18n.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { TranslationConfig, TranslationLoader } from \"./translate.type\";\n\n/** Scoped namespace for translating a component tree (string or array). */\nexport const TRANSLATION_NAMESPACE = new InjectionToken<string>('TRANSLATION_NAMESPACE');\n/** Root configuration describing language support and loader behavior. */\nexport const TRANSLATION_CONFIG = new InjectionToken<TranslationConfig>('TRANSLATION_CONFIG');\n/** Factory used to retrieve translation JSON for a namespace/language tuple. */\nexport const TRANSLATION_LOADER = new InjectionToken<TranslationLoader>('TRANSLATION_LOADER');\n/** Optional build fingerprint appended to namespace cache keys. */\nexport const BUILD_VERSION = new InjectionToken<string | null>('BUILD_VERSION');\n/** Custom ICU formatter constructor injected by the host app when available. */\nexport const ICU_FORMATTER_TOKEN = new InjectionToken<any>('ICU_FORMATTER_TOKEN');\n\nexport const PAGE_TRANSLATION_ROOT = new InjectionToken<boolean>('PAGE_TRANSLATION_ROOT');\n/** Per-request language captured during SSR and replayed on CSR. */\nexport const CLIENT_REQUEST_LANG = new InjectionToken<string | null>('CLIENT_REQUEST_LANG');\n","import { effect, inject, Injector, runInInjectionContext, Signal } from \"@angular/core\";\nimport { DeepPartial, PathTemplate, TranslationConfig } from \"./translate.type\";\nimport { Observable } from \"rxjs\";\n\n/** Normalizes a language code against the configured supported languages. */\nexport function normalizeLangCode(\n lang: string | null | undefined,\n supportedLangs: string[]\n): string | null {\n if (!lang) return null;\n const variants = new Set<string>();\n variants.add(lang);\n variants.add(lang.replace(/_/g, '-'));\n variants.add(lang.replace(/-/g, '_'));\n variants.add(lang.toLowerCase());\n variants.add(lang.replace(/_/g, '-').toLowerCase());\n for (const candidate of variants) {\n const match = supportedLangs.find(\n supported => supported.toLowerCase() === candidate.toLowerCase()\n );\n if (match) return match;\n }\n return null;\n}\n\n/** Determines the most appropriate language using the configured detection order. */\nexport function detectPreferredLang(config: TranslationConfig): string {\n const { supportedLangs, fallbackLang, langDetectionOrder } = config;\n for (const source of langDetectionOrder) {\n let lang: string | null;\n switch (source) {\n case 'url':\n lang = typeof window !== 'undefined' ? window.location.pathname.split('/')[1] : null;\n break;\n case 'clientRequest':\n lang = config.clientRequestLang ?? null;\n break;\n case 'localStorage':\n lang = typeof window !== 'undefined' ? localStorage.getItem('lang') : null;\n break;\n case 'browser':\n const langTag = (globalThis as any)?.navigator?.language ?? '';\n lang = supportedLangs.find(s => langTag.startsWith(s)) ?? null;\n break;\n case 'customLang':\n lang = typeof config.customLang === 'function' ? config.customLang() : config.customLang ?? null;\n break;\n case 'fallback':\n lang = fallbackLang;\n break;\n }\n const normalized = normalizeLangCode(lang, supportedLangs);\n if (normalized) {\n return normalized;\n };\n }\n return normalizeLangCode(fallbackLang, supportedLangs) ?? fallbackLang;\n}\n\n/** Lightweight ICU parser that supports nested select/plural structures. */\nexport function parseICU(templateText: string, params?: Record<string, string | number>): string {\n if (typeof params === 'object' ? !Object.keys(params).length : true) return templateText;\n\n const paramMap: Record<string, string> = {};\n for (const [key, val] of Object.entries(params!)) {\n paramMap[key] = String(val);\n }\n\n function extractBlock(text: string, startIndex: number): [string, number] {\n let depth = 0;\n let i = startIndex;\n while (i < text.length) {\n if (text[i] === '{') {\n if (depth === 0) startIndex = i;\n depth++;\n } else if (text[i] === '}') {\n depth--;\n if (depth === 0) return [text.slice(startIndex, i + 1), i + 1];\n }\n i++;\n }\n return [text.slice(startIndex), text.length];\n }\n\n function extractOptions(body: string): Record<string, string> {\n const options: Record<string, string> = {};\n let i = 0;\n while (i < body.length) {\n while (body[i] === ' ') i++;\n let key = '';\n while (i < body.length && body[i] !== '{' && body[i] !== ' ') {\n key += body[i++];\n }\n while (i < body.length && body[i] === ' ') i++;\n if (body[i] !== '{') {\n // Option must have a nested block; otherwise skip it.\n i++;\n continue;\n }\n const [block, next] = extractBlock(body, i);\n options[key] = block.slice(1, -1);\n i = next;\n }\n return options;\n }\n\n function resolveICU(text: string): string {\n text = text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => paramMap[key] ?? '');\n let result = '';\n let cursor = 0;\n\n while (cursor < text.length) {\n const start = text.indexOf('{', cursor);\n if (start === -1) {\n result += text.slice(cursor);\n break;\n }\n\n result += text.slice(cursor, start);\n\n const [block, nextIndex] = extractBlock(text, start);\n\n if (!block || block === '' || block === '{}') {\n cursor = nextIndex;\n continue;\n }\n\n const match = block.match(/^\\{(\\w+),\\s*(plural|select),/);\n if (!match) {\n result += block;\n cursor = nextIndex;\n continue;\n }\n\n const [, varName, type] = match;\n const rawVal = paramMap[varName] ?? '';\n const numVal = Number(rawVal);\n const body = block.slice(match[0].length, -1);\n const options = extractOptions(body);\n\n const selected =\n options[`=${rawVal}`] ||\n (type === 'plural' && numVal === 1 && options['one']) ||\n options[rawVal] ||\n options['other'] ||\n '';\n\n if (!selected) {\n result += block;\n cursor = nextIndex;\n continue;\n }\n\n let resolved = resolveICU(selected);\n\n if (type === 'plural') {\n resolved = resolved.replace(/#/g, rawVal);\n }\n\n resolved = resolved.replace(/{{(\\w+)}}|\\{(\\w+)\\}/g, (_, k1, k2) => {\n const k = k1 || k2;\n return paramMap[k] ?? '';\n });\n\n result += resolved;\n cursor = nextIndex;\n }\n\n return result;\n }\n\n return resolveICU(templateText);\n}\n\n\n\n/** Flattens a nested translation object using dot notation keys. */\nexport function flattenTranslations(obj: any, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, flattenTranslations(value, newKey));\n } else {\n result[newKey] = String(value);\n }\n }\n return result;\n}\n\n\n/** Converts a signal to an observable while preserving injection context. */\nexport function toObservable<T>(signal: Signal<T>): Observable<T> {\n const injector = inject(Injector);\n return new Observable(subscribe => {\n subscribe.next(signal());\n const stop = runInInjectionContext(injector, () => effect(() => subscribe.next(signal()), { allowSignalWrites: true }));\n return () => stop.destroy();\n });\n}\n\n\n/** Deeply merges plain objects, replacing non-object values by assignment. */\nexport function deepMerge<T extends object, U extends object>(target: T, source: U): T & U {\n const output = { ...target } as T & U;\n for (const key in source) {\n const targetValue = (target as any)[key];\n if (\n source.hasOwnProperty(key) &&\n typeof source[key] === 'object' &&\n source[key] !== null &&\n !Array.isArray(source[key]) &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n output[key] = deepMerge(targetValue as any, source[key] as any);\n } else {\n output[key] = source[key] as any;\n }\n }\n return output;\n}\n\n/** Recursively retains only keys that are not already present in the existing object. */\nexport function filterNewKeysDeep<T extends object, U extends object>(bundle: T, existing: U): DeepPartial<T> {\n const result = {} as Partial<T>;\n for (const key in bundle) {\n const existValue = (existing as any)[key];\n if (\n typeof bundle[key] === 'object' &&\n bundle[key] !== null &&\n !Array.isArray(bundle[key]) &&\n typeof existValue === 'object' &&\n existValue !== null &&\n !Array.isArray(existValue)\n ) {\n result[key] = filterNewKeysDeep(bundle[key], existValue) as any;\n } else if (!(key in existing)) {\n result[key] = bundle[key];\n }\n }\n return result;\n}\n\n/** Safely reads a dotted path from a nested object. */\nexport function getNested(obj: any, path: string): string | undefined {\n return path.split('.').reduce((res, key) => res?.[key], obj);\n}\n\n/** Removes any leading slashes from path-like strings. */\nexport const stripLeadingSep = (s: string) => s.replace(/^[\\\\/]+/, '');\n\n/** Normalises the path template configuration to an array form. */\nexport const tempToArray = (template: PathTemplate) => Array.isArray(template) ? template : (template ? [template] : undefined);\n\n/**\n * Detect current build version from injected script names (CSR only).\n * Matches filenames like: main.<hash>.js, runtime.<hash>.js, polyfills.<hash>.js\n */\nexport function detectBuildVersion(): string | null {\n try {\n if (typeof document === 'undefined' || !document?.scripts) return null;\n const regex = /\\/(?:main|runtime|polyfills)\\.([a-f0-9]{8,})\\.[^\\/]*\\.js(?:\\?|$)/i;\n for (const s of Array.from(document.scripts)) {\n const version = regex.exec((s as HTMLScriptElement).src);\n if (version?.[1]) return version[1];\n }\n return null;\n } catch {\n return null;\n }\n}\n","/** Combined FIFO/LRU cache used to store compiled formatters. */\nexport class FIFOCache<K, V> {\n private map = new Map<K, V>();\n get size(): number {\n return this.map.size;\n }\n constructor(private max: number) { }\n set(key: K, value: V): void {\n if (this.map.has(key)) {\n this.map.delete(key);\n }\n this.map.set(key, value);\n if (this.map.size > this.max) {\n const first = this.map.keys().next().value;\n if (first) {\n this.map.delete(first);\n }\n }\n }\n get(key: K): V | undefined {\n const val = this.map.get(key);\n // Refresh recency on hit so frequently used entries stay resident.\n if (val !== undefined) {\n this.map.delete(key);\n this.map.set(key, val);\n }\n return val;\n }\n has(key: K): boolean {\n return this.map.has(key);\n }\n delete(k: K): void {\n this.map.delete(k);\n }\n clear(): void {\n this.map.clear();\n }\n\n /** Utility helper for controlled external iteration/manipulation. */\n keys(): IterableIterator<K> {\n return this.map.keys();\n }\n\n /** Iterates cached values without exposing the backing Map. */\n forEach(cb: (value: V, key: K) => void): void {\n this.map.forEach((v, k) => cb(v, k));\n }\n\n /**\n * Delete all entries that match the predicate.\n * Returns the number of deleted entries.\n */\n deleteWhere(predicate: (key: K, value: V) => boolean): number {\n let count = 0;\n for (const [k, v] of this.map) {\n if (predicate(k, v)) {\n this.map.delete(k);\n count++;\n }\n }\n return count;\n }\n}\n","import { computed, inject, Injectable, Signal, signal } from '@angular/core';\nimport { deepMerge, detectPreferredLang, filterNewKeysDeep, getNested, normalizeLangCode, parseICU, toObservable } from './translate.util';\n\nimport { FIFOCache } from './FIFO.model';\nimport { ICU_FORMATTER_TOKEN, TRANSLATION_CONFIG, TRANSLATION_LOADER } from './translate.token';\nimport { FormatResult, nsKey, Translations } from './translate.type';\n\n/** Maximum compiled formatter entries retained before evicting older ones. */\nconst MAX_CACHE_SIZE = 30;\n@Injectable({\n providedIn: 'root'\n})\n/**\n * Central cache and orchestration layer for loading translation namespaces,\n * compiling ICU messages, and serving formatted strings to the higher-level API.\n */\nexport class TranslationCoreService {\n /** Immutable runtime configuration injected from the library bootstrap. */\n private readonly _config = inject(TRANSLATION_CONFIG);\n /** Active loader used to fetch namespace JSON payloads. */\n private readonly _loader = inject(TRANSLATION_LOADER);\n /** Optional custom ICU formatter constructor supplied by the host application. */\n private readonly _ICU = inject(ICU_FORMATTER_TOKEN, { optional: true }) as unknown as (new (raw: string, lang: string) => FormatResult) | null\n private readonly debugEnabled = !!this._config.debug;\n\n /** Reactive language state tracking the current locale. */\n private readonly _lang = signal(detectPreferredLang(this._config));\n readonly lang = this._lang.asReadonly();\n\n /** Translation documents keyed by language then namespace. */\n private readonly _jsonCache = signal(new Map<string, Map<string, Record<string, any>>>()); // lang => namespace => key\n /** Version fingerprints captured alongside each namespace entry. */\n private readonly _versionMap = signal(new Map<string, Map<string, string | undefined>>()); // lang => namespace => version\n /** Least-recently-used cache of compiled ICU formatters. */\n private readonly _formatterCache = new FIFOCache<nsKey, FormatResult>(MAX_CACHE_SIZE);\n private _missingKeyCache = new Set<nsKey>();\n private _inflight = new Map<string, Promise<void>>();\n /** Caches compiled ICU expressions (with or without custom formatters). */\n private readonly _icuCompiledCache = new Map<string, FormatResult>();\n\n readonly onLangChange = toObservable(this._lang);\n readonly fallbackLang = this._config.fallbackLang ?? 'en';\n\n get currentLang(): string {\n return this._lang.asReadonly()();\n }\n\n readySignal(namespace: string, version?: string): Signal<boolean> {\n return computed(() => this.hasJsonCacheValue(this.lang(), namespace, version));\n }\n\n setLang(lang?: string): void {\n const attempted = lang ?? detectPreferredLang(this._config);\n const currentLang = normalizeLangCode(attempted, this._config.supportedLangs);\n\n if (!currentLang) {\n this.warn(`Unsupported language requested: ${attempted}`);\n return;\n }\n if (this._lang() !== currentLang) {\n this._lang.set(currentLang);\n this.log(`Switched active language to \"${currentLang}\".`);\n this._icuCompiledCache.clear();\n const isBroswer = typeof window !== 'undefined';\n if (isBroswer) {\n try {\n localStorage.setItem('lang', this._lang());\n } catch (err) {\n this.warn('Failed to persist language to localStorage.', err);\n }\n }\n }\n }\n\n async load(nsKey: string, fetchFn: () => Promise<Translations>): Promise<void> {\n const parts = nsKey.split(':');\n const lang = parts[0];\n const namespace = parts[1];\n const version = parts[2];\n if (this.hasJsonCacheValue(lang, namespace, version)) {\n this.log(`Namespace \"${namespace}\" for \"${lang}\" is already cached. Skip loader.`);\n return;\n }\n\n // coalesce concurrent loads for the same nsKey\n if (this._inflight.has(nsKey)) {\n this.log(`Namespace \"${namespace}\" for \"${lang}\" is already loading. Reusing in-flight request.`);\n await this._inflight.get(nsKey);\n return;\n }\n\n this.log(`Loading namespace \"${namespace}\" for \"${lang}\"${version ? ` (version ${version})` : ''}.`);\n const p = (async () => {\n try {\n const json = await fetchFn();\n this.handleNewTranslations(json, lang, namespace, version);\n this.log(`Namespace \"${namespace}\" for \"${lang}\" loaded successfully.`);\n } catch (error) {\n this.error(`Failed to load namespace \"${namespace}\" for \"${lang}\".`, error);\n throw error;\n } finally {\n this._inflight.delete(nsKey);\n }\n })();\n this._inflight.set(nsKey, p);\n await p;\n }\n\n getAndCreateFormatter(nsKey: string, key: string): FormatResult | undefined {\n const cacheKey = `${nsKey}:${key}`;\n if (this._formatterCache.has(cacheKey)) return this._formatterCache.get(cacheKey);\n const [lang, namespace] = nsKey.split(':');\n const raw = getNested(this._jsonCache().get(lang)?.get(namespace), key);\n if (raw === undefined) return;\n let result: FormatResult;\n if (this._ICU) {\n const k = `${raw}|${this.lang()}`;\n const exist = this._icuCompiledCache.get(k);\n if (exist) {\n result = exist;\n } else {\n result = new this._ICU(raw, this.lang());\n this._icuCompiledCache.set(k, result);\n }\n } else {\n const k = raw;\n const exist = this._icuCompiledCache.get(k);\n if (exist) {\n result = exist;\n } else {\n result = { format: (p) => parseICU(raw, p) };\n this._icuCompiledCache.set(k, result);\n }\n }\n this._formatterCache.set(cacheKey, result);\n return result;\n }\n\n findFallbackFormatter(key: string, exclude: string[], version?: string): FormatResult | undefined {\n const namespaces = Array.isArray(this._config.fallbackNamespace)\n ? this._config.fallbackNamespace\n : [this._config.fallbackNamespace ?? '']\n for (const namespace of namespaces) {\n const nsKey = version ? `${this.currentLang}:${namespace}:${version}` : `${this.currentLang}:${namespace}`;\n if (exclude.includes(nsKey)) continue;\n const missKey = version\n ? `${this.currentLang}:${namespace}:${version}:${key}`\n : `${this.currentLang}:${namespace}:${key}`;\n if (this._missingKeyCache.has(missKey)) continue;\n const result = this.getAndCreateFormatter(nsKey, key);\n if (result) return result;\n this._missingKeyCache.add(missKey);\n }\n return undefined;\n }\n\n async preloadNamespaces(namespaces: string[], lang: string): Promise<void> {\n const roots = Array.isArray(this._config.i18nRoots) ? this._config.i18nRoots : [this._config.i18nRoots];\n const loadList = namespaces.filter(namespace => !this.hasJsonCacheValue(lang, namespace));\n const jsonArray = await Promise.all(loadList.map(namespace => this._loader.load(roots, namespace, lang)));\n jsonArray.forEach((json, index) => this.handleNewTranslations(json, lang, loadList[index], undefined))\n }\n\n private handleNewTranslations(json: Translations, lang: string, namespace: string, version?: string): void {\n const map = new Map(this._jsonCache());\n const langMap = new Map(this._jsonCache().get(lang));\n langMap.set(namespace, json);\n map.set(lang, langMap);\n this._jsonCache.set(map);\n\n const vMap = new Map(this._versionMap());\n const vLangMap = new Map(this._versionMap().get(lang));\n vLangMap.set(namespace, version);\n vMap.set(lang, vLangMap);\n this._versionMap.set(vMap);\n\n // Invalidate formatter cache for this namespace (covers with/without version)\n const nsKey = `${lang}:${namespace}:`;\n this._formatterCache.deleteWhere((k) => (k as unknown as string).startsWith(nsKey));\n\n this._missingKeyCache.clear();\n if (this.debugEnabled) {\n const keyCount = json && typeof json === 'object' ? Object.keys(json).length : 0;\n this.log(`Cached namespace \"${namespace}\" for \"${lang}\" (${keyCount} top-level keys).`);\n }\n }\n\n private hasJsonCacheValue(lang: string, namespace: string, version?: string): boolean {\n const exists = this._jsonCache().get(lang)?.get(namespace) !== undefined;\n if (!exists) return false;\n if (version !== undefined) {\n const stored = this._versionMap().get(lang)?.get(namespace);\n return stored === version;\n }\n return true;\n }\n\n addResourceBundle(lang: string, namespace: string, bundle: Translations, deep = true, overwrite = true) {\n const map = new Map(this._jsonCache());\n const oldLangMap = map.get(lang);\n const langMap = oldLangMap ? new Map(map.get(lang)) : new Map<string, Translations>();\n const existTranslations = langMap.get(namespace) ?? {};\n let merged: Translations;\n if (deep) {\n merged = overwrite\n ? deepMerge(existTranslations, bundle)\n : deepMerge(existTranslations, filterNewKeysDeep(bundle, existTranslations))\n } else {\n merged = overwrite\n ? { ...existTranslations, ...bundle }\n : { ...bundle }\n if (!overwrite) {\n for (const key in existTranslations) {\n if (!(key in merged)) {\n merged[key] = existTranslations[key];\n }\n }\n }\n }\n langMap.set(namespace, merged);\n map.set(lang, langMap);\n this._jsonCache.set(map);\n }\n\n addResources(lang: string, namespace: string, obj: Translations, overwrite = true) {\n this.addResourceBundle(lang, namespace, obj, false, overwrite);\n }\n\n addResource(lang: string, namespace: string, key: string, val: string, overwrite = true) {\n this.addResources(lang, namespace, { [key]: val }, overwrite);\n }\n\n getAllBundle(): Map<string, Map<string, Record<string, any>>> {\n return this._jsonCache()\n }\n\n hasResourceBundle(lang: string, namespace: string): boolean {\n return !!this._jsonCache().get(lang)?.has(namespace);\n }\n\n getResourceBundle(lang: string, namespace: string): Translations | undefined {\n return this._jsonCache().get(lang)?.get(namespace);\n }\n\n removeResourceBundle(lang: string, namespace: string): void {\n const map = new Map(this._jsonCache());\n const langMap = new Map(map.get(lang));\n langMap.delete(namespace)\n map.set(lang, langMap);\n this._jsonCache.set(map);\n // Evict all formatter cache entries that belong to this lang:namespace (with or without version)\n // Keys are in form `${nsKey}:${key}` where nsKey may include version\n const prefix = `${lang}:${namespace}:`;\n this._formatterCache.deleteWhere((k) => (k as unknown as string).startsWith(prefix));\n // also clear missing-key entries for this namespace\n for (const k of Array.from(this._missingKeyCache)) {\n if (k.startsWith(prefix)) this._missingKeyCache.delete(k);\n }\n }\n\n /** Clear everything: data, versions, formatters, missing keys, inflight */\n clearAll(): void {\n this._jsonCache.set(new Map());\n this._versionMap.set(new Map());\n this._formatterCache.clear();\n this._missingKeyCache.clear();\n this._inflight.clear();\n this._icuCompiledCache.clear();\n }\n\n /** Clear all resources for a language */\n clearLang(lang: string): void {\n const map = new Map(this._jsonCache());\n map.delete(lang);\n this._jsonCache.set(map);\n const vmap = new Map(this._versionMap());\n vmap.delete(lang);\n this._versionMap.set(vmap);\n this._formatterCache.deleteWhere((k) => (k as unknown as string).startsWith(`${lang}:`));\n for (const k of Array.from(this._missingKeyCache)) {\n if (k.startsWith(`${lang}:`)) this._missingKeyCache.delete(k);\n }\n for (const k of Array.from(this._icuCompiledCache.keys())) {\n if (k.endsWith(`|${lang}`)) this._icuCompiledCache.delete(k);\n }\n }\n\n /** Clear a specific namespace for a language */\n clearNamespace(lang: string, namespace: string): void {\n this.removeResourceBundle(lang, namespace);\n }\n\n getResource(lang: string, namespace: string, key: string): string | undefined {\n return getNested(this._jsonCache().get(lang)?.get(namespace), key);\n }\n\n private log(message: string, ...details: unknown[]): void {\n if (!this.debugEnabled) return;\n if (details.length) {\n console.info(`[ngx-atomic-i18n] ${message}`, ...details);\n } else {\n console.info(`[ngx-atomic-i18n] ${message}`);\n }\n }\n\n private error(message: string, error: unknown): void {\n if (!this.debugEnabled) return;\n console.error(`[ngx-atomic-i18n] ${message}`, error);\n }\n\n private warn(message: string, ...details: unknown[]): void {\n if (!this.debugEnabled) return;\n if (details.length) {\n console.warn(`[ngx-atomic-i18n] ${message}`, ...details);\n } else {\n console.warn(`[ngx-atomic-i18n] ${message}`);\n }\n }\n}\n","import { computed, effect, Inject, inject, Injectable, Signal } from \"@angular/core\";\nimport { BUILD_VERSION, PAGE_TRANSLATION_ROOT, TRANSLATION_CONFIG, TRANSLATION_LOADER, TRANSLATION_NAMESPACE } from \"./translate.token\";\nimport { Params } from \"./translate.type\";\nimport { detectBuildVersion, toObservable } from \"./translate.util\";\nimport { TranslationCoreService } from \"./translation-core.service\";\n\n@Injectable()\nexport class TranslationService {\n /** Shared translation configuration resolved from the host application. */\n private readonly config = inject(TRANSLATION_CONFIG);\n private readonly parent = inject(TranslationService, { skipSelf: true, optional: true });\n private readonly isPageRoot = inject(PAGE_TRANSLATION_ROOT, { self: true, optional: true }) ?? false;\n /** Core translation engine that handles lookups and formatter lifecycle. */\n private readonly core = inject(TranslationCoreService);\n /** Loader implementation responsible for fetching translation payloads. */\n private readonly loader = inject(TRANSLATION_LOADER);\n /** Optional build fingerprint for cache busting injected at runtime. */\n private readonly injectedVersion = inject(BUILD_VERSION, { optional: true }) as string | null | undefined;\n /** Flag used to guard debug logging output. */\n private readonly debugEnabled = !!this.config.debug;\n\n /** Observable mirror of the language signal for consumers outside of signals. */\n readonly onLangChange = toObservable(this.lang);\n /** Namespace currently owned by this service instance. */\n private namespace = '';\n\n get lang(): Signal<string> {\n return computed(() => this.core.lang());\n }\n\n get currentLang(): string {\n return this.core.currentLang;\n }\n get supportedLangs(): string[] {\n return this.config.supportedLangs;\n }\n\n /** Build version identifier used to scope namespace caches. */\n private readonly buildVersion: string | null = this.injectedVersion ?? detectBuildVersion();\n\n /** Composes the unique key used to store namespace resources per lang and build. */\n get getNskey(): string {\n const version = this.buildVersion;\n return version ? `${this.lang()}:${this.namespace}:${version}` : `${this.lang()}:${this.namespace}`;\n }\n\n /** Signal that flips to true when the namespace resources are available. */\n get readySignal(): Signal<boolean> {\n return this.core.readySignal(this.namespace, this.buildVersion ?? undefined);\n }\n\n /** Convenience boolean wrapper around the readiness signal. */\n get ready(): boolean {\n return this.core.readySignal(this.namespace, this.buildVersion ?? undefined)();\n }\n\n constructor(\n @Inject(TRANSLATION_NAMESPACE) public readonly namespaceInput: string,\n ) {\n this.namespace = namespaceInput;\n effect(() => {\n const nsKey = this.getNskey;\n if (!this.ready) {\n this.info(`Namespace \"${this.namespace}\" is not ready. Loading for \"${this.lang()}\" using key \"${nsKey}\".`);\n this.core.load(nsKey, () => this.loader.load(this.config.i18nRoots, this.namespace, this.lang()));\n }\n })\n }\n\n /** Switches the active language and triggers downstream refresh logic. */\n setLang(lang: string): void {\n this.info(`setLang called with \"${lang}\".`);\n this.core.setLang(lang);\n }\n\n /**\n * Resolves the translation for `key`, formatting with the provided params\n * and falling back to configured behaviors when a translation is missing.\n */\n t(key: string, params: Params = {}): string {\n const nsKey = this.getNskey;\n const missingResult = this.getMissingTranslation(key);\n if (!this.ready) {\n this.warn(`Namespace \"${this.namespace}\" is not ready.`);\n return '';\n }\n const formatResult = this.core.getAndCreateFormatter(nsKey, key);\n if (formatResult) return formatResult.format(params);\n\n if (this.config.enablePageFallback && !this.isPageRoot && this.parent) {\n return this.parent.t(key, params);\n }\n const fallback = this.core.findFallbackFormatter(key, [], this.buildVersion ?? undefined);\n if (fallback) {\n this.info(`Resolved key \"${key}\" via fallback namespace while rendering \"${this.namespace}\".`);\n return fallback.format(params);\n }\n this.warn(`Missing translation for key \"${key}\" in namespace \"${this.namespace}\". Returning fallback value.`);\n return missingResult;\n }\n\n /** Determines the fallback string or error when a translation entry is missing. */\n private getMissingTranslation(key?: string): string | never {\n const forceMode = this.config.missingTranslationBehavior ?? 'show-key';\n switch (forceMode) {\n case 'throw-error':\n throw new Error(`[i18n] Missing translation: ${key} in ${this.namespace}`);\n case 'empty':\n this.warn(`Missing translation returned an empty string for key \"${key}\" in namespace \"${this.namespace}\".`);\n return '';\n case 'show-key':\n if (key) {\n this.warn(`Showing key \"${key}\" because no translation was found in namespace \"${this.namespace}\".`);\n }\n return key ?? '';\n default: return forceMode;\n }\n }\n\n /** Pass-through helpers that delegate resource management to the core service. */\n addResourceBundle(...p: Parameters<TranslationCoreService['addResourceBundle']>) {\n return this.core.addResourceBundle(...p);\n }\n addResources(...p: Parameters<TranslationCoreService['addResources']>) {\n return this.core.addResources(...p);\n }\n addResource(...p: Parameters<TranslationCoreService['addResource']>) {\n return this.core.addResource(...p);\n }\n hasResourceBundle(...p: Parameters<TranslationCoreService['hasResourceBundle']>) {\n return this.core.hasResourceBundle(...p);\n }\n getResource(...p: Parameters<TranslationCoreService['getResource']>) {\n return this.core.getResource(...p);\n }\n getResourceBundle(...p: Parameters<TranslationCoreService['getResourceBundle']>) {\n return this.core.getResourceBundle(...p);\n }\n getAllBundle() {\n return this.core.getAllBundle();\n }\n removeResourceBundle(...p: Parameters<TranslationCoreService['removeResourceBundle']>) {\n return this.core.removeResourceBundle(...p);\n }\n preloadNamespaces(...p: Parameters<TranslationCoreService['preloadNamespaces']>) {\n return this.core.preloadNamespaces(...p);\n }\n\n /** Emits debug info when verbose logging is enabled. */\n private info(message: string, ...details: unknown[]): void {\n if (!this.debugEnabled) return;\n if (details.length) {\n console.info(`[ngx-atomic-i18n] ${message}`, ...details);\n } else {\n console.info(`[ngx-atomic-i18n] ${message}`);\n }\n }\n\n /** Emits debug warnings when verbose logging is enabled. */\n private warn(message: string, ...details: unknown[]): void {\n if (!this.debugEnabled) return;\n if (details.length) {\n console.warn(`[ngx-atomic-i18n] ${message}`, ...details);\n } else {\n console.warn(`[ngx-atomic-i18n] ${message}`);\n }\n }\n}\n","import { inject, Pipe, PipeTransform } from \"@angular/core\";\nimport { Params } from \"./translate.type\";\nimport { TranslationService } from \"./translation.service\";\n\n@Pipe({ name: 't', standalone: true, pure: false })\n/** Template helper that proxies lookups to `TranslationService.t`. */\nexport class TranslationPipe implements PipeTransform {\n private readonly service = inject(TranslationService);\n /** Formats the translation identified by `key` using the optional params. */\n transform(key: string, params?: Params): string {\n return this.service.t(key, params);\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { TranslationService } from './translation.service';\nimport { Params } from './translate.type';\n\n@Directive({\n selector: '[t]',\n standalone: true\n})\n/** Binds translation keys to an element, updating text or attributes reactively. */\nexport class TranslationDirective {\n private selfElm = inject(ElementRef).nativeElement as HTMLElement;\n private service = inject(TranslationService);\n /** Translation key resolved for the host element. */\n readonly t = input('');\n /** Optional interpolation parameters passed to the translation formatter. */\n readonly tParams = input<Params | undefined>(undefined);\n /** Attribute name to receive the translated value instead of textContent. */\n readonly tAttr = input<string>('');\n constructor() {\n effect(() => {\n const value = this.service.t(this.t(), this.tParams());\n if (this.tAttr()) {\n this.selfElm.setAttribute(this.tAttr(), value);\n } else {\n this.selfElm.textContent = value;\n }\n });\n }\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { Signal } from \"@angular/core\";\n\n/** Global configuration contract used by the translation system. */\nexport interface TranslationConfig {\n supportedLangs: string[];\n fallbackLang: string;\n i18nRoots: string[];\n pathTemplates: string[] | string;\n fallbackNamespace: string;\n langDetectionOrder: ('localStorage' | 'url' | 'browser' | 'customLang' | 'fallback' | 'clientRequest')[];\n /** Enable verbose logging. Defaults to true in dev mode. */\n debug?: boolean;\n /** Enable use */\n enablePageFallback: boolean;\n preloadNamespaces?: string[];\n customLang?: (() => string) | string;\n /** Language passed from SSR request and reused on the client. */\n clientRequestLang?: string | null;\n missingTranslationBehavior?: MissingTranslationBehavior;\n}\n\n/** Metadata passed into consumers to indicate namespace readiness. */\nexport interface TranslationContext {\n namespace: string;\n ready?: Signal<boolean>;\n}\n\nexport type LazyLoader = Record<Lang, () => Promise<Translations>>;\nexport type Params = Record<string, any>;\nexport type Translations = Record<string, string>;\nexport type Lang = string;\n/** lang:namespace:version */\nexport type nsKey = string;\n/**\n * How the translation system should behave when a translation key is missing.\n *\n * - 'show-key': Display the key itself (e.g., `'menu.about'`) as a fallback.\n * - 'empty': Show an empty string. Use this if you prefer untranslated text to disappear silently.\n * - 'throw': Throw a runtime error. Recommended only during development or testing; will break the UI if not handled.\n * - string: Any custom string, e.g., '--', 'loading...', etc.\n */\nexport type MissingTranslationBehavior = 'show-key' | 'empty' | 'throw-error';\n\nexport interface TranslationLoader {\n /**\n * @param i18nRoot List of base folders to look for JSON (ordered by priority)\n * @param ns Namespace, e.g. \"home\" or \"auth-login\"\n * @param lang Language code, e.g. \"en\" or \"zh-Hant\"\n */\n load(i18nRoots: string[], namespace: string, lang: string): Promise<Translations>;\n}\n\nexport type FormatResult = { format(params: Record<string, any>): string }\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface FsModuleLike {\n /** Minimal subset of Node's fs API needed by the SSR loader. */\n readFileSync(path: string, encoding: 'utf8'): string;\n statSync(path: string): any\n}\n\n/** Options used to customise the SSR file-system loader. */\nexport interface FsLoaderOptions {\n /** only for SSR , e.g. process.cwd() */\n baseDir?: string;\n /** e.g. 'projects/app/src/assets' (dev) or 'dist/app/browser/assets' */\n assetPath?: string;\n /** Custom resolver that returns an ordered list of candidate absolute paths. */\n resolvePaths?: (ctx: {\n baseDir: string;\n assetPath: string;\n root: string;\n lang: string;\n namespace: string;\n }) => string[];\n /** Custom fs module instance (takes precedence over dynamic imports). */\n fsModule?: FsModuleLike;\n cacheMax?: number;\n}\n\n/** Options used to customise the HTTP loader in CSR environments. */\nexport interface HttpLoaderOptions {\n /** default '/assets' */\n baseUrl?: string;\n}\n\n/** Aggregate options exposed via `provideTranslationInit`. */\nexport interface TranslationLoaderOptions {\n forceMode?: 'ssr' | 'csr';\n ssrLoader?: () => TranslationLoader; // custom SSR loader\n csrLoader?: (http: HttpClient) => TranslationLoader; // custom CSR loader\n fsOptions?: FsLoaderOptions; //options for FsTranslationLoader\n httpOptions?: HttpLoaderOptions; // options for HttpTranslationLoader\n}\n\nexport type CacheEntry = { mtimeMs: number, data: Translations };\n\nexport type PathTemplate = string | string[] | undefined;\n\nexport enum TempToken {\n /** Placeholder for the language code inside loader path templates. */\n Lang = '{{lang}}',\n /** Placeholder for the namespace inside loader path templates. */\n Namespace = '{{namespace}}',\n /** Placeholder for the root folder inside loader path templates. */\n Root = '{{root}}'\n}\n","import { defaultConfig } from './translate.provider';\nimport { HttpClient } from \"@angular/common/http\";\nimport { HttpLoaderOptions, TempToken, TranslationLoader, Translations } from \"./translate.type\";\nimport { firstValueFrom } from \"rxjs\";\nimport { detectBuildVersion, tempToArray } from \"./translate.util\";\n\nexport class HttpTranslationLoader implements TranslationLoader {\n private pathTemplateCache?: string;\n constructor(\n private readonly http: HttpClient,\n private readonly option: HttpLoaderOptions = {},\n private readonly pathTemplates: string[] | string,\n ) { }\n\n async load(i18nRoots: string[], namespace: string, lang: string): Promise<Translations> {\n const roots = tempToArray(i18nRoots) ?? [];\n const baseUrl = this.option.baseUrl ?? '/assets';\n const safeBaseUrl = (/^https?:\\/\\//i.test(baseUrl)\n ? baseUrl\n : (baseUrl.startsWith('/') ? baseUrl : '/' + baseUrl)).replace(/[\\\\/]+$/, '');\n const tempArray = tempToArray(this.pathTemplates)\n const pathTemps = this.pathTemplateCache ? [this.pathTemplateCache, ...(tempArray ?? []).filter(t => t !== this.pathTemplateCache)] : (tempArray ?? defaultConfig.pathTemplates);\n for (const root of roots) {\n for (const temp of pathTemps) {\n let url = `${safeBaseUrl}/${temp.replace(TempToken.Root, root).replace(TempToken.Lang, lang).replace(TempToken.Namespace, namespace)}`;\n const v = detectBuildVersion();\n if (v) {\n url += (url.includes('?') ? '&' : '?') + `v=${encodeURIComponent(v)}`;\n }\n try {\n const json = await firstValueFrom(\n this.http.get<Translations>(url)\n );\n if (!this.pathTemplateCache) this.pathTemplateCache = temp;\n return json;\n } catch {\n /* ignore */\n }\n }\n }\n throw new Error(`[i18n] ${namespace}.json for ${lang} not found in any i18nRoot`);\n }\n}\n","import { defaultConfig } from './translate.provider';\nimport {\n FsModuleLike,\n TempToken as t,\n type CacheEntry,\n type FsLoaderOptions,\n type TranslationLoader,\n type Translations,\n} from './translate.type';\nimport { stripLeadingSep, tempToArray } from './translate.util';\n\n/** File-system backed loader used during SSR to read translation JSON from disk. */\nexport class FsTranslationLoader implements TranslationLoader {\n private cache = new Map<string, CacheEntry>();\n\n /**\n * @param customFs Optional fs-like abstraction injected explicitly (tests or adapters).\n */\n constructor(private fsOptions: FsLoaderOptions = {}, private pathTemplates: string[] | string, private customFs?: FsModuleLike) { }\n\n async load(i18nRoots: string[] | string, namespace: string, lang: string): Promise<Translations> {\n const roots = (Array.isArray(i18nRoots) ? i18nRoots : [i18nRoots]).map(stripLeadingSep);\n\n const pathMod = await this.importSafely('node:path');\n const fsImported = await this.importSafely('node:fs');\n const fsLike: FsModuleLike | undefined =\n this.pickFs(this.customFs) ?? this.pickFs(this.fsOptions.fsModule) ?? this.pickFs(fsImported);\n\n const nodeProcess = (globalThis as any).process as { cwd?: () => string } | undefined;\n const baseDir = this.fsOptions.baseDir ?? (nodeProcess?.cwd?.() ?? '/');\n const assetPathRaw = this.fsOptions.assetPath ?? 'dist/browser/assets';\n const assetPath = stripLeadingSep(assetPathRaw);\n\n const templates =\n tempToArray(this.pathTemplates) ??\n tempToArray(defaultConfig.pathTemplates) as string[];\n\n for (const root of roots) {\n const candidatePaths =\n this.fsOptions.resolvePaths?.({\n baseDir,\n assetPath,\n root,\n lang,\n namespace,\n }) ??\n templates.map((temp) =>\n this.safeJoin(\n pathMod,\n baseDir,\n assetPath,\n temp.replace(t.Root, root).replace(t.Lang, lang).replace(t.Namespace, namespace),\n ),\n );\n\n for (const absolutePath of candidatePaths) {\n try {\n if (!fsLike?.statSync || !fsLike?.readFileSync) continue;\n\n const stat = fsLike.statSync(absolutePath);\n const mtimeMs =\n typeof stat.mtimeMs === 'number'\n ? stat.mtimeMs\n : stat.mtime?.getTime?.() ?? 0;\n const size = typeof stat.size === 'number' ? stat.size : 0;\n const sign = (mtimeMs | 0) * 1000003 + (size | 0);\n\n const cached = this.cache.get(absolutePath);\n if (cached && cached.mtimeMs === sign) {\n return cached.data;\n }\n\n const raw = fsLike.readFileSync(absolutePath, 'utf8');\n const json = JSON.parse(raw) as Translations;\n\n this.cache.set(absolutePath, { mtimeMs: sign, data: json });\n return json;\n } catch {\n // Continue probing other candidate files until a match is found.\n }\n }\n }\n\n throw new Error(`[SSR i18n] ${namespace}.json for ${lang} not found in any i18nRoot`);\n }\n\n /** Attempts to import a Node built-in without throwing when unavailable (e.g. CSR). */\n private async importSafely(specifier: string): Promise<any | undefined> {\n const nodeProcess = (globalThis as any).process as { versions?: { node?: string } } | undefined;\n const isNode = !!nodeProcess?.versions?.node;\n if (!isNode) return undefined;\n try {\n const importer = new Function('s', 'return import(s)');\n return await importer(specifier);\n } catch {\n return undefined;\n }\n }\n\n private pickFs(x: any): FsModuleLike | undefined {\n return x && typeof x.readFileSync === 'function' && typeof x.statSync === 'function'\n ? (x as FsModuleLike)\n : undefined;\n }\n\n private safeJoin(pathMod: any, ...parts: any[]): string {\n return (pathMod?.join ??\n pathMod?.default?.join ??\n ((...parts: any[]) => parts.join('/')))(...parts);\n }\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { APP_INITIALIZER, inject, isDevMode, PLATFORM_ID, Provider, TransferState, makeStateKey, Optional } from \"@angular/core\";\nimport { HttpTranslationLoader } from \"./translation.loader.csr\";\nimport { detectPreferredLang } from \"./translate.util\";\nimport { isPlatformServer } from \"@angular/common\";\nimport { TranslationService } from \"./translation.service\";\nimport { TempToken, TranslationConfig, TranslationLoader, TranslationLoaderOptions } from \"./translate.type\";\nimport { BUILD_VERSION, CLIENT_REQUEST_LANG, PAGE_TRANSLATION_ROOT, TRANSLATION_CONFIG, TRANSLATION_LOADER, TRANSLATION_NAMESPACE } from \"./translate.token\";\nimport { FsTranslationLoader } from \"./translation.loader.ssr\";\n\nexport type ProvideTranslationInitOptions =\n Partial<TranslationConfig> & {\n loader?: TranslationLoaderOptions;\n /** Optional global build version for SSR/CSR to align caches */\n buildVersion?: string | null;\n };\n\nexport const defaultConfig: TranslationConfig = {\n supportedLangs: ['en'],\n fallbackNamespace: 'common',\n fallbackLang: '',\n i18nRoots: ['i18n'],\n pathTemplates: [`${TempToken.Root}/${TempToken.Namespace}/${TempToken.Lang}.json`],\n enablePageFallback: false,\n missingTranslationBehavior: 'show-key',\n langDetectionOrder: ['url', 'clientRequest', 'localStorage', 'browser', 'customLang', 'fallback'],\n clientRequestLang: null,\n};\n\nconst CLIENT_REQUEST_LANG_STATE_KEY = makeStateKey<string | null>('NGX_I18N_CLIENT_REQUEST_LANG');\n\nfunction resolveClientRequestLang(\n platformId: Object,\n transferState: TransferState | null | undefined,\n providedLang: string | null\n): string | null {\n const stored = transferState?.get(CLIENT_REQUEST_LANG_STATE_KEY, null);\n if (stored) return stored;\n\n const resolved = providedLang ?? null;\n if (resolved && transferState && isPlatformServer(platformId)) {\n transferState.set(CLIENT_REQUEST_LANG_STATE_KEY, resolved);\n }\n return resolved;\n}\n/** Bootstraps the entire translation infrastructure for an application. */\nexport function provideTranslationInit(userConfig?: ProvideTranslationInitOptions): Provider[] {\n const debugEnabled = userConfig?.debug ?? isDevMode();\n const baseConfig = { ...defaultConfig, ...(userConfig ?? {}), fallbackLang: defaultConfig.supportedLangs[0], debug: debugEnabled } as TranslationConfig;\n if (debugEnabled) {\n console.info('[ngx-atomic-i18n] Debug logging is enabled.');\n }\n return [\n {\n provide: TRANSLATION_CONFIG,\n useFactory: (platformId: Object, transferState: TransferState | null | undefined, clientRequestLang: string | null) => {\n const requestLang = resolveClientRequestLang(platformId, transferState, clientRequestLang ?? baseConfig.clientRequestLang ?? null);\n const finalConfig = { ...baseConfig, clientRequestLang: requestLang } as TranslationConfig;\n const preferredLang = detectPreferredLang(finalConfig);\n return { ...finalConfig, customLang: preferredLang };\n },\n deps: [PLATFORM_ID, [new Optional(), TransferState], [new Optional(), CLIENT_REQUEST_LANG]],\n },\n {\n provide: BUILD_VERSION,\n useValue: userConfig?.buildVersion ?? null,\n },\n ...provideTranslationLoader(baseConfig),\n ...provideTranslation(baseConfig.fallbackNamespace),\n {\n provide: APP_INITIALIZER,\n useFactory: (ts: TranslationService) => {\n return async () => {\n const preload = baseConfig.preloadNamespaces;\n if (preload?.length) {\n await ts.preloadNamespaces(preload, ts.currentLang);\n }\n ts.setLang(ts.currentLang);\n };\n },\n deps: [TranslationService],\n multi: true,\n },\n ];\n}\n\n\n/** Provides the component-scoped namespace injection for component-registered service.\n * @param namespace The namespace owned by the component.\n * @param isPage Whether the component is a top-level page (defaults to false).\n*/\nexport function provideTranslation(namespace: string, isPage: boolean = false): Provider[] {\n return [\n {\n provide: TRANSLATION_NAMESPACE,\n useValue: namespace,\n },\n TranslationService,\n ...(isPage ? [{\n provide: PAGE_TRANSLATION_ROOT,\n useValue: true,\n }] : []),\n ]\n}\n\n/** Configures the runtime translation loader for CSR or SSR environments. */\nexport function provideTranslationLoader(config: ProvideTranslationInitOptions): Provider[] {\n return [\n {\n provide: TRANSLATION_LOADER,\n useFactory: (platformId: Object): TranslationLoader => {\n const options = config.loader ?? {};\n const finalPathTemplates = config.pathTemplates ?? defaultConfig.pathTemplates;\n const isSSR = options.forceMode === 'ssr' || (options.forceMode !== 'csr' && isPlatformServer(platformId));\n if (isSSR) {\n const nodeProcess = (globalThis as any).process as { cwd?: () => string } | undefined;\n const baseDir =\n options.fsOptions?.baseDir ??\n (typeof nodeProcess?.cwd === 'function' ? nodeProcess.cwd() : '');\n const assetPath = options.fsOptions?.assetPath ?? (isDevMode() ? 'src/assets' : 'dist/browser/assets');\n return options.ssrLoader?.()\n ?? new FsTranslationLoader({\n baseDir,\n assetPath,\n resolvePaths: options.fsOptions?.resolvePaths,\n fsModule: options.fsOptions?.fsModule\n }, finalPathTemplates);\n }\n const http = inject(HttpClient);\n return options.csrLoader?.(http)\n ?? new HttpTranslationLoader(http, {\n baseUrl: options.httpOptions?.baseUrl ?? '/assets',\n }, finalPathTemplates);\n },\n deps: [PLATFORM_ID],\n }\n ];\n}\n","/*\n * Public API Surface of ngx-atomic-i18n\n */\n\nexport * from './lib/translation.service';\nexport * from './lib/translation-core.service';\nexport * from './lib/translate.pipe';\nexport * from './lib/translation.directive';\nexport * from './lib/translate.provider';\nexport * from './lib/translation.loader.csr';\nexport * from './lib/translation.loader.ssr';\nexport * from './lib/translate.token';\nexport * from './lib/translate.type';\nexport * from './lib/translate.util';\nexport * from './lib/FIFO.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["t"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Combined FIFO/LRU cache used to store compiled formatters. */
|
|
2
|
+
export declare class FIFOCache<K, V> {
|
|
3
|
+
private max;
|
|
4
|
+
private map;
|
|
5
|
+
get size(): number;
|
|
6
|
+
constructor(max: number);
|
|
7
|
+
set(key: K, value: V): void;
|
|
8
|
+
get(key: K): V | undefined;
|
|
9
|
+
has(key: K): boolean;
|
|
10
|
+
delete(k: K): void;
|
|
11
|
+
clear(): void;
|
|
12
|
+
/** Utility helper for controlled external iteration/manipulation. */
|
|
13
|
+
keys(): IterableIterator<K>;
|
|
14
|
+
/** Iterates cached values without exposing the backing Map. */
|
|
15
|
+
forEach(cb: (value: V, key: K) => void): void;
|
|
16
|
+
/**
|
|
17
|
+
* Delete all entries that match the predicate.
|
|
18
|
+
* Returns the number of deleted entries.
|
|
19
|
+
*/
|
|
20
|
+
deleteWhere(predicate: (key: K, value: V) => boolean): number;
|
|
21
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PipeTransform } from "@angular/core";
|
|
2
|
+
import { Params } from "./translate.type";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class TranslationPipe implements PipeTransform {
|
|
5
|
+
private readonly service;
|
|
6
|
+
/** Formats the translation identified by `key` using the optional params. */
|
|
7
|
+
transform(key: string, params?: Params): string;
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationPipe, never>;
|
|
9
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<TranslationPipe, "t", true>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Provider } from "@angular/core";
|
|
2
|
+
import { TranslationConfig, TranslationLoaderOptions } from "./translate.type";
|
|
3
|
+
export type ProvideTranslationInitOptions = Partial<TranslationConfig> & {
|
|
4
|
+
loader?: TranslationLoaderOptions;
|
|
5
|
+
/** Optional global build version for SSR/CSR to align caches */
|
|
6
|
+
buildVersion?: string | null;
|
|
7
|
+
};
|
|
8
|
+
export declare const defaultConfig: TranslationConfig;
|
|
9
|
+
/** Bootstraps the entire translation infrastructure for an application. */
|
|
10
|
+
export declare function provideTranslationInit(userConfig?: ProvideTranslationInitOptions): Provider[];
|
|
11
|
+
/** Provides the component-scoped namespace injection for component-registered service.
|
|
12
|
+
* @param namespace The namespace owned by the component.
|
|
13
|
+
* @param isPage Whether the component is a top-level page (defaults to false).
|
|
14
|
+
*/
|
|
15
|
+
export declare function provideTranslation(namespace: string, isPage?: boolean): Provider[];
|
|
16
|
+
/** Configures the runtime translation loader for CSR or SSR environments. */
|
|
17
|
+
export declare function provideTranslationLoader(config: ProvideTranslationInitOptions): Provider[];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { InjectionToken } from "@angular/core";
|
|
2
|
+
import { TranslationConfig, TranslationLoader } from "./translate.type";
|
|
3
|
+
/** Scoped namespace for translating a component tree (string or array). */
|
|
4
|
+
export declare const TRANSLATION_NAMESPACE: InjectionToken<string>;
|
|
5
|
+
/** Root configuration describing language support and loader behavior. */
|
|
6
|
+
export declare const TRANSLATION_CONFIG: InjectionToken<TranslationConfig>;
|
|
7
|
+
/** Factory used to retrieve translation JSON for a namespace/language tuple. */
|
|
8
|
+
export declare const TRANSLATION_LOADER: InjectionToken<TranslationLoader>;
|
|
9
|
+
/** Optional build fingerprint appended to namespace cache keys. */
|
|
10
|
+
export declare const BUILD_VERSION: InjectionToken<string>;
|
|
11
|
+
/** Custom ICU formatter constructor injected by the host app when available. */
|
|
12
|
+
export declare const ICU_FORMATTER_TOKEN: InjectionToken<any>;
|
|
13
|
+
export declare const PAGE_TRANSLATION_ROOT: InjectionToken<boolean>;
|
|
14
|
+
/** Per-request language captured during SSR and replayed on CSR. */
|
|
15
|
+
export declare const CLIENT_REQUEST_LANG: InjectionToken<string>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { HttpClient } from "@angular/common/http";
|
|
2
|
+
import { Signal } from "@angular/core";
|
|
3
|
+
/** Global configuration contract used by the translation system. */
|
|
4
|
+
export interface TranslationConfig {
|
|
5
|
+
supportedLangs: string[];
|
|
6
|
+
fallbackLang: string;
|
|
7
|
+
i18nRoots: string[];
|
|
8
|
+
pathTemplates: string[] | string;
|
|
9
|
+
fallbackNamespace: string;
|
|
10
|
+
langDetectionOrder: ('localStorage' | 'url' | 'browser' | 'customLang' | 'fallback' | 'clientRequest')[];
|
|
11
|
+
/** Enable verbose logging. Defaults to true in dev mode. */
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
/** Enable use */
|
|
14
|
+
enablePageFallback: boolean;
|
|
15
|
+
preloadNamespaces?: string[];
|
|
16
|
+
customLang?: (() => string) | string;
|
|
17
|
+
/** Language passed from SSR request and reused on the client. */
|
|
18
|
+
clientRequestLang?: string | null;
|
|
19
|
+
missingTranslationBehavior?: MissingTranslationBehavior;
|
|
20
|
+
}
|
|
21
|
+
/** Metadata passed into consumers to indicate namespace readiness. */
|
|
22
|
+
export interface TranslationContext {
|
|
23
|
+
namespace: string;
|
|
24
|
+
ready?: Signal<boolean>;
|
|
25
|
+
}
|
|
26
|
+
export type LazyLoader = Record<Lang, () => Promise<Translations>>;
|
|
27
|
+
export type Params = Record<string, any>;
|
|
28
|
+
export type Translations = Record<string, string>;
|
|
29
|
+
export type Lang = string;
|
|
30
|
+
/** lang:namespace:version */
|
|
31
|
+
export type nsKey = string;
|
|
32
|
+
/**
|
|
33
|
+
* How the translation system should behave when a translation key is missing.
|
|
34
|
+
*
|
|
35
|
+
* - 'show-key': Display the key itself (e.g., `'menu.about'`) as a fallback.
|
|
36
|
+
* - 'empty': Show an empty string. Use this if you prefer untranslated text to disappear silently.
|
|
37
|
+
* - 'throw': Throw a runtime error. Recommended only during development or testing; will break the UI if not handled.
|
|
38
|
+
* - string: Any custom string, e.g., '--', 'loading...', etc.
|
|
39
|
+
*/
|
|
40
|
+
export type MissingTranslationBehavior = 'show-key' | 'empty' | 'throw-error';
|
|
41
|
+
export interface TranslationLoader {
|
|
42
|
+
/**
|
|
43
|
+
* @param i18nRoot List of base folders to look for JSON (ordered by priority)
|
|
44
|
+
* @param ns Namespace, e.g. "home" or "auth-login"
|
|
45
|
+
* @param lang Language code, e.g. "en" or "zh-Hant"
|
|
46
|
+
*/
|
|
47
|
+
load(i18nRoots: string[], namespace: string, lang: string): Promise<Translations>;
|
|
48
|
+
}
|
|
49
|
+
export type FormatResult = {
|
|
50
|
+
format(params: Record<string, any>): string;
|
|
51
|
+
};
|
|
52
|
+
export type DeepPartial<T> = {
|
|
53
|
+
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
54
|
+
};
|
|
55
|
+
export interface FsModuleLike {
|
|
56
|
+
/** Minimal subset of Node's fs API needed by the SSR loader. */
|
|
57
|
+
readFileSync(path: string, encoding: 'utf8'): string;
|
|
58
|
+
statSync(path: string): any;
|
|
59
|
+
}
|
|
60
|
+
/** Options used to customise the SSR file-system loader. */
|
|
61
|
+
export interface FsLoaderOptions {
|
|
62
|
+
/** only for SSR , e.g. process.cwd() */
|
|
63
|
+
baseDir?: string;
|
|
64
|
+
/** e.g. 'projects/app/src/assets' (dev) or 'dist/app/browser/assets' */
|
|
65
|
+
assetPath?: string;
|
|
66
|
+
/** Custom resolver that returns an ordered list of candidate absolute paths. */
|
|
67
|
+
resolvePaths?: (ctx: {
|
|
68
|
+
baseDir: string;
|
|
69
|
+
assetPath: string;
|
|
70
|
+
root: string;
|
|
71
|
+
lang: string;
|
|
72
|
+
namespace: string;
|
|
73
|
+
}) => string[];
|
|
74
|
+
/** Custom fs module instance (takes precedence over dynamic imports). */
|
|
75
|
+
fsModule?: FsModuleLike;
|
|
76
|
+
cacheMax?: number;
|
|
77
|
+
}
|
|
78
|
+
/** Options used to customise the HTTP loader in CSR environments. */
|
|
79
|
+
export interface HttpLoaderOptions {
|
|
80
|
+
/** default '/assets' */
|
|
81
|
+
baseUrl?: string;
|
|
82
|
+
}
|
|
83
|
+
/** Aggregate options exposed via `provideTranslationInit`. */
|
|
84
|
+
export interface TranslationLoaderOptions {
|
|
85
|
+
forceMode?: 'ssr' | 'csr';
|
|
86
|
+
ssrLoader?: () => TranslationLoader;
|
|
87
|
+
csrLoader?: (http: HttpClient) => TranslationLoader;
|
|
88
|
+
fsOptions?: FsLoaderOptions;
|
|
89
|
+
httpOptions?: HttpLoaderOptions;
|
|
90
|
+
}
|
|
91
|
+
export type CacheEntry = {
|
|
92
|
+
mtimeMs: number;
|
|
93
|
+
data: Translations;
|
|
94
|
+
};
|
|
95
|
+
export type PathTemplate = string | string[] | undefined;
|
|
96
|
+
export declare enum TempToken {
|
|
97
|
+
/** Placeholder for the language code inside loader path templates. */
|
|
98
|
+
Lang = "{{lang}}",
|
|
99
|
+
/** Placeholder for the namespace inside loader path templates. */
|
|
100
|
+
Namespace = "{{namespace}}",
|
|
101
|
+
/** Placeholder for the root folder inside loader path templates. */
|
|
102
|
+
Root = "{{root}}"
|
|
103
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Signal } from "@angular/core";
|
|
2
|
+
import { DeepPartial, PathTemplate, TranslationConfig } from "./translate.type";
|
|
3
|
+
import { Observable } from "rxjs";
|
|
4
|
+
/** Normalizes a language code against the configured supported languages. */
|
|
5
|
+
export declare function normalizeLangCode(lang: string | null | undefined, supportedLangs: string[]): string | null;
|
|
6
|
+
/** Determines the most appropriate language using the configured detection order. */
|
|
7
|
+
export declare function detectPreferredLang(config: TranslationConfig): string;
|
|
8
|
+
/** Lightweight ICU parser that supports nested select/plural structures. */
|
|
9
|
+
export declare function parseICU(templateText: string, params?: Record<string, string | number>): string;
|
|
10
|
+
/** Flattens a nested translation object using dot notation keys. */
|
|
11
|
+
export declare function flattenTranslations(obj: any, prefix?: string): Record<string, string>;
|
|
12
|
+
/** Converts a signal to an observable while preserving injection context. */
|
|
13
|
+
export declare function toObservable<T>(signal: Signal<T>): Observable<T>;
|
|
14
|
+
/** Deeply merges plain objects, replacing non-object values by assignment. */
|
|
15
|
+
export declare function deepMerge<T extends object, U extends object>(target: T, source: U): T & U;
|
|
16
|
+
/** Recursively retains only keys that are not already present in the existing object. */
|
|
17
|
+
export declare function filterNewKeysDeep<T extends object, U extends object>(bundle: T, existing: U): DeepPartial<T>;
|
|
18
|
+
/** Safely reads a dotted path from a nested object. */
|
|
19
|
+
export declare function getNested(obj: any, path: string): string | undefined;
|
|
20
|
+
/** Removes any leading slashes from path-like strings. */
|
|
21
|
+
export declare const stripLeadingSep: (s: string) => string;
|
|
22
|
+
/** Normalises the path template configuration to an array form. */
|
|
23
|
+
export declare const tempToArray: (template: PathTemplate) => string[];
|
|
24
|
+
/**
|
|
25
|
+
* Detect current build version from injected script names (CSR only).
|
|
26
|
+
* Matches filenames like: main.<hash>.js, runtime.<hash>.js, polyfills.<hash>.js
|
|
27
|
+
*/
|
|
28
|
+
export declare function detectBuildVersion(): string | null;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Signal } from '@angular/core';
|
|
2
|
+
import { FormatResult, Translations } from './translate.type';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class TranslationCoreService {
|
|
5
|
+
/** Immutable runtime configuration injected from the library bootstrap. */
|
|
6
|
+
private readonly _config;
|
|
7
|
+
/** Active loader used to fetch namespace JSON payloads. */
|
|
8
|
+
private readonly _loader;
|
|
9
|
+
/** Optional custom ICU formatter constructor supplied by the host application. */
|
|
10
|
+
private readonly _ICU;
|
|
11
|
+
private readonly debugEnabled;
|
|
12
|
+
/** Reactive language state tracking the current locale. */
|
|
13
|
+
private readonly _lang;
|
|
14
|
+
readonly lang: Signal<string>;
|
|
15
|
+
/** Translation documents keyed by language then namespace. */
|
|
16
|
+
private readonly _jsonCache;
|
|
17
|
+
/** Version fingerprints captured alongside each namespace entry. */
|
|
18
|
+
private readonly _versionMap;
|
|
19
|
+
/** Least-recently-used cache of compiled ICU formatters. */
|
|
20
|
+
private readonly _formatterCache;
|
|
21
|
+
private _missingKeyCache;
|
|
22
|
+
private _inflight;
|
|
23
|
+
/** Caches compiled ICU expressions (with or without custom formatters). */
|
|
24
|
+
private readonly _icuCompiledCache;
|
|
25
|
+
readonly onLangChange: import("rxjs").Observable<string>;
|
|
26
|
+
readonly fallbackLang: string;
|
|
27
|
+
get currentLang(): string;
|
|
28
|
+
readySignal(namespace: string, version?: string): Signal<boolean>;
|
|
29
|
+
setLang(lang?: string): void;
|
|
30
|
+
load(nsKey: string, fetchFn: () => Promise<Translations>): Promise<void>;
|
|
31
|
+
getAndCreateFormatter(nsKey: string, key: string): FormatResult | undefined;
|
|
32
|
+
findFallbackFormatter(key: string, exclude: string[], version?: string): FormatResult | undefined;
|
|
33
|
+
preloadNamespaces(namespaces: string[], lang: string): Promise<void>;
|
|
34
|
+
private handleNewTranslations;
|
|
35
|
+
private hasJsonCacheValue;
|
|
36
|
+
addResourceBundle(lang: string, namespace: string, bundle: Translations, deep?: boolean, overwrite?: boolean): void;
|
|
37
|
+
addResources(lang: string, namespace: string, obj: Translations, overwrite?: boolean): void;
|
|
38
|
+
addResource(lang: string, namespace: string, key: string, val: string, overwrite?: boolean): void;
|
|
39
|
+
getAllBundle(): Map<string, Map<string, Record<string, any>>>;
|
|
40
|
+
hasResourceBundle(lang: string, namespace: string): boolean;
|
|
41
|
+
getResourceBundle(lang: string, namespace: string): Translations | undefined;
|
|
42
|
+
removeResourceBundle(lang: string, namespace: string): void;
|
|
43
|
+
/** Clear everything: data, versions, formatters, missing keys, inflight */
|
|
44
|
+
clearAll(): void;
|
|
45
|
+
/** Clear all resources for a language */
|
|
46
|
+
clearLang(lang: string): void;
|
|
47
|
+
/** Clear a specific namespace for a language */
|
|
48
|
+
clearNamespace(lang: string, namespace: string): void;
|
|
49
|
+
getResource(lang: string, namespace: string, key: string): string | undefined;
|
|
50
|
+
private log;
|
|
51
|
+
private error;
|
|
52
|
+
private warn;
|
|
53
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationCoreService, never>;
|
|
54
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TranslationCoreService>;
|
|
55
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Params } from './translate.type';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class TranslationDirective {
|
|
4
|
+
private selfElm;
|
|
5
|
+
private service;
|
|
6
|
+
/** Translation key resolved for the host element. */
|
|
7
|
+
readonly t: import("@angular/core").InputSignal<string>;
|
|
8
|
+
/** Optional interpolation parameters passed to the translation formatter. */
|
|
9
|
+
readonly tParams: import("@angular/core").InputSignal<Params>;
|
|
10
|
+
/** Attribute name to receive the translated value instead of textContent. */
|
|
11
|
+
readonly tAttr: import("@angular/core").InputSignal<string>;
|
|
12
|
+
constructor();
|
|
13
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationDirective, never>;
|
|
14
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TranslationDirective, "[t]", never, { "t": { "alias": "t"; "required": false; "isSignal": true; }; "tParams": { "alias": "tParams"; "required": false; "isSignal": true; }; "tAttr": { "alias": "tAttr"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { HttpClient } from "@angular/common/http";
|
|
2
|
+
import { HttpLoaderOptions, TranslationLoader, Translations } from "./translate.type";
|
|
3
|
+
export declare class HttpTranslationLoader implements TranslationLoader {
|
|
4
|
+
private readonly http;
|
|
5
|
+
private readonly option;
|
|
6
|
+
private readonly pathTemplates;
|
|
7
|
+
private pathTemplateCache?;
|
|
8
|
+
constructor(http: HttpClient, option: HttpLoaderOptions, pathTemplates: string[] | string);
|
|
9
|
+
load(i18nRoots: string[], namespace: string, lang: string): Promise<Translations>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FsModuleLike, type FsLoaderOptions, type TranslationLoader, type Translations } from './translate.type';
|
|
2
|
+
/** File-system backed loader used during SSR to read translation JSON from disk. */
|
|
3
|
+
export declare class FsTranslationLoader implements TranslationLoader {
|
|
4
|
+
private fsOptions;
|
|
5
|
+
private pathTemplates;
|
|
6
|
+
private customFs?;
|
|
7
|
+
private cache;
|
|
8
|
+
/**
|
|
9
|
+
* @param customFs Optional fs-like abstraction injected explicitly (tests or adapters).
|
|
10
|
+
*/
|
|
11
|
+
constructor(fsOptions: FsLoaderOptions, pathTemplates: string[] | string, customFs?: FsModuleLike);
|
|
12
|
+
load(i18nRoots: string[] | string, namespace: string, lang: string): Promise<Translations>;
|
|
13
|
+
/** Attempts to import a Node built-in without throwing when unavailable (e.g. CSR). */
|
|
14
|
+
private importSafely;
|
|
15
|
+
private pickFs;
|
|
16
|
+
private safeJoin;
|
|
17
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Signal } from "@angular/core";
|
|
2
|
+
import { Params } from "./translate.type";
|
|
3
|
+
import { TranslationCoreService } from "./translation-core.service";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class TranslationService {
|
|
6
|
+
readonly namespaceInput: string;
|
|
7
|
+
/** Shared translation configuration resolved from the host application. */
|
|
8
|
+
private readonly config;
|
|
9
|
+
private readonly parent;
|
|
10
|
+
private readonly isPageRoot;
|
|
11
|
+
/** Core translation engine that handles lookups and formatter lifecycle. */
|
|
12
|
+
private readonly core;
|
|
13
|
+
/** Loader implementation responsible for fetching translation payloads. */
|
|
14
|
+
private readonly loader;
|
|
15
|
+
/** Optional build fingerprint for cache busting injected at runtime. */
|
|
16
|
+
private readonly injectedVersion;
|
|
17
|
+
/** Flag used to guard debug logging output. */
|
|
18
|
+
private readonly debugEnabled;
|
|
19
|
+
/** Observable mirror of the language signal for consumers outside of signals. */
|
|
20
|
+
readonly onLangChange: import("rxjs").Observable<string>;
|
|
21
|
+
/** Namespace currently owned by this service instance. */
|
|
22
|
+
private namespace;
|
|
23
|
+
get lang(): Signal<string>;
|
|
24
|
+
get currentLang(): string;
|
|
25
|
+
get supportedLangs(): string[];
|
|
26
|
+
/** Build version identifier used to scope namespace caches. */
|
|
27
|
+
private readonly buildVersion;
|
|
28
|
+
/** Composes the unique key used to store namespace resources per lang and build. */
|
|
29
|
+
get getNskey(): string;
|
|
30
|
+
/** Signal that flips to true when the namespace resources are available. */
|
|
31
|
+
get readySignal(): Signal<boolean>;
|
|
32
|
+
/** Convenience boolean wrapper around the readiness signal. */
|
|
33
|
+
get ready(): boolean;
|
|
34
|
+
constructor(namespaceInput: string);
|
|
35
|
+
/** Switches the active language and triggers downstream refresh logic. */
|
|
36
|
+
setLang(lang: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Resolves the translation for `key`, formatting with the provided params
|
|
39
|
+
* and falling back to configured behaviors when a translation is missing.
|
|
40
|
+
*/
|
|
41
|
+
t(key: string, params?: Params): string;
|
|
42
|
+
/** Determines the fallback string or error when a translation entry is missing. */
|
|
43
|
+
private getMissingTranslation;
|
|
44
|
+
/** Pass-through helpers that delegate resource management to the core service. */
|
|
45
|
+
addResourceBundle(...p: Parameters<TranslationCoreService['addResourceBundle']>): void;
|
|
46
|
+
addResources(...p: Parameters<TranslationCoreService['addResources']>): void;
|
|
47
|
+
addResource(...p: Parameters<TranslationCoreService['addResource']>): void;
|
|
48
|
+
hasResourceBundle(...p: Parameters<TranslationCoreService['hasResourceBundle']>): boolean;
|
|
49
|
+
getResource(...p: Parameters<TranslationCoreService['getResource']>): string;
|
|
50
|
+
getResourceBundle(...p: Parameters<TranslationCoreService['getResourceBundle']>): import("./translate.type").Translations;
|
|
51
|
+
getAllBundle(): Map<string, Map<string, Record<string, any>>>;
|
|
52
|
+
removeResourceBundle(...p: Parameters<TranslationCoreService['removeResourceBundle']>): void;
|
|
53
|
+
preloadNamespaces(...p: Parameters<TranslationCoreService['preloadNamespaces']>): Promise<void>;
|
|
54
|
+
/** Emits debug info when verbose logging is enabled. */
|
|
55
|
+
private info;
|
|
56
|
+
/** Emits debug warnings when verbose logging is enabled. */
|
|
57
|
+
private warn;
|
|
58
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationService, never>;
|
|
59
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TranslationService>;
|
|
60
|
+
}
|