@mmstack/translate 21.1.9 → 21.1.11

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 CHANGED
@@ -402,6 +402,23 @@ Due to Angular's memoization, pure pipes don't automatically react to locale cha
402
402
  export class QuoteTranslator extends Translator<QuoteLocale> {}
403
403
  ```
404
404
 
405
+ **Persisting the selected locale:**
406
+
407
+ If you want the user's last selected locale to survive page reloads, pass a `localeStorage` adapter to `provideIntlConfig()`. The library calls `read()` once on init to restore the previous selection, and `write()` whenever the active locale changes — you decide where it lives (localStorage, cookies, IndexedDB-with-sync-wrapper, etc.).
408
+
409
+ ```typescript
410
+ provideIntlConfig({
411
+ defaultLocale: 'en-US',
412
+ supportedLocales: ['en-US', 'sl-SI', 'de-DE'],
413
+ localeStorage: {
414
+ read: () => localStorage.getItem('locale'),
415
+ write: (locale) => localStorage.setItem('locale', locale),
416
+ },
417
+ });
418
+ ```
419
+
420
+ Stored values are validated against `supportedLocales` before being applied — anything unrecognized is ignored and the default applies. Errors thrown from `read()` / `write()` are swallowed (and logged in dev mode) so a misbehaving storage backend can't break the app. `localeStorage` is mutually exclusive with `localeParamName` at the type level — when the URL is the source of truth, persisting separately would just fight it.
421
+
405
422
  ### 6. [OPTIONAL] Creating a Shared/Common Namespace
406
423
 
407
424
  A shared namespace allows you to define common translations (e.g., 'Save', 'Cancel', 'Yes', 'No') once and use them type-safely across all other namespaces.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { computed, inject, InjectionToken, LOCALE_ID, signal, resource, untracked, isDevMode, effect, Injectable, isSignal, input, Renderer2, ElementRef, afterRenderEffect, Directive, ChangeDetectorRef } from '@angular/core';
2
+ import { computed, inject, InjectionToken, LOCALE_ID, signal, isDevMode, effect, resource, untracked, Injectable, isSignal, input, Renderer2, ElementRef, afterRenderEffect, Directive, ChangeDetectorRef } from '@angular/core';
3
3
  import { createIntlCache, createIntl } from '@formatjs/intl';
4
4
  import { toSignal } from '@angular/core/rxjs-interop';
5
5
  import { Router, ActivatedRoute } from '@angular/router';
@@ -135,7 +135,42 @@ const STORE_LOCALE = signal('en-US', ...(ngDevMode ? [{ debugName: "STORE_LOCALE
135
135
  function injectLocaleInternal() {
136
136
  return STORE_LOCALE;
137
137
  }
138
+ function isDynamicConfig(cfg) {
139
+ return !!cfg && 'localeStorage' in cfg && !!cfg.localeStorage;
140
+ }
141
+ function initLocale(src) {
142
+ const config = injectIntlConfig();
143
+ const defaultValue = injectDefaultLocale();
144
+ if (!isDynamicConfig(config)) {
145
+ src.set(defaultValue);
146
+ return src;
147
+ }
148
+ let next = null;
149
+ try {
150
+ const stored = config.localeStorage.read();
151
+ if (stored !== null &&
152
+ (!config.supportedLocales || config.supportedLocales.includes(stored))) {
153
+ next = stored;
154
+ }
155
+ }
156
+ catch (e) {
157
+ if (isDevMode())
158
+ console.error('[Translate] Failed to read stored locale from localeStorage', e);
159
+ }
160
+ src.set(next ?? defaultValue);
161
+ effect(() => {
162
+ try {
163
+ config.localeStorage.write(src());
164
+ }
165
+ catch (e) {
166
+ if (isDevMode())
167
+ console.error('[Translate] Failed to write locale to localeStorage', e);
168
+ }
169
+ });
170
+ return src;
171
+ }
138
172
  class TranslationStore {
173
+ simpleKeyMap = new Map();
139
174
  cache = createIntlCache();
140
175
  config = injectIntlConfig();
141
176
  loadQueue = signal([], ...(ngDevMode ? [{ debugName: "loadQueue" }] : /* istanbul ignore next */ []));
@@ -195,8 +230,7 @@ class TranslationStore {
195
230
  messages: this.messages(),
196
231
  }, this.cache), ...(ngDevMode ? [{ debugName: "intl" }] : /* istanbul ignore next */ []));
197
232
  constructor() {
198
- this.locale = STORE_LOCALE;
199
- this.locale.set(injectDefaultLocale());
233
+ this.locale = initLocale(STORE_LOCALE);
200
234
  const paramName = this.config?.localeParamName;
201
235
  if (paramName) {
202
236
  const param = pathParam(paramName);
@@ -235,7 +269,20 @@ class TranslationStore {
235
269
  }
236
270
  });
237
271
  }
272
+ buildSimpleKeySignal(key) {
273
+ const found = this.simpleKeyMap.get(key);
274
+ if (found)
275
+ return found;
276
+ const sig = computed(() => this.formatMessageInternal(key), ...(ngDevMode ? [{ debugName: "sig" }] : /* istanbul ignore next */ []));
277
+ this.simpleKeyMap.set(key, sig);
278
+ return sig;
279
+ }
238
280
  formatMessage(key, values) {
281
+ if (values === undefined)
282
+ return this.buildSimpleKeySignal(key)();
283
+ return this.formatMessageInternal(key, values);
284
+ }
285
+ formatMessageInternal(key, values) {
239
286
  const message = this.translations()[this.locale()]?.[key] ??
240
287
  this.translations()[this.defaultLocale]?.[key] ??
241
288
  '';
@@ -604,11 +651,13 @@ function addSignalFn(fn, store, keyMap) {
604
651
  flatPath = replaceWithDelim(stringKey);
605
652
  keyMap.set(stringKey, flatPath);
606
653
  }
607
- const varsFn = variables ?? (() => undefined);
654
+ if (variables === undefined)
655
+ return store.buildSimpleKeySignal(flatPath);
656
+ const varsFn = variables;
608
657
  const varsSignal = isSignal(varsFn)
609
658
  ? varsFn
610
- : computed(varsFn, {
611
- equal: createEqualsRecord(Object.keys(varsFn() ?? {})),
659
+ : computed(() => varsFn(), {
660
+ equal: createEqualsRecord(Object.keys(varsFn())),
612
661
  });
613
662
  return computed(() => store.formatMessage(flatPath, varsSignal()));
614
663
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mmstack-translate.mjs","sources":["../../../../packages/translate/src/lib/delim.ts","../../../../packages/translate/src/lib/compile.ts","../../../../packages/translate/src/lib/create-namespace.ts","../../../../packages/translate/src/lib/path-param.ts","../../../../packages/translate/src/lib/translation-store.ts","../../../../packages/translate/src/lib/format/unwrap.ts","../../../../packages/translate/src/lib/format/date.ts","../../../../packages/translate/src/lib/format/display-name.ts","../../../../packages/translate/src/lib/format/list.ts","../../../../packages/translate/src/lib/format/numeric.ts","../../../../packages/translate/src/lib/format/relative-time.ts","../../../../packages/translate/src/lib/resovler-locale.ts","../../../../packages/translate/src/lib/register-namespace.ts","../../../../packages/translate/src/lib/route-helpers.ts","../../../../packages/translate/src/lib/translate.ts","../../../../packages/translate/src/lib/translator.ts","../../../../packages/translate/src/lib/testing/provide-mock-translations.ts","../../../../packages/translate/src/mmstack-translate.ts"],"sourcesContent":["const KEY_DELIM = '::MMT_DELIM::';\n\nexport function prependDelim(prefix: string, key: string): string {\n return `${prefix}${KEY_DELIM}${key}`;\n}\n\nexport function replaceWithDelim(str: string, repl = '.'): string {\n return str.replaceAll(repl, KEY_DELIM);\n}\n","import { prependDelim } from './delim';\nimport type {\n inferTranslationParamMap,\n inferTranslationShape,\n} from './parameterize.type';\nimport type { UnknownStringKeyObject } from './string-key-object.type';\n\nconst INTERNAL_SYMBOL = Symbol.for('mmstack-translate-internal');\n\ntype InternalSymbol = typeof INTERNAL_SYMBOL;\n\nexport type CompiledTranslation<\n T extends UnknownStringKeyObject,\n TNS extends string,\n TLocale extends string = string,\n> = {\n flat: Record<string, string>;\n locale?: TLocale;\n namespace: TNS;\n [INTERNAL_SYMBOL]: {\n shape: inferTranslationShape<T>;\n map: inferTranslationParamMap<TNS, T>;\n };\n};\n\nexport type mergeTranslationMaps<\n TMain extends CompiledTranslation<UnknownStringKeyObject, string>,\n TOther extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = Omit<TMain, InternalSymbol> & {\n [INTERNAL_SYMBOL]: {\n shape: inferCompiledTranslationShape<TMain>;\n map: inferCompiledTranslationMap<TOther> &\n inferCompiledTranslationMap<TMain>;\n };\n};\n\nexport type inferCompiledTranslationNamespace<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = T['namespace'];\n\nexport type inferCompiledTranslationShape<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = T[InternalSymbol]['shape'];\n\nexport type inferCompiledTranslationMap<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = T[InternalSymbol]['map'];\n\nfunction isTranslationObject(t: unknown): t is UnknownStringKeyObject {\n return typeof t === 'object' && t !== null;\n}\n\nfunction flattenTranslation<T extends UnknownStringKeyObject>(obj: T) {\n return Object.entries(obj).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string') {\n acc[key] = value;\n } else if (isTranslationObject(value)) {\n Object.entries(flattenTranslation(value)).forEach(\n ([nestedKey, nestedValue]) => {\n acc[prependDelim(key, nestedKey)] = nestedValue;\n },\n );\n }\n\n return acc;\n },\n {} as Record<string, string>,\n );\n}\n\nexport function compileTranslation<\n T extends UnknownStringKeyObject,\n TNS extends string,\n TLocale extends string = string,\n>(\n translation: T,\n ns: TNS,\n locale?: TLocale,\n): CompiledTranslation<T, TNS, TLocale> {\n type $Shape = inferTranslationShape<T>;\n type $Map = inferTranslationParamMap<TNS, T>;\n\n return {\n locale,\n flat: flattenTranslation(translation),\n namespace: ns,\n [INTERNAL_SYMBOL]: {\n shape: {} as $Shape,\n map: {} as $Map,\n },\n };\n}\n","import {\n type CompiledTranslation,\n compileTranslation,\n type inferCompiledTranslationShape,\n type mergeTranslationMaps,\n} from './compile';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\n\ntype TranslationNamespace<\n TNS extends string,\n T extends CompiledTranslation<UnknownStringKeyObject, TNS>,\n TShape extends UnknownStringKeyObject,\n> = {\n translation: T;\n createTranslation: <TLocale extends string>(\n locale: TLocale,\n translation: TShape,\n ) => CompiledTranslation<TShape, TNS, TLocale>;\n createMergedNamespace: <\n TOtherNS extends string,\n const TOther extends UnknownStringKeyObject,\n TOtherCompiled extends CompiledTranslation<TOther, TOtherNS>,\n >(\n ns: TOtherNS,\n translation: TOther,\n ) => TranslationNamespace<\n TOtherNS,\n mergeTranslationMaps<TOtherCompiled, T>,\n inferCompiledTranslationShape<TOtherCompiled>\n >;\n};\n\nexport function createNamespace<\n const T extends UnknownStringKeyObject,\n TNS extends string,\n>(ns: TNS, translation: T) {\n const compiled = compileTranslation<T, TNS>(translation, ns);\n\n type TCompiled = typeof compiled;\n type TShape = inferCompiledTranslationShape<typeof compiled>;\n\n const namespace: TranslationNamespace<TNS, TCompiled, TShape> = {\n translation: compiled,\n createTranslation: <TLocale extends string>(\n locale: TLocale,\n translation: TShape,\n ) => {\n return compileTranslation(translation, ns, locale);\n },\n createMergedNamespace: <\n TOther extends UnknownStringKeyObject,\n TOtherNS extends string,\n TOtherCompiled extends CompiledTranslation<TOther, TOtherNS> =\n CompiledTranslation<TOther, TOtherNS>,\n >(\n otherNs: TOtherNS,\n otherTranslation: TOther,\n ) => {\n return createNamespace(otherNs, otherTranslation) as TranslationNamespace<\n TOtherNS,\n mergeTranslationMaps<TOtherCompiled, TCompiled>,\n inferCompiledTranslationShape<TOtherCompiled>\n > as unknown as any;\n },\n };\n\n return namespace;\n}\n","import { computed, inject, type Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, type ParamMap, Router } from '@angular/router';\n\nexport function pathParam(\n key: string | (() => string),\n route = inject(ActivatedRoute),\n): Signal<string | null> {\n const keySignal =\n typeof key === 'string' ? computed(() => key) : computed(key);\n\n const routerOptions = inject(Router)['options'];\n\n if (\n routerOptions &&\n typeof routerOptions === 'object' &&\n routerOptions.paramsInheritanceStrategy === 'always'\n ) {\n const params = toSignal(route.paramMap, {\n initialValue: route.snapshot.paramMap,\n });\n\n return computed(() => params().get(keySignal()));\n }\n\n const paramMapSignals: Signal<ParamMap>[] = [];\n let currentRoute: ActivatedRoute | null = route;\n\n const isStatic = typeof key === 'string';\n\n while (currentRoute) {\n const initial = currentRoute.snapshot.paramMap;\n paramMapSignals.push(\n toSignal(currentRoute.paramMap, {\n initialValue: initial,\n }),\n );\n\n // For static keys, stop once we find the param, will find first in computed for loop already so basically noop for for loop\n if (isStatic && initial.has(key as string)) break;\n\n currentRoute = currentRoute.parent;\n }\n\n return computed(() => {\n const paramKey = keySignal();\n\n for (const map of paramMapSignals) {\n const v = map().get(paramKey);\n if (v) return v;\n }\n\n return null;\n });\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n InjectionToken,\n isDevMode,\n LOCALE_ID,\n type Provider,\n resource,\n type Signal,\n signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport { createIntl, createIntlCache, type IntlConfig } from '@formatjs/intl';\nimport { type CompiledTranslation } from './compile';\nimport { prependDelim } from './delim';\nimport { pathParam } from './path-param';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\n\nconst CONFIG_TOKEN = new InjectionToken<\n Omit<IntlConfig, 'locale' | 'messages'> & {\n supportedLocales?: string[];\n preloadDefaultLocale?: boolean;\n localeParamName?: string;\n }\n>('mmstack-intl-config');\n\nexport function provideIntlConfig(\n config: Omit<IntlConfig, 'locale' | 'messages'> & {\n /** Checks next locale is in provided array before switching locales */\n supportedLocales?: string[];\n /** Preloads the default locale ensuring sync fallback, not necessary for most cases as it will lazily load automatically when needed */\n preloadDefaultLocale?: boolean;\n /** Auto-resolution when using a locale parameter via angular router */\n localeParamName?: string;\n },\n): Provider[] {\n const providers: Provider[] = [\n {\n useFactory: (localeId: string) => {\n const next = {\n ...config,\n };\n\n const defaultLocale =\n config.defaultLocale ?? config.supportedLocales?.at(0) ?? localeId;\n\n if (\n next.supportedLocales &&\n !next.supportedLocales.includes(defaultLocale)\n ) {\n next.supportedLocales = [...next.supportedLocales, defaultLocale];\n }\n\n return next;\n },\n deps: [LOCALE_ID],\n provide: CONFIG_TOKEN,\n },\n ];\n\n const defaultLocale = config.defaultLocale ?? config.supportedLocales?.at(0);\n\n if (!defaultLocale) return providers;\n\n providers.push({\n provide: LOCALE_ID,\n useValue: defaultLocale,\n });\n\n return providers;\n}\n\nexport function injectIntlConfig() {\n return inject(CONFIG_TOKEN, { optional: true }) ?? undefined;\n}\n\nexport function injectDefaultLocale() {\n return injectIntlConfig()?.defaultLocale ?? inject(LOCALE_ID) ?? 'en-US';\n}\n\nexport function injectSupportedLocales() {\n return injectIntlConfig()?.supportedLocales ?? [injectDefaultLocale()];\n}\n\n/**\n * @internal\n * the actual locale signal used to store the current locale string\n */\nconst STORE_LOCALE = signal('en-US');\n\nexport function injectLocaleInternal() {\n return STORE_LOCALE;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationStore {\n private readonly cache = createIntlCache();\n private readonly config = injectIntlConfig();\n readonly loadQueue = signal<string[]>([]);\n readonly locale: WritableSignal<string>;\n private readonly defaultLocale = injectDefaultLocale();\n private readonly translations = signal<\n Record<string, Record<string, string>>\n >({\n [this.defaultLocale]: {},\n });\n private attemptedFallbackLoad = false;\n\n private readonly onDemandLoaders = new Map<\n string,\n Record<\n string,\n () => Promise<CompiledTranslation<UnknownStringKeyObject, string>>\n >\n >();\n\n private readonly nonMessageConfig = computed(() => ({\n ...this.config,\n locale: this.locale(),\n }));\n\n private readonly messages = computed(\n () =>\n this.translations()[this.locale()] ??\n this.translations()[this.defaultLocale] ??\n {},\n );\n\n readonly dynamicLocaleLoader = resource({\n params: computed(() => this.loadQueue().at(0) ?? null),\n loader: async ({ params: newLocale, abortSignal }) => {\n if (!newLocale) return;\n\n const currentTranslations = untracked(this.translations);\n\n const loadPromises: Promise<{\n namespace: string;\n flat: Record<string, string>;\n } | null>[] = [];\n\n for (const [namespace, loaders] of this.onDemandLoaders.entries()) {\n const loader = loaders[newLocale];\n if (loader) {\n const hasNamespaceForLocale =\n currentTranslations[newLocale] &&\n Object.keys(currentTranslations[newLocale]).some((key) =>\n key.startsWith(`${prependDelim(namespace, '').slice(0, -1)}`),\n );\n\n if (!hasNamespaceForLocale) {\n loadPromises.push(\n loader()\n .then((translation) => {\n if (abortSignal.aborted) return null;\n return {\n namespace: translation.namespace,\n flat: translation.flat,\n };\n })\n .catch((err) => {\n if (isDevMode()) {\n console.error(\n '[Translate] Failed to load',\n namespace,\n newLocale,\n err,\n );\n }\n\n return null;\n }),\n );\n }\n }\n }\n\n return Promise.all(loadPromises)\n .then((res) => res.filter((r) => r !== null))\n .then((res) => ({\n locales: res,\n locale: newLocale,\n }));\n },\n });\n\n readonly intl = computed(() =>\n createIntl(\n {\n ...this.nonMessageConfig(),\n messages: this.messages(),\n },\n this.cache,\n ),\n );\n\n constructor() {\n this.locale = STORE_LOCALE;\n this.locale.set(injectDefaultLocale());\n const paramName = this.config?.localeParamName;\n if (paramName) {\n const param = pathParam(paramName);\n\n effect(() => {\n const loc = param();\n if (\n !loc ||\n loc === untracked(this.locale) ||\n untracked(this.loadQueue).includes(loc)\n )\n return;\n if (this.hasLocaleLoaders(loc)) this.locale.set(loc);\n else this.loadQueue.update((q) => [...q, loc]);\n });\n }\n\n effect(() => {\n if (\n // should never be in error state, but best to check in case something throws\n this.dynamicLocaleLoader.error() ||\n this.dynamicLocaleLoader.isLoading()\n )\n return;\n const dynamicLocales = this.dynamicLocaleLoader.value();\n\n if (!dynamicLocales) return;\n\n // Register loaded translations\n for (const locale of dynamicLocales.locales) {\n this.register(locale.namespace, {\n [dynamicLocales.locale]: locale.flat,\n });\n }\n\n const hasTranslations =\n dynamicLocales.locales.length > 0 ||\n this.translations()[dynamicLocales.locale];\n\n if (hasTranslations) {\n this.loadQueue.update((q) =>\n q.filter((l) => l !== dynamicLocales.locale),\n );\n this.locale.set(dynamicLocales.locale);\n }\n });\n }\n\n formatMessage(key: string, values?: Record<string, string | number>) {\n const message =\n this.translations()[this.locale()]?.[key] ??\n this.translations()[this.defaultLocale]?.[key] ??\n '';\n\n if (!message) {\n if (this.attemptedFallbackLoad) return '';\n\n this.attemptedFallbackLoad = true;\n untracked(() => {\n if (!this.loadQueue().includes(this.defaultLocale))\n this.loadQueue.update((q) => [...q, this.defaultLocale]);\n });\n return '';\n }\n\n return this.intl().formatMessage(\n { id: key, defaultMessage: message },\n values,\n );\n }\n\n register(\n namespace: string,\n flat: Partial<Record<string, Record<string, string>>>,\n ) {\n this.translations.update((cur) => {\n return Object.entries(flat).reduce(\n (acc, [locale, translation]) => {\n const localeTranslation = acc[locale] ?? {};\n\n const withNS = Object.entries(translation ?? {}).reduce(\n (acc, [key, value]) => {\n acc[prependDelim(namespace, key)] = value;\n return acc;\n },\n {} as Record<string, string>,\n );\n\n acc[locale] = {\n ...localeTranslation,\n ...withNS,\n };\n\n return acc;\n },\n { ...cur },\n );\n });\n }\n\n registerOnDemandLoaders(\n namespace: string,\n loaders: Record<string, () => Promise<any>>,\n ) {\n this.onDemandLoaders.set(namespace, loaders);\n }\n\n hasLocaleLoaders(locale: string): boolean {\n return Array.from(this.onDemandLoaders.values()).some(\n (loaders) => loaders[locale],\n );\n }\n}\n\nexport function injectIntl() {\n return inject(TranslationStore).intl;\n}\n\n/**\n * Inject a dynamic locale signal that supports runtime language switching.\n *\n * @returns A writable signal with the current locale and loading state.\n * Only allows switching to locales that have registered loaders.\n *\n * @example\n * ```typescript\n * const locale = injectDynamicLocale();\n *\n * // Switch language (triggers automatic translation loading)\n * locale.set('sl-SI');\n *\n * // Check loading state\n * if (locale.isLoading()) {\n * // Show spinner\n * }\n * ```\n */\nexport function injectDynamicLocale(): WritableSignal<string> & {\n isLoading: Signal<boolean>;\n} {\n const store = inject(TranslationStore);\n const supportedLocales = injectIntlConfig()?.supportedLocales;\n\n const source = computed(() => store.locale()) as WritableSignal<string> & {\n isLoading: Signal<boolean>;\n };\n\n const inSupportedLocales =\n supportedLocales === undefined\n ? () => true\n : (locale: string) => supportedLocales.includes(locale);\n\n const set = (value: string) => {\n if (\n value === untracked(source) ||\n untracked(store.loadQueue).includes(value)\n )\n return;\n\n if (!inSupportedLocales(value)) {\n if (isDevMode())\n console.warn(\n `[Translate] Locale \"${value}\" is not in supportedLocales, switch prevented. Available options are:`,\n supportedLocales,\n );\n\n return;\n }\n\n if (isDevMode() && !store.hasLocaleLoaders(value))\n console.warn(\n `[Translate] No loaders registered for locale \"${value}\". Switching to this locale will have no effect.`,\n );\n\n store.loadQueue.update((q) => [...q, value]);\n };\n\n source.set = set;\n source.update = (updater: (value: string) => string) => {\n const next = updater(untracked(source));\n source.set(next);\n };\n source.asReadonly = () => source;\n\n source.isLoading = store.dynamicLocaleLoader.isLoading;\n\n return source;\n}\n","import { isSignal, type Signal } from '@angular/core';\n\nexport function unwrap<T>(value: T | Signal<T>): T {\n return isSignal(value) ? value() : value;\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\nconst FORMAT_PRESETS: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short', timeStyle: 'short' },\n medium: { dateStyle: 'medium', timeStyle: 'medium' },\n long: { dateStyle: 'long', timeStyle: 'long' },\n full: { dateStyle: 'full', timeStyle: 'full' },\n\n shortDate: { dateStyle: 'short' },\n mediumDate: { dateStyle: 'medium' },\n longDate: { dateStyle: 'long' },\n fullDate: { dateStyle: 'full' },\n\n shortTime: { timeStyle: 'short' },\n mediumTime: { timeStyle: 'medium' },\n longTime: { timeStyle: 'long' },\n fullTime: { timeStyle: 'full' },\n};\n\ntype DateFormat = keyof typeof FORMAT_PRESETS;\n\n/**\n * Supported date inputs\n */\nexport type SupportedDateInput = Date | string | number | null | undefined;\n\n/**\n * Options for formatting a date\n */\nexport type FormatDateOptions = {\n /**\n * Timezone to use for formatting\n */\n tz?: string;\n /**\n * Format to use for formatting\n * @default 'medium'\n */\n format?: DateFormat;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nfunction validDateOrNull(\n date: Date | string | number | null | undefined,\n): Date | null {\n if (date == null) return null;\n\n const d = date instanceof Date ? date : new Date(date);\n return isNaN(d.getTime()) ? null : d;\n}\n\nconst cache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getFormatter(\n locale: string,\n format: DateFormat,\n timeZone?: string,\n): Intl.DateTimeFormat {\n const cacheKey = `${locale}|${format}|${timeZone ?? ''}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(locale, {\n ...FORMAT_PRESETS[format],\n timeZone,\n });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\n/**\n * Format a date using the current or provided locale & timezone\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param date - Date to format\n * @param opt - Options for formatting\n * @returns Formatted date string\n */\nexport function formatDate(\n date: SupportedDateInput | Signal<SupportedDateInput>,\n opt?: FormatDateOptions | Signal<FormatDateOptions>,\n): string {\n const validDate = validDateOrNull(unwrap(date));\n if (validDate === null) return '';\n\n const unwrappedOpt = unwrap(opt);\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.format ?? 'medium',\n unwrappedOpt?.tz,\n ).format(validDate);\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\nconst cache = new Map<string, Intl.DisplayNames>();\n\n/**\n * Options for formatting a display name\n */\nexport type FormatDisplayNameOptions = {\n /**\n * The display style for the result set\n */\n style: Intl.RelativeTimeFormatStyle;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nfunction getFormatter(\n locale: string,\n type: Intl.DisplayNamesType,\n style: Intl.RelativeTimeFormatStyle,\n): Intl.DisplayNames {\n const cacheKey = `${locale}|${type}|${style}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.DisplayNames(locale, {\n type,\n style,\n });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\ntype SupportedCode = string | null | undefined;\n\n/**\n * Format a display name using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param value - The code to format\n * @param type - The type of display name to format\n * @param opt - Options for formatting\n * @returns Formatted display name string\n */\nexport function formatDisplayName(\n value: SupportedCode | Signal<SupportedCode>,\n type: Intl.DisplayNamesType | Signal<Intl.DisplayNamesType>,\n opt?: FormatDisplayNameOptions | Signal<FormatDisplayNameOptions>,\n): string {\n const unwrapped = unwrap(value);\n if (!unwrapped?.trim()) return '';\n\n const unwrappedType = unwrap(type);\n const unwrappedOpt = unwrap(opt);\n\n const locale = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return (\n getFormatter(locale, unwrappedType, unwrappedOpt?.style ?? 'long').of(\n unwrapped,\n ) ?? ''\n );\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\ntype ListType = 'conjunction' | 'disjunction' | 'unit';\ntype ListStyle = 'long' | 'short' | 'narrow';\n\nexport type SupportedListInput = string[] | null | undefined;\n\nconst cache = new Map<string, Intl.ListFormat>();\n\n/**\n * Options for formatting a list\n */\nexport type FormatListOptions = {\n /**\n * The type of list to format\n */\n type?: ListType;\n /**\n * The style of list to format\n */\n style?: ListStyle;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nconst EMPTY_ARRAY: string[] = [];\n\nfunction unwrapList(\n value: SupportedListInput | Signal<SupportedListInput>,\n): string[] {\n const unwrapped = unwrap(value);\n return Array.isArray(unwrapped) ? unwrapped : EMPTY_ARRAY;\n}\n\nfunction getFormatter(\n locale: string,\n type: ListType,\n style: ListStyle,\n): Intl.ListFormat {\n const cacheKey = `${locale}|${type}|${style}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.ListFormat(locale, { type, style });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\n/**\n * Format a list using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param value - The list to format\n * @param opt - Options for formatting\n * @returns Formatted list string\n */\nexport function formatList(\n value: SupportedListInput | Signal<SupportedListInput>,\n opt?: FormatListOptions | Signal<FormatListOptions>,\n): string {\n const unwrapped = unwrapList(value);\n if (unwrapped.length === 0) return '';\n\n const unwrappedOpt = unwrap(opt);\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.type ?? 'conjunction',\n unwrappedOpt?.style ?? 'long',\n ).format(unwrapped);\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\ntype NumberNotation = 'standard' | 'scientific' | 'engineering' | 'compact';\n\ntype SupportedNumberValue = number | null | undefined;\n\nconst cache = new Map<string, Intl.NumberFormat>();\n\nfunction unwrapValue(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n fallbackToZero = false,\n): number | null {\n const unwrapped = unwrap(value);\n\n if (unwrapped === null || unwrapped === undefined || isNaN(unwrapped))\n return fallbackToZero ? 0 : null;\n\n return unwrapped;\n}\n\n/**\n * Options for formatting a number\n */\nexport type FormatNumberOptions = {\n /**\n * The notation to use for formatting\n */\n notation?: NumberNotation;\n /**\n * Minimum number of fraction digits to use\n */\n minFractionDigits?: number;\n /**\n * Maximum number of fraction digits to use\n */\n maxFractionDigits?: number;\n /**\n * Whether to use grouping\n */\n useGrouping?: boolean;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n /**\n * If the number is not a valid number, return formatted 0. By default formatter returns an empty string\n * @default false\n */\n fallbackToZero?: boolean;\n};\n\nfunction getFormatter(\n locale: string,\n minFractionDigits: number | undefined,\n maxFractionDigits: number | undefined,\n useGrouping?: boolean,\n notation?: NumberNotation,\n currency?: string,\n display?: CurrencyDisplay,\n style?: 'currency' | 'percent',\n): Intl.NumberFormat {\n const cacheKey = `${locale}|${notation ?? 'standard'}|${minFractionDigits}|${maxFractionDigits}|${useGrouping ?? true}|${currency ?? 'none'}|${display ?? 'none'}|${style ?? 'decimal'}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, {\n style,\n notation,\n minimumFractionDigits: minFractionDigits,\n maximumFractionDigits: maxFractionDigits,\n useGrouping,\n currency,\n currencyDisplay: display,\n });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\n/**\n * Format a number using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param number - Number to format\n * @param opt - Options for formatting\n * @returns Formatted number string\n */\nexport function formatNumber(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n opt?: FormatNumberOptions | Signal<FormatNumberOptions>,\n): string {\n const unwrappedOpt = unwrap(opt);\n const unwrappedNumber = unwrapValue(value, unwrappedOpt?.fallbackToZero);\n\n if (unwrappedNumber === null) return '';\n\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.minFractionDigits,\n unwrappedOpt?.maxFractionDigits,\n unwrappedOpt?.useGrouping ?? true,\n unwrappedOpt?.notation ?? 'standard',\n ).format(unwrappedNumber);\n}\n\n/**\n * Options for formatting a percentage value\n */\nexport type FormatPercentOptions = {\n /**\n * Minimum number of fraction digits to use\n */\n minFractionDigits?: number;\n /**\n * Maximum number of fraction digits to use\n */\n maxFractionDigits?: number;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n /**\n * If the number is not a valid number, return formatted 0. By default formatter returns an empty string\n * @default false\n */\n fallbackToZero?: boolean;\n};\n\n/**\n * Format a percentage using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param number - Number to format\n * @param opt - Options for formatting\n * @returns Formatted percentage string\n */\nexport function formatPercent(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n opt?: FormatPercentOptions | Signal<FormatPercentOptions>,\n): string {\n const unwrappedOpt = unwrap(opt);\n\n const unwrappedNumber = unwrapValue(value, unwrappedOpt?.fallbackToZero);\n\n if (unwrappedNumber === null) return '';\n\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.minFractionDigits,\n unwrappedOpt?.maxFractionDigits,\n undefined,\n undefined,\n undefined,\n undefined,\n 'percent',\n ).format(unwrappedNumber);\n}\n\ntype CurrencyDisplay = 'symbol' | 'narrowSymbol' | 'code' | 'name';\n\n/**\n * Options for formatting a currency\n */\nexport type FormatCurrencyOptions = {\n /*\n * The display type for the currency format\n */\n display?: CurrencyDisplay;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n /**\n * If the number is not a valid number, return formatted 0. By default formatter returns an empty string\n * @default false\n */\n fallbackToZero?: boolean;\n};\n\nexport function formatCurrency(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n currency: string | Signal<string>,\n opt?: FormatCurrencyOptions | Signal<FormatCurrencyOptions>,\n): string {\n const unwrappedOpt = unwrap(opt);\n const unwrappedValue = unwrapValue(value, unwrappedOpt?.fallbackToZero);\n\n if (unwrappedValue === null) return '';\n\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n undefined,\n undefined,\n undefined,\n undefined,\n unwrap(currency),\n unwrappedOpt?.display ?? 'symbol',\n 'currency',\n ).format(unwrappedValue);\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\nconst cache = new Map<string, Intl.RelativeTimeFormat>();\n\n/**\n * Options for formatting a relative time value\n */\nexport type FormatRelativeTimeOptions = {\n /**\n * The length of the internationalized message.\n * @default 'long'\n */\n style?: Intl.RelativeTimeFormatStyle;\n /**\n * Controls whether to use numeric values in the output.\n * @default 'always'\n */\n numeric?: Intl.RelativeTimeFormatNumeric;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nfunction getFormatter(\n locale: string,\n style: Intl.RelativeTimeFormatStyle,\n numeric: Intl.RelativeTimeFormatNumeric,\n): Intl.RelativeTimeFormat {\n const cacheKey = `${locale}|${style}|${numeric}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.RelativeTimeFormat(locale, { style, numeric });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\nexport type RelativeTimeUnit = Intl.RelativeTimeFormatUnit;\n\ntype SupportedRelativeTimeInput = number | null | undefined;\n\n/**\n * Format a relative time using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param value - The numeric value to use in the relative time internationalization message\n * @param unit - The unit to use in the relative time internationalization message\n * @param opt - Options for formatting\n * @returns Formatted relative time string\n */\nexport function formatRelativeTime(\n value: SupportedRelativeTimeInput | Signal<SupportedRelativeTimeInput>,\n unit: RelativeTimeUnit | Signal<RelativeTimeUnit>,\n opt?: FormatRelativeTimeOptions | Signal<FormatRelativeTimeOptions>,\n): string {\n const unwrappedValue = unwrap(value);\n if (\n unwrappedValue === null ||\n unwrappedValue === undefined ||\n isNaN(unwrappedValue)\n )\n return '';\n\n const unwrappedUnit = unwrap(unit);\n if (!unwrappedUnit) return '';\n\n const unwrappedOpt = unwrap(opt);\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.style ?? 'long',\n unwrappedOpt?.numeric ?? 'always',\n ).format(unwrappedValue, unwrappedUnit);\n}\n","import { inject, untracked } from '@angular/core';\nimport { type ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { injectIntlConfig, TranslationStore } from './translation-store';\n\nexport function injectResolveParamLocale(snapshot: ActivatedRouteSnapshot) {\n let locale: string | null = null;\n\n const paramName = injectIntlConfig()?.localeParamName;\n\n const routerConfig = inject(Router)['options'];\n\n const alwaysInheritParams =\n typeof routerConfig === 'object' &&\n !!routerConfig &&\n routerConfig.paramsInheritanceStrategy === 'always';\n\n if (paramName) {\n locale = snapshot.paramMap.get(paramName);\n\n if (!locale && !alwaysInheritParams) {\n let currentRoute: ActivatedRouteSnapshot | null = snapshot;\n while (currentRoute && !locale) {\n locale = currentRoute.paramMap.get('locale');\n currentRoute = currentRoute.parent;\n }\n }\n }\n\n if (!locale) {\n locale = untracked(inject(TranslationStore).locale);\n }\n\n return locale;\n}\n","import {\n computed,\n inject,\n isDevMode,\n isSignal,\n untracked,\n type Signal,\n} from '@angular/core';\nimport { type ResolveFn } from '@angular/router';\nimport {\n compileTranslation,\n type CompiledTranslation,\n type inferCompiledTranslationMap,\n type inferCompiledTranslationNamespace,\n} from './compile';\nimport { replaceWithDelim } from './delim';\nimport { injectResolveParamLocale } from './resovler-locale';\nimport {\n type AnyStringRecord,\n type UnknownStringKeyObject,\n} from './string-key-object.type';\nimport {\n injectDefaultLocale,\n injectIntlConfig,\n TranslationStore,\n} from './translation-store';\n\nfunction createEqualsRecord<T extends AnyStringRecord>(keys: (keyof T)[] = []) {\n let keyMatcher: (a: T, b: T) => boolean;\n\n if (keys.length === 0) {\n keyMatcher = () => true;\n } else if (keys.length === 1) {\n const key = keys[0];\n keyMatcher = (a, b) => a[key] === b[key];\n } else {\n keyMatcher = (a, b) => {\n return keys.every((k) => a[k] === b[k]);\n };\n }\n\n return (a?: T, b?: T): boolean => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return keyMatcher(a, b);\n };\n}\n\ntype TFunction<TMap extends AnyStringRecord> = <\n TKey extends keyof TMap & string,\n>(\n key: TKey,\n ...args: TMap[TKey] extends void ? [] : [TMap[TKey]]\n) => string;\n\ntype SignalTFunction<TMap extends AnyStringRecord> = <\n TKey extends keyof TMap & string,\n>(\n key: TKey,\n ...args: TMap[TKey] extends void ? [] : [() => TMap[TKey]]\n) => Signal<string>;\n\ntype TFunctionWithSignalConstructor<\n TMap extends AnyStringRecord,\n TFN extends TFunction<TMap>,\n> = TFN & {\n asSignal: SignalTFunction<TMap>;\n};\n\nfunction addSignalFn<TMap extends AnyStringRecord, TFn extends TFunction<TMap>>(\n fn: TFn,\n store: TranslationStore,\n keyMap: Map<string, string>,\n): TFunctionWithSignalConstructor<TMap, TFn> {\n const withSig = fn as TFunctionWithSignalConstructor<TMap, TFn>;\n\n const asSignal = <TKey extends keyof TMap & string>(\n key: TKey,\n variables?: () => AnyStringRecord,\n ): Signal<string> => {\n const stringKey = key as string;\n\n let flatPath = keyMap.get(stringKey);\n\n if (flatPath === undefined) {\n flatPath = replaceWithDelim(stringKey);\n keyMap.set(stringKey, flatPath);\n }\n\n const varsFn = variables ?? (() => undefined);\n const varsSignal = isSignal(varsFn)\n ? varsFn\n : computed(varsFn, {\n equal: createEqualsRecord(Object.keys(varsFn() ?? {})),\n });\n\n return computed(() => store.formatMessage(flatPath, varsSignal()));\n };\n\n withSig.asSignal = asSignal as unknown as TFunctionWithSignalConstructor<\n TMap,\n TFn\n >['asSignal'];\n\n return withSig;\n}\n\nexport function createT<TMap extends AnyStringRecord>(\n store: TranslationStore,\n keyMap = new Map<string, string>(),\n): TFunction<TMap> {\n const fn = <TKey extends keyof TMap & string>(\n key: TKey,\n variables?: AnyStringRecord,\n ): string => {\n const stringKey = key as string;\n\n let k = keyMap.get(stringKey);\n\n if (k === undefined) {\n k = replaceWithDelim(stringKey);\n keyMap.set(stringKey, k);\n }\n\n return store.formatMessage(k, variables);\n };\n\n return fn as unknown as TFunction<TMap>;\n}\n\nexport function registerNamespace<\n TDefault extends CompiledTranslation<UnknownStringKeyObject, string>,\n>(\n defaultTranslation: () => Promise<TDefault>,\n other: Record<\n string,\n () => Promise<\n CompiledTranslation<\n UnknownStringKeyObject,\n inferCompiledTranslationNamespace<TDefault>,\n string\n >\n >\n >,\n) {\n type $Map = inferCompiledTranslationMap<TDefault>;\n type $BaseTFN = TFunction<$Map>;\n type $TFN = TFunctionWithSignalConstructor<$Map, $BaseTFN>;\n\n const keyMap = new Map<string, string>();\n\n const injectT = (): $TFN => {\n const store = inject(TranslationStore);\n\n return addSignalFn(createT(store, keyMap), store, keyMap);\n };\n\n let defaultTranslationLoaded = false;\n const resolver: ResolveFn<void> = async (snapshot) => {\n const store = inject(TranslationStore);\n\n const locale = injectResolveParamLocale(snapshot);\n\n const defaultLocale = injectDefaultLocale();\n const shouldPreloadDefault =\n injectIntlConfig()?.preloadDefaultLocale ?? false;\n\n const tPromise = other[locale] as (typeof other)[string] | undefined;\n\n const promise = tPromise ?? defaultTranslation;\n if (!promise && isDevMode()) {\n return console.warn(`No translation found for locale: ${locale}`);\n }\n\n if (promise === defaultTranslation && defaultTranslationLoaded) return;\n\n try {\n const promises = [promise()];\n\n if (\n shouldPreloadDefault &&\n !defaultTranslationLoaded &&\n promise !== defaultTranslation\n )\n promises.push(defaultTranslation());\n\n const translations = await Promise.allSettled(promises);\n\n const fullfilled = translations.map((t) =>\n t.status === 'fulfilled' ? t.value : null,\n );\n\n if (fullfilled.at(0) === null && fullfilled.at(1) === null)\n throw new Error('Failed to load translations');\n\n const [t, defaultT] = fullfilled;\n\n const ns = t?.namespace ?? defaultT?.namespace;\n if (!ns) throw new Error('No namespace found in translation');\n\n if (isDevMode() && t && t.locale !== locale && t.locale)\n console.warn(`Expected locale to be ${locale} but got ${t.locale}`);\n\n store.registerOnDemandLoaders(ns, {\n ...other,\n [defaultLocale]: defaultTranslation,\n });\n\n const toRegister: Record<string, Record<string, string>> = {};\n if (t) toRegister[locale] = t.flat;\n if (defaultT) toRegister[defaultLocale] = defaultT.flat;\n\n store.register(ns, toRegister);\n\n if (promise === defaultTranslation || defaultT)\n defaultTranslationLoaded = true;\n } catch {\n if (isDevMode()) {\n console.warn(`Failed to load translation for locale: ${locale}`);\n }\n } finally {\n if (locale !== untracked(store.locale)) store.locale.set(locale);\n }\n };\n\n return {\n injectNamespaceT: injectT,\n resolveNamespaceTranslation: resolver,\n };\n}\n\ntype UntypedTFunction<TNS extends string> = {\n (key: `${TNS}.${string}`, args?: Record<string, string>): string;\n asSignal: (\n key: `${TNS}.${string}`,\n args?: () => Record<string, string>,\n ) => Signal<string>;\n};\n\n/**\n * Registers a type-unsafe namespace, meant for remote loading of unknown key-value pairs using mmstack/translate infrastructure\n * The resolver & t function work the same as they would with typed namespaces, but without type safety\n */\nexport function registerRemoteNamespace<TNS extends string>(\n ns: TNS,\n defaultTranslation: () => Promise<Record<string, string>>,\n other: Record<string, () => Promise<Record<string, string>>>,\n) {\n const keyMap = new Map<string, string>();\n\n const injectT = (): UntypedTFunction<TNS> => {\n const store = inject(TranslationStore);\n\n return addSignalFn(\n createT(store, keyMap),\n store,\n keyMap,\n ) as UntypedTFunction<TNS>;\n };\n\n let defaultTranslationLoaded = false;\n const resolver: ResolveFn<void> = async (snapshot) => {\n const store = inject(TranslationStore);\n\n const locale = injectResolveParamLocale(snapshot);\n\n const defaultLocale = injectDefaultLocale();\n const shouldPreloadDefault =\n injectIntlConfig()?.preloadDefaultLocale ?? false;\n\n const tPromise = other[locale] as (typeof other)[string] | undefined;\n\n const promise = tPromise ?? defaultTranslation;\n\n if (!promise && isDevMode()) {\n return console.warn(`No translation found for locale: ${locale}`);\n }\n\n if (promise === defaultTranslation && defaultTranslationLoaded) return;\n\n try {\n const promises = [promise()];\n\n if (\n shouldPreloadDefault &&\n !defaultTranslationLoaded &&\n promise !== defaultTranslation\n )\n promises.push(defaultTranslation());\n\n const translations = await Promise.allSettled(promises);\n\n const fullfilled = translations.map((t) =>\n t.status === 'fulfilled' ? t.value : null,\n );\n\n if (fullfilled.at(0) === null && fullfilled.at(1) === null)\n throw new Error('Failed to load translations');\n\n const [baseT, baseDefaultT] = fullfilled;\n\n const t = baseT ? compileTranslation(baseT, ns, locale) : null;\n const defaultT = baseDefaultT\n ? compileTranslation(baseDefaultT, ns, defaultLocale)\n : null;\n\n if (isDevMode() && t && t.locale !== locale && t.locale)\n console.warn(`Expected locale to be ${locale} but got ${t.locale}`);\n\n store.registerOnDemandLoaders(ns, {\n ...other,\n [defaultLocale]: defaultTranslation,\n });\n\n const toRegister: Record<string, Record<string, string>> = {};\n if (t) toRegister[locale] = t.flat;\n if (defaultT) toRegister[defaultLocale] = defaultT.flat;\n\n store.register(ns, toRegister);\n\n if (promise === defaultTranslation || defaultT)\n defaultTranslationLoaded = true;\n } catch {\n if (isDevMode()) {\n console.warn(`Failed to load translation for locale: ${locale}`);\n }\n } finally {\n if (locale !== untracked(store.locale)) store.locale.set(locale);\n }\n };\n\n return {\n injectNamespaceT: injectT,\n resolveNamespaceTranslation: resolver,\n };\n}\n","import { inject } from '@angular/core';\nimport {\n Router,\n type CanMatchFn,\n type Route,\n type UrlSegment,\n} from '@angular/router';\nimport {\n injectDefaultLocale,\n injectSupportedLocales,\n} from './translation-store';\n\n/**\n * Guard that validates the locale parameter against supported locales.\n * Redirects to default locale if the locale is invalid.\n *\n * @param prefixSegments Optional array of path segments preceding the locale segment.\n * if (you wanted to match /app/:locale/... you would pass ['app'] here) & the function would match the second parameter + redirect accordingly\n *\n * @example\n * ```typescript\n * {\n * path: ':locale',\n * canMatch: [canMatchLocale()],\n * children: [...]\n * }\n * ```\n */\nexport function canMatchLocale(prefixSegments: string[] = []): CanMatchFn {\n return (_route: Route, segments: UrlSegment[]) => {\n const supportedLocales = injectSupportedLocales();\n\n const locale = segments.at(prefixSegments.length)?.path;\n\n if (!locale || !supportedLocales.includes(locale))\n return inject(Router).createUrlTree([\n ...prefixSegments,\n injectDefaultLocale(),\n ]);\n\n return true;\n };\n}\n","import {\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n Renderer2,\n} from '@angular/core';\nimport {\n type CompiledTranslation,\n type inferCompiledTranslationMap,\n} from './compile';\nimport { createT } from './register-namespace';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\nimport { TranslationStore } from './translation-store';\n\nfunction compareObjects(\n a?: Record<string, string>,\n b?: Record<string, string>,\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every((key) => a[key] === b[key]);\n}\n\n@Directive()\nexport abstract class Translate<\n TInput extends string,\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T> = inferCompiledTranslationMap<T>,\n TKey extends TInput & keyof TMap & string = TInput & keyof TMap & string,\n> {\n private readonly t = createT(inject(TranslationStore));\n\n readonly translate =\n input.required<\n TMap[TKey] extends void\n ? TKey | [key: TKey]\n : [key: TKey, vars: TMap[TKey]]\n >();\n\n constructor() {\n const inputs = computed(() => this.translate(), {\n equal: (a, b) => {\n if (a === b) return true;\n if (typeof a === 'string' || typeof b === 'string') return false;\n if (a[0] !== b[0]) return false;\n return compareObjects(\n a[1] as Record<string, string>,\n b[1] as Record<string, string>,\n );\n },\n });\n\n const translation = computed(() => {\n const inp = inputs();\n return typeof inp === 'string'\n ? this.t(inp)\n : this.t(inp[0], inp[1] as Record<string, string>);\n });\n\n const renderer = inject(Renderer2);\n const el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n afterRenderEffect({\n write: () => {\n renderer.setProperty(el.nativeElement, 'textContent', translation());\n },\n });\n }\n}\n","import { ChangeDetectorRef, effect, inject } from '@angular/core';\nimport {\n type CompiledTranslation,\n type inferCompiledTranslationMap,\n} from './compile';\nimport { createT } from './register-namespace';\nimport {\n type AnyStringRecord,\n type UnknownStringKeyObject,\n} from './string-key-object.type';\nimport { TranslationStore } from './translation-store';\n\ntype TransformTFn<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T>,\n> = <TKey extends keyof TMap & string>(\n key: TKey,\n ...args: TMap[TKey] extends void\n ? [locale?: string]\n : [TMap[TKey], locale?: string]\n) => string;\n\nfunction createTransformFn<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T>,\n>(): TransformTFn<T, TMap> {\n const store = inject(TranslationStore);\n const t = createT<TMap>(store);\n\n const fn = <TKey extends keyof TMap & string>(\n key: TKey,\n variablesOrLocale?: string | AnyStringRecord,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _?: string, // maybeLocale\n ): string => {\n const vars =\n typeof variablesOrLocale === 'string' ? undefined : variablesOrLocale;\n\n return (t as (key: TKey, vars?: AnyStringRecord) => string)(key, vars);\n };\n\n return fn as unknown as TransformTFn<T, TMap>;\n}\n\nexport abstract class Translator<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T> = inferCompiledTranslationMap<T>,\n> {\n constructor() {\n const cdr = inject(ChangeDetectorRef);\n const locale = inject(TranslationStore).locale;\n\n effect(() => {\n locale();\n cdr.markForCheck();\n });\n }\n\n transform = createTransformFn<T, TMap>();\n}\n","import { type Provider, signal } from '@angular/core';\nimport { createIntl, createIntlCache, type IntlShape } from '@formatjs/intl';\nimport { compileTranslation } from '../compile';\nimport { type UnknownStringKeyObject } from '../string-key-object.type';\nimport { TranslationStore } from '../translation-store';\n\n/**\n * Options designed to feed into the mock translations function.\n */\nexport interface MockTranslationOptions {\n /**\n * If provided, allows overriding the default behavior of simply echoing translation keys back.\n * Format: Record of namespace -> (Translation shape similar to what you pass to `createNamespace`)\n *\n * Example:\n * ```ts\n * {\n * home: { title: 'Mocked Title' },\n * auth: { error: 'Mocked Error' }\n * }\n * ```\n */\n translations?: Record<string, UnknownStringKeyObject>;\n\n /**\n * When true, uses `@formatjs/intl` to process ICU message syntax (e.g. `{name}`, plurals, selects).\n * This gives you real variable interpolation in your test assertions.\n *\n * @default false — values are ignored and the raw message string is returned.\n *\n * @example\n * ```ts\n * provideMockTranslations({\n * translations: { home: { greet: 'Hello {name}' } },\n * formatValues: true,\n * })\n * // t('home.greet', { name: 'Alice' }) → 'Hello Alice'\n * ```\n */\n formatValues?: boolean;\n\n /**\n * The locale to use when `formatValues` is true.\n * @default 'en-US'\n */\n locale?: string;\n}\n\n/**\n * Provides an isolated mock `TranslationStore` usable across testing modules that use components\n * depending on `@mmstack/translate` APIs (like `Translate` directive, `Translator` pipe, or `injectNamespaceT`).\n *\n * This provider intercepts all translation logic, bypassing chunk loaders and Intl.\n * When a custom configuration isn't provided, formatMessage simply echoes the translation key, using dots `.`.\n *\n * ### Usage\n * ```typescript\n * TestBed.configureTestingModule({\n * providers: [provideMockTranslations()]\n * });\n * ```\n */\nexport function provideMockTranslations(\n options?: MockTranslationOptions,\n): Provider[] {\n // We compile the mock strings to flat delimiters just like the internal compile module.\n const mappedMocks: Record<string, string> = {};\n\n if (options?.translations) {\n for (const [namespace, translationObj] of Object.entries(\n options.translations,\n )) {\n const compiled = compileTranslation(translationObj, namespace);\n\n for (const [key, val] of Object.entries(compiled.flat)) {\n // e.g. from 'home::MMT_DELIM::title'\n const fullKey = `${namespace}::MMT_DELIM::${key}`;\n mappedMocks[fullKey] = val;\n }\n }\n }\n\n const locale = options?.locale ?? 'en-US';\n\n let intl: IntlShape | undefined;\n\n if (options?.formatValues) {\n intl = createIntl({ locale, messages: mappedMocks }, createIntlCache());\n }\n\n return [\n {\n provide: TranslationStore,\n useValue: {\n locale: signal(locale),\n formatMessage: (\n key: string,\n values?: Record<string, string | number>,\n ) => {\n const message = mappedMocks[key];\n\n if (!message) {\n // Fallback to echoing the key back in dot notation (more readable for unit assertions).\n return key.replaceAll('::MMT_DELIM::', '.');\n }\n\n if (intl) {\n return intl.formatMessage(\n { id: key, defaultMessage: message },\n values,\n );\n }\n\n return message;\n },\n hasLocaleLoaders: () => false,\n register: () => {\n // noop\n },\n registerOnDemandLoaders: () => {\n // noop\n },\n dynamicLocaleLoader: {\n isLoading: signal(false),\n value: signal(null),\n error: signal(null),\n },\n loadQueue: signal([]),\n },\n },\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["cache","getFormatter"],"mappings":"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"}
1
+ {"version":3,"file":"mmstack-translate.mjs","sources":["../../../../packages/translate/src/lib/delim.ts","../../../../packages/translate/src/lib/compile.ts","../../../../packages/translate/src/lib/create-namespace.ts","../../../../packages/translate/src/lib/path-param.ts","../../../../packages/translate/src/lib/translation-store.ts","../../../../packages/translate/src/lib/format/unwrap.ts","../../../../packages/translate/src/lib/format/date.ts","../../../../packages/translate/src/lib/format/display-name.ts","../../../../packages/translate/src/lib/format/list.ts","../../../../packages/translate/src/lib/format/numeric.ts","../../../../packages/translate/src/lib/format/relative-time.ts","../../../../packages/translate/src/lib/resovler-locale.ts","../../../../packages/translate/src/lib/register-namespace.ts","../../../../packages/translate/src/lib/route-helpers.ts","../../../../packages/translate/src/lib/translate.ts","../../../../packages/translate/src/lib/translator.ts","../../../../packages/translate/src/lib/testing/provide-mock-translations.ts","../../../../packages/translate/src/mmstack-translate.ts"],"sourcesContent":["const KEY_DELIM = '::MMT_DELIM::';\n\nexport function prependDelim(prefix: string, key: string): string {\n return `${prefix}${KEY_DELIM}${key}`;\n}\n\nexport function replaceWithDelim(str: string, repl = '.'): string {\n return str.replaceAll(repl, KEY_DELIM);\n}\n","import { prependDelim } from './delim';\nimport type {\n inferTranslationParamMap,\n inferTranslationShape,\n} from './parameterize.type';\nimport type { UnknownStringKeyObject } from './string-key-object.type';\n\nconst INTERNAL_SYMBOL = Symbol.for('mmstack-translate-internal');\n\ntype InternalSymbol = typeof INTERNAL_SYMBOL;\n\nexport type CompiledTranslation<\n T extends UnknownStringKeyObject,\n TNS extends string,\n TLocale extends string = string,\n> = {\n flat: Record<string, string>;\n locale?: TLocale;\n namespace: TNS;\n [INTERNAL_SYMBOL]: {\n shape: inferTranslationShape<T>;\n map: inferTranslationParamMap<TNS, T>;\n };\n};\n\nexport type mergeTranslationMaps<\n TMain extends CompiledTranslation<UnknownStringKeyObject, string>,\n TOther extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = Omit<TMain, InternalSymbol> & {\n [INTERNAL_SYMBOL]: {\n shape: inferCompiledTranslationShape<TMain>;\n map: inferCompiledTranslationMap<TOther> &\n inferCompiledTranslationMap<TMain>;\n };\n};\n\nexport type inferCompiledTranslationNamespace<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = T['namespace'];\n\nexport type inferCompiledTranslationShape<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = T[InternalSymbol]['shape'];\n\nexport type inferCompiledTranslationMap<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n> = T[InternalSymbol]['map'];\n\nfunction isTranslationObject(t: unknown): t is UnknownStringKeyObject {\n return typeof t === 'object' && t !== null;\n}\n\nfunction flattenTranslation<T extends UnknownStringKeyObject>(obj: T) {\n return Object.entries(obj).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string') {\n acc[key] = value;\n } else if (isTranslationObject(value)) {\n Object.entries(flattenTranslation(value)).forEach(\n ([nestedKey, nestedValue]) => {\n acc[prependDelim(key, nestedKey)] = nestedValue;\n },\n );\n }\n\n return acc;\n },\n {} as Record<string, string>,\n );\n}\n\nexport function compileTranslation<\n T extends UnknownStringKeyObject,\n TNS extends string,\n TLocale extends string = string,\n>(\n translation: T,\n ns: TNS,\n locale?: TLocale,\n): CompiledTranslation<T, TNS, TLocale> {\n type $Shape = inferTranslationShape<T>;\n type $Map = inferTranslationParamMap<TNS, T>;\n\n return {\n locale,\n flat: flattenTranslation(translation),\n namespace: ns,\n [INTERNAL_SYMBOL]: {\n shape: {} as $Shape,\n map: {} as $Map,\n },\n };\n}\n","import {\n type CompiledTranslation,\n compileTranslation,\n type inferCompiledTranslationShape,\n type mergeTranslationMaps,\n} from './compile';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\n\ntype TranslationNamespace<\n TNS extends string,\n T extends CompiledTranslation<UnknownStringKeyObject, TNS>,\n TShape extends UnknownStringKeyObject,\n> = {\n translation: T;\n createTranslation: <TLocale extends string>(\n locale: TLocale,\n translation: TShape,\n ) => CompiledTranslation<TShape, TNS, TLocale>;\n createMergedNamespace: <\n TOtherNS extends string,\n const TOther extends UnknownStringKeyObject,\n TOtherCompiled extends CompiledTranslation<TOther, TOtherNS>,\n >(\n ns: TOtherNS,\n translation: TOther,\n ) => TranslationNamespace<\n TOtherNS,\n mergeTranslationMaps<TOtherCompiled, T>,\n inferCompiledTranslationShape<TOtherCompiled>\n >;\n};\n\nexport function createNamespace<\n const T extends UnknownStringKeyObject,\n TNS extends string,\n>(ns: TNS, translation: T) {\n const compiled = compileTranslation<T, TNS>(translation, ns);\n\n type TCompiled = typeof compiled;\n type TShape = inferCompiledTranslationShape<typeof compiled>;\n\n const namespace: TranslationNamespace<TNS, TCompiled, TShape> = {\n translation: compiled,\n createTranslation: <TLocale extends string>(\n locale: TLocale,\n translation: TShape,\n ) => {\n return compileTranslation(translation, ns, locale);\n },\n createMergedNamespace: <\n TOther extends UnknownStringKeyObject,\n TOtherNS extends string,\n TOtherCompiled extends CompiledTranslation<TOther, TOtherNS> =\n CompiledTranslation<TOther, TOtherNS>,\n >(\n otherNs: TOtherNS,\n otherTranslation: TOther,\n ) => {\n return createNamespace(otherNs, otherTranslation) as TranslationNamespace<\n TOtherNS,\n mergeTranslationMaps<TOtherCompiled, TCompiled>,\n inferCompiledTranslationShape<TOtherCompiled>\n > as unknown as any;\n },\n };\n\n return namespace;\n}\n","import { computed, inject, type Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, type ParamMap, Router } from '@angular/router';\n\nexport function pathParam(\n key: string | (() => string),\n route = inject(ActivatedRoute),\n): Signal<string | null> {\n const keySignal =\n typeof key === 'string' ? computed(() => key) : computed(key);\n\n const routerOptions = inject(Router)['options'];\n\n if (\n routerOptions &&\n typeof routerOptions === 'object' &&\n routerOptions.paramsInheritanceStrategy === 'always'\n ) {\n const params = toSignal(route.paramMap, {\n initialValue: route.snapshot.paramMap,\n });\n\n return computed(() => params().get(keySignal()));\n }\n\n const paramMapSignals: Signal<ParamMap>[] = [];\n let currentRoute: ActivatedRoute | null = route;\n\n const isStatic = typeof key === 'string';\n\n while (currentRoute) {\n const initial = currentRoute.snapshot.paramMap;\n paramMapSignals.push(\n toSignal(currentRoute.paramMap, {\n initialValue: initial,\n }),\n );\n\n // For static keys, stop once we find the param, will find first in computed for loop already so basically noop for for loop\n if (isStatic && initial.has(key as string)) break;\n\n currentRoute = currentRoute.parent;\n }\n\n return computed(() => {\n const paramKey = keySignal();\n\n for (const map of paramMapSignals) {\n const v = map().get(paramKey);\n if (v) return v;\n }\n\n return null;\n });\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n InjectionToken,\n isDevMode,\n LOCALE_ID,\n type Provider,\n resource,\n type Signal,\n signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport { createIntl, createIntlCache, type IntlConfig } from '@formatjs/intl';\nimport { type CompiledTranslation } from './compile';\nimport { prependDelim } from './delim';\nimport { pathParam } from './path-param';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\n\ntype BaseConfig = Omit<IntlConfig, 'locale' | 'messages'> & {\n /** Checks next locale is in provided array before switching locales */\n supportedLocales?: string[];\n /** Preloads the default locale ensuring sync fallback, not necessary for most cases as it will lazily load automatically when needed */\n preloadDefaultLocale?: boolean;\n};\n\ntype RouteBasedConfig = BaseConfig & {\n /** Auto-resolution when using a locale parameter via angular router */\n localeParamName?: string;\n localeStorage?: never;\n};\n\ntype LocaleStorage = {\n /** Called once on init to restore the last selected locale. Return `null` if nothing is stored. Values not in `supportedLocales` are ignored. */\n read: () => string | null;\n /** Called whenever the active locale changes. Fires once on init with the resolved initial value. */\n write: (locale: string) => void;\n};\n\ntype DynamicConfig = BaseConfig & {\n /** Custom storage mechanism for last set locale, it will be read on init & set the locale to the last value if it is still valid */\n localeStorage?: LocaleStorage;\n localeParamName?: never;\n};\n\ntype Config = RouteBasedConfig | DynamicConfig;\n\nconst CONFIG_TOKEN = new InjectionToken<Config>('mmstack-intl-config');\n\nexport function provideIntlConfig(config: Config): Provider[] {\n const providers: Provider[] = [\n {\n useFactory: (localeId: string) => {\n const next = {\n ...config,\n };\n\n const defaultLocale =\n config.defaultLocale ?? config.supportedLocales?.at(0) ?? localeId;\n\n if (\n next.supportedLocales &&\n !next.supportedLocales.includes(defaultLocale)\n ) {\n next.supportedLocales = [...next.supportedLocales, defaultLocale];\n }\n\n return next;\n },\n deps: [LOCALE_ID],\n provide: CONFIG_TOKEN,\n },\n ];\n\n const defaultLocale = config.defaultLocale ?? config.supportedLocales?.at(0);\n\n if (!defaultLocale) return providers;\n\n providers.push({\n provide: LOCALE_ID,\n useValue: defaultLocale,\n });\n\n return providers;\n}\n\nexport function injectIntlConfig() {\n return inject(CONFIG_TOKEN, { optional: true }) ?? undefined;\n}\n\nexport function injectDefaultLocale() {\n return injectIntlConfig()?.defaultLocale ?? inject(LOCALE_ID) ?? 'en-US';\n}\n\nexport function injectSupportedLocales() {\n return injectIntlConfig()?.supportedLocales ?? [injectDefaultLocale()];\n}\n\n/**\n * @internal\n * the actual locale signal used to store the current locale string\n */\nconst STORE_LOCALE = signal('en-US');\n\nexport function injectLocaleInternal() {\n return STORE_LOCALE;\n}\n\nfunction isDynamicConfig(\n cfg?: Config,\n): cfg is DynamicConfig & { localeStorage: LocaleStorage } {\n return !!cfg && 'localeStorage' in cfg && !!cfg.localeStorage;\n}\n\nfunction initLocale(src: WritableSignal<string>) {\n const config = injectIntlConfig();\n const defaultValue = injectDefaultLocale();\n\n if (!isDynamicConfig(config)) {\n src.set(defaultValue);\n return src;\n }\n\n let next: string | null = null;\n try {\n const stored = config.localeStorage.read();\n\n if (\n stored !== null &&\n (!config.supportedLocales || config.supportedLocales.includes(stored))\n ) {\n next = stored;\n }\n } catch (e) {\n if (isDevMode())\n console.error(\n '[Translate] Failed to read stored locale from localeStorage',\n e,\n );\n }\n\n src.set(next ?? defaultValue);\n effect(() => {\n try {\n config.localeStorage.write(src());\n } catch (e) {\n if (isDevMode())\n console.error('[Translate] Failed to write locale to localeStorage', e);\n }\n });\n\n return src;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationStore {\n private readonly simpleKeyMap = new Map<string, Signal<string>>();\n private readonly cache = createIntlCache();\n private readonly config = injectIntlConfig();\n readonly loadQueue = signal<string[]>([]);\n readonly locale: WritableSignal<string>;\n private readonly defaultLocale = injectDefaultLocale();\n private readonly translations = signal<\n Record<string, Record<string, string>>\n >({\n [this.defaultLocale]: {},\n });\n private attemptedFallbackLoad = false;\n\n private readonly onDemandLoaders = new Map<\n string,\n Record<\n string,\n () => Promise<CompiledTranslation<UnknownStringKeyObject, string>>\n >\n >();\n\n private readonly nonMessageConfig = computed(() => ({\n ...this.config,\n locale: this.locale(),\n }));\n\n private readonly messages = computed(\n () =>\n this.translations()[this.locale()] ??\n this.translations()[this.defaultLocale] ??\n {},\n );\n\n readonly dynamicLocaleLoader = resource({\n params: computed(() => this.loadQueue().at(0) ?? null),\n loader: async ({ params: newLocale, abortSignal }) => {\n if (!newLocale) return;\n\n const currentTranslations = untracked(this.translations);\n\n const loadPromises: Promise<{\n namespace: string;\n flat: Record<string, string>;\n } | null>[] = [];\n\n for (const [namespace, loaders] of this.onDemandLoaders.entries()) {\n const loader = loaders[newLocale];\n if (loader) {\n const hasNamespaceForLocale =\n currentTranslations[newLocale] &&\n Object.keys(currentTranslations[newLocale]).some((key) =>\n key.startsWith(`${prependDelim(namespace, '').slice(0, -1)}`),\n );\n\n if (!hasNamespaceForLocale) {\n loadPromises.push(\n loader()\n .then((translation) => {\n if (abortSignal.aborted) return null;\n return {\n namespace: translation.namespace,\n flat: translation.flat,\n };\n })\n .catch((err) => {\n if (isDevMode()) {\n console.error(\n '[Translate] Failed to load',\n namespace,\n newLocale,\n err,\n );\n }\n\n return null;\n }),\n );\n }\n }\n }\n\n return Promise.all(loadPromises)\n .then((res) => res.filter((r) => r !== null))\n .then((res) => ({\n locales: res,\n locale: newLocale,\n }));\n },\n });\n\n readonly intl = computed(() =>\n createIntl(\n {\n ...this.nonMessageConfig(),\n messages: this.messages(),\n },\n this.cache,\n ),\n );\n\n constructor() {\n this.locale = initLocale(STORE_LOCALE);\n const paramName = this.config?.localeParamName;\n if (paramName) {\n const param = pathParam(paramName);\n\n effect(() => {\n const loc = param();\n if (\n !loc ||\n loc === untracked(this.locale) ||\n untracked(this.loadQueue).includes(loc)\n )\n return;\n if (this.hasLocaleLoaders(loc)) this.locale.set(loc);\n else this.loadQueue.update((q) => [...q, loc]);\n });\n }\n\n effect(() => {\n if (\n // should never be in error state, but best to check in case something throws\n this.dynamicLocaleLoader.error() ||\n this.dynamicLocaleLoader.isLoading()\n )\n return;\n const dynamicLocales = this.dynamicLocaleLoader.value();\n\n if (!dynamicLocales) return;\n\n // Register loaded translations\n for (const locale of dynamicLocales.locales) {\n this.register(locale.namespace, {\n [dynamicLocales.locale]: locale.flat,\n });\n }\n\n const hasTranslations =\n dynamicLocales.locales.length > 0 ||\n this.translations()[dynamicLocales.locale];\n\n if (hasTranslations) {\n this.loadQueue.update((q) =>\n q.filter((l) => l !== dynamicLocales.locale),\n );\n this.locale.set(dynamicLocales.locale);\n }\n });\n }\n\n buildSimpleKeySignal(key: string) {\n const found = this.simpleKeyMap.get(key);\n if (found) return found;\n\n const sig = computed(() => this.formatMessageInternal(key));\n this.simpleKeyMap.set(key, sig);\n return sig;\n }\n\n formatMessage(key: string, values?: Record<string, string | number>) {\n if (values === undefined) return this.buildSimpleKeySignal(key)();\n\n return this.formatMessageInternal(key, values);\n }\n\n private formatMessageInternal(\n key: string,\n values?: Record<string, string | number>,\n ) {\n const message =\n this.translations()[this.locale()]?.[key] ??\n this.translations()[this.defaultLocale]?.[key] ??\n '';\n\n if (!message) {\n if (this.attemptedFallbackLoad) return '';\n\n this.attemptedFallbackLoad = true;\n untracked(() => {\n if (!this.loadQueue().includes(this.defaultLocale))\n this.loadQueue.update((q) => [...q, this.defaultLocale]);\n });\n return '';\n }\n\n return this.intl().formatMessage(\n { id: key, defaultMessage: message },\n values,\n );\n }\n\n register(\n namespace: string,\n flat: Partial<Record<string, Record<string, string>>>,\n ) {\n this.translations.update((cur) => {\n return Object.entries(flat).reduce(\n (acc, [locale, translation]) => {\n const localeTranslation = acc[locale] ?? {};\n\n const withNS = Object.entries(translation ?? {}).reduce(\n (acc, [key, value]) => {\n acc[prependDelim(namespace, key)] = value;\n return acc;\n },\n {} as Record<string, string>,\n );\n\n acc[locale] = {\n ...localeTranslation,\n ...withNS,\n };\n\n return acc;\n },\n { ...cur },\n );\n });\n }\n\n registerOnDemandLoaders(\n namespace: string,\n loaders: Record<string, () => Promise<any>>,\n ) {\n this.onDemandLoaders.set(namespace, loaders);\n }\n\n hasLocaleLoaders(locale: string): boolean {\n return Array.from(this.onDemandLoaders.values()).some(\n (loaders) => loaders[locale],\n );\n }\n}\n\nexport function injectIntl() {\n return inject(TranslationStore).intl;\n}\n\n/**\n * Inject a dynamic locale signal that supports runtime language switching.\n *\n * @returns A writable signal with the current locale and loading state.\n * Only allows switching to locales that have registered loaders.\n *\n * @example\n * ```typescript\n * const locale = injectDynamicLocale();\n *\n * // Switch language (triggers automatic translation loading)\n * locale.set('sl-SI');\n *\n * // Check loading state\n * if (locale.isLoading()) {\n * // Show spinner\n * }\n * ```\n */\nexport function injectDynamicLocale(): WritableSignal<string> & {\n isLoading: Signal<boolean>;\n} {\n const store = inject(TranslationStore);\n const supportedLocales = injectIntlConfig()?.supportedLocales;\n\n const source = computed(() => store.locale()) as WritableSignal<string> & {\n isLoading: Signal<boolean>;\n };\n\n const inSupportedLocales =\n supportedLocales === undefined\n ? () => true\n : (locale: string) => supportedLocales.includes(locale);\n\n const set = (value: string) => {\n if (\n value === untracked(source) ||\n untracked(store.loadQueue).includes(value)\n )\n return;\n\n if (!inSupportedLocales(value)) {\n if (isDevMode())\n console.warn(\n `[Translate] Locale \"${value}\" is not in supportedLocales, switch prevented. Available options are:`,\n supportedLocales,\n );\n\n return;\n }\n\n if (isDevMode() && !store.hasLocaleLoaders(value))\n console.warn(\n `[Translate] No loaders registered for locale \"${value}\". Switching to this locale will have no effect.`,\n );\n\n store.loadQueue.update((q) => [...q, value]);\n };\n\n source.set = set;\n source.update = (updater: (value: string) => string) => {\n const next = updater(untracked(source));\n source.set(next);\n };\n source.asReadonly = () => source;\n\n source.isLoading = store.dynamicLocaleLoader.isLoading;\n\n return source;\n}\n","import { isSignal, type Signal } from '@angular/core';\n\nexport function unwrap<T>(value: T | Signal<T>): T {\n return isSignal(value) ? value() : value;\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\nconst FORMAT_PRESETS: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short', timeStyle: 'short' },\n medium: { dateStyle: 'medium', timeStyle: 'medium' },\n long: { dateStyle: 'long', timeStyle: 'long' },\n full: { dateStyle: 'full', timeStyle: 'full' },\n\n shortDate: { dateStyle: 'short' },\n mediumDate: { dateStyle: 'medium' },\n longDate: { dateStyle: 'long' },\n fullDate: { dateStyle: 'full' },\n\n shortTime: { timeStyle: 'short' },\n mediumTime: { timeStyle: 'medium' },\n longTime: { timeStyle: 'long' },\n fullTime: { timeStyle: 'full' },\n};\n\ntype DateFormat = keyof typeof FORMAT_PRESETS;\n\n/**\n * Supported date inputs\n */\nexport type SupportedDateInput = Date | string | number | null | undefined;\n\n/**\n * Options for formatting a date\n */\nexport type FormatDateOptions = {\n /**\n * Timezone to use for formatting\n */\n tz?: string;\n /**\n * Format to use for formatting\n * @default 'medium'\n */\n format?: DateFormat;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nfunction validDateOrNull(\n date: Date | string | number | null | undefined,\n): Date | null {\n if (date == null) return null;\n\n const d = date instanceof Date ? date : new Date(date);\n return isNaN(d.getTime()) ? null : d;\n}\n\nconst cache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getFormatter(\n locale: string,\n format: DateFormat,\n timeZone?: string,\n): Intl.DateTimeFormat {\n const cacheKey = `${locale}|${format}|${timeZone ?? ''}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(locale, {\n ...FORMAT_PRESETS[format],\n timeZone,\n });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\n/**\n * Format a date using the current or provided locale & timezone\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param date - Date to format\n * @param opt - Options for formatting\n * @returns Formatted date string\n */\nexport function formatDate(\n date: SupportedDateInput | Signal<SupportedDateInput>,\n opt?: FormatDateOptions | Signal<FormatDateOptions>,\n): string {\n const validDate = validDateOrNull(unwrap(date));\n if (validDate === null) return '';\n\n const unwrappedOpt = unwrap(opt);\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.format ?? 'medium',\n unwrappedOpt?.tz,\n ).format(validDate);\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\nconst cache = new Map<string, Intl.DisplayNames>();\n\n/**\n * Options for formatting a display name\n */\nexport type FormatDisplayNameOptions = {\n /**\n * The display style for the result set\n */\n style: Intl.RelativeTimeFormatStyle;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nfunction getFormatter(\n locale: string,\n type: Intl.DisplayNamesType,\n style: Intl.RelativeTimeFormatStyle,\n): Intl.DisplayNames {\n const cacheKey = `${locale}|${type}|${style}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.DisplayNames(locale, {\n type,\n style,\n });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\ntype SupportedCode = string | null | undefined;\n\n/**\n * Format a display name using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param value - The code to format\n * @param type - The type of display name to format\n * @param opt - Options for formatting\n * @returns Formatted display name string\n */\nexport function formatDisplayName(\n value: SupportedCode | Signal<SupportedCode>,\n type: Intl.DisplayNamesType | Signal<Intl.DisplayNamesType>,\n opt?: FormatDisplayNameOptions | Signal<FormatDisplayNameOptions>,\n): string {\n const unwrapped = unwrap(value);\n if (!unwrapped?.trim()) return '';\n\n const unwrappedType = unwrap(type);\n const unwrappedOpt = unwrap(opt);\n\n const locale = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return (\n getFormatter(locale, unwrappedType, unwrappedOpt?.style ?? 'long').of(\n unwrapped,\n ) ?? ''\n );\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\ntype ListType = 'conjunction' | 'disjunction' | 'unit';\ntype ListStyle = 'long' | 'short' | 'narrow';\n\nexport type SupportedListInput = string[] | null | undefined;\n\nconst cache = new Map<string, Intl.ListFormat>();\n\n/**\n * Options for formatting a list\n */\nexport type FormatListOptions = {\n /**\n * The type of list to format\n */\n type?: ListType;\n /**\n * The style of list to format\n */\n style?: ListStyle;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nconst EMPTY_ARRAY: string[] = [];\n\nfunction unwrapList(\n value: SupportedListInput | Signal<SupportedListInput>,\n): string[] {\n const unwrapped = unwrap(value);\n return Array.isArray(unwrapped) ? unwrapped : EMPTY_ARRAY;\n}\n\nfunction getFormatter(\n locale: string,\n type: ListType,\n style: ListStyle,\n): Intl.ListFormat {\n const cacheKey = `${locale}|${type}|${style}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.ListFormat(locale, { type, style });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\n/**\n * Format a list using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param value - The list to format\n * @param opt - Options for formatting\n * @returns Formatted list string\n */\nexport function formatList(\n value: SupportedListInput | Signal<SupportedListInput>,\n opt?: FormatListOptions | Signal<FormatListOptions>,\n): string {\n const unwrapped = unwrapList(value);\n if (unwrapped.length === 0) return '';\n\n const unwrappedOpt = unwrap(opt);\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.type ?? 'conjunction',\n unwrappedOpt?.style ?? 'long',\n ).format(unwrapped);\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\ntype NumberNotation = 'standard' | 'scientific' | 'engineering' | 'compact';\n\ntype SupportedNumberValue = number | null | undefined;\n\nconst cache = new Map<string, Intl.NumberFormat>();\n\nfunction unwrapValue(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n fallbackToZero = false,\n): number | null {\n const unwrapped = unwrap(value);\n\n if (unwrapped === null || unwrapped === undefined || isNaN(unwrapped))\n return fallbackToZero ? 0 : null;\n\n return unwrapped;\n}\n\n/**\n * Options for formatting a number\n */\nexport type FormatNumberOptions = {\n /**\n * The notation to use for formatting\n */\n notation?: NumberNotation;\n /**\n * Minimum number of fraction digits to use\n */\n minFractionDigits?: number;\n /**\n * Maximum number of fraction digits to use\n */\n maxFractionDigits?: number;\n /**\n * Whether to use grouping\n */\n useGrouping?: boolean;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n /**\n * If the number is not a valid number, return formatted 0. By default formatter returns an empty string\n * @default false\n */\n fallbackToZero?: boolean;\n};\n\nfunction getFormatter(\n locale: string,\n minFractionDigits: number | undefined,\n maxFractionDigits: number | undefined,\n useGrouping?: boolean,\n notation?: NumberNotation,\n currency?: string,\n display?: CurrencyDisplay,\n style?: 'currency' | 'percent',\n): Intl.NumberFormat {\n const cacheKey = `${locale}|${notation ?? 'standard'}|${minFractionDigits}|${maxFractionDigits}|${useGrouping ?? true}|${currency ?? 'none'}|${display ?? 'none'}|${style ?? 'decimal'}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, {\n style,\n notation,\n minimumFractionDigits: minFractionDigits,\n maximumFractionDigits: maxFractionDigits,\n useGrouping,\n currency,\n currencyDisplay: display,\n });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\n/**\n * Format a number using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param number - Number to format\n * @param opt - Options for formatting\n * @returns Formatted number string\n */\nexport function formatNumber(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n opt?: FormatNumberOptions | Signal<FormatNumberOptions>,\n): string {\n const unwrappedOpt = unwrap(opt);\n const unwrappedNumber = unwrapValue(value, unwrappedOpt?.fallbackToZero);\n\n if (unwrappedNumber === null) return '';\n\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.minFractionDigits,\n unwrappedOpt?.maxFractionDigits,\n unwrappedOpt?.useGrouping ?? true,\n unwrappedOpt?.notation ?? 'standard',\n ).format(unwrappedNumber);\n}\n\n/**\n * Options for formatting a percentage value\n */\nexport type FormatPercentOptions = {\n /**\n * Minimum number of fraction digits to use\n */\n minFractionDigits?: number;\n /**\n * Maximum number of fraction digits to use\n */\n maxFractionDigits?: number;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n /**\n * If the number is not a valid number, return formatted 0. By default formatter returns an empty string\n * @default false\n */\n fallbackToZero?: boolean;\n};\n\n/**\n * Format a percentage using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param number - Number to format\n * @param opt - Options for formatting\n * @returns Formatted percentage string\n */\nexport function formatPercent(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n opt?: FormatPercentOptions | Signal<FormatPercentOptions>,\n): string {\n const unwrappedOpt = unwrap(opt);\n\n const unwrappedNumber = unwrapValue(value, unwrappedOpt?.fallbackToZero);\n\n if (unwrappedNumber === null) return '';\n\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.minFractionDigits,\n unwrappedOpt?.maxFractionDigits,\n undefined,\n undefined,\n undefined,\n undefined,\n 'percent',\n ).format(unwrappedNumber);\n}\n\ntype CurrencyDisplay = 'symbol' | 'narrowSymbol' | 'code' | 'name';\n\n/**\n * Options for formatting a currency\n */\nexport type FormatCurrencyOptions = {\n /*\n * The display type for the currency format\n */\n display?: CurrencyDisplay;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n /**\n * If the number is not a valid number, return formatted 0. By default formatter returns an empty string\n * @default false\n */\n fallbackToZero?: boolean;\n};\n\nexport function formatCurrency(\n value: SupportedNumberValue | Signal<SupportedNumberValue>,\n currency: string | Signal<string>,\n opt?: FormatCurrencyOptions | Signal<FormatCurrencyOptions>,\n): string {\n const unwrappedOpt = unwrap(opt);\n const unwrappedValue = unwrapValue(value, unwrappedOpt?.fallbackToZero);\n\n if (unwrappedValue === null) return '';\n\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n undefined,\n undefined,\n undefined,\n undefined,\n unwrap(currency),\n unwrappedOpt?.display ?? 'symbol',\n 'currency',\n ).format(unwrappedValue);\n}\n","import { type Signal } from '@angular/core';\nimport { injectLocaleInternal } from '../translation-store';\nimport { unwrap } from './unwrap';\n\nconst cache = new Map<string, Intl.RelativeTimeFormat>();\n\n/**\n * Options for formatting a relative time value\n */\nexport type FormatRelativeTimeOptions = {\n /**\n * The length of the internationalized message.\n * @default 'long'\n */\n style?: Intl.RelativeTimeFormatStyle;\n /**\n * Controls whether to use numeric values in the output.\n * @default 'always'\n */\n numeric?: Intl.RelativeTimeFormatNumeric;\n /**\n * Locale to use for formatting, opts out to dynamic locale changes\n */\n locale?: string;\n};\n\nfunction getFormatter(\n locale: string,\n style: Intl.RelativeTimeFormatStyle,\n numeric: Intl.RelativeTimeFormatNumeric,\n): Intl.RelativeTimeFormat {\n const cacheKey = `${locale}|${style}|${numeric}`;\n let formatter = cache.get(cacheKey);\n\n if (!formatter) {\n formatter = new Intl.RelativeTimeFormat(locale, { style, numeric });\n cache.set(cacheKey, formatter);\n }\n\n return formatter;\n}\n\nexport type RelativeTimeUnit = Intl.RelativeTimeFormatUnit;\n\ntype SupportedRelativeTimeInput = number | null | undefined;\n\n/**\n * Format a relative time using the current or provided locale\n * By default it is reactive to the global dynamic locale, works best when wrapped in a computed() if you need to react to locale changes\n *\n * @param value - The numeric value to use in the relative time internationalization message\n * @param unit - The unit to use in the relative time internationalization message\n * @param opt - Options for formatting\n * @returns Formatted relative time string\n */\nexport function formatRelativeTime(\n value: SupportedRelativeTimeInput | Signal<SupportedRelativeTimeInput>,\n unit: RelativeTimeUnit | Signal<RelativeTimeUnit>,\n opt?: FormatRelativeTimeOptions | Signal<FormatRelativeTimeOptions>,\n): string {\n const unwrappedValue = unwrap(value);\n if (\n unwrappedValue === null ||\n unwrappedValue === undefined ||\n isNaN(unwrappedValue)\n )\n return '';\n\n const unwrappedUnit = unwrap(unit);\n if (!unwrappedUnit) return '';\n\n const unwrappedOpt = unwrap(opt);\n const loc = unwrappedOpt?.locale ?? injectLocaleInternal()();\n\n return getFormatter(\n loc,\n unwrappedOpt?.style ?? 'long',\n unwrappedOpt?.numeric ?? 'always',\n ).format(unwrappedValue, unwrappedUnit);\n}\n","import { inject, untracked } from '@angular/core';\nimport { type ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { injectIntlConfig, TranslationStore } from './translation-store';\n\nexport function injectResolveParamLocale(snapshot: ActivatedRouteSnapshot) {\n let locale: string | null = null;\n\n const paramName = injectIntlConfig()?.localeParamName;\n\n const routerConfig = inject(Router)['options'];\n\n const alwaysInheritParams =\n typeof routerConfig === 'object' &&\n !!routerConfig &&\n routerConfig.paramsInheritanceStrategy === 'always';\n\n if (paramName) {\n locale = snapshot.paramMap.get(paramName);\n\n if (!locale && !alwaysInheritParams) {\n let currentRoute: ActivatedRouteSnapshot | null = snapshot;\n while (currentRoute && !locale) {\n locale = currentRoute.paramMap.get('locale');\n currentRoute = currentRoute.parent;\n }\n }\n }\n\n if (!locale) {\n locale = untracked(inject(TranslationStore).locale);\n }\n\n return locale;\n}\n","import {\n computed,\n inject,\n isDevMode,\n isSignal,\n untracked,\n type Signal,\n} from '@angular/core';\nimport { type ResolveFn } from '@angular/router';\nimport {\n compileTranslation,\n type CompiledTranslation,\n type inferCompiledTranslationMap,\n type inferCompiledTranslationNamespace,\n} from './compile';\nimport { replaceWithDelim } from './delim';\nimport { injectResolveParamLocale } from './resovler-locale';\nimport {\n type AnyStringRecord,\n type UnknownStringKeyObject,\n} from './string-key-object.type';\nimport {\n injectDefaultLocale,\n injectIntlConfig,\n TranslationStore,\n} from './translation-store';\n\nfunction createEqualsRecord<T extends AnyStringRecord>(keys: (keyof T)[] = []) {\n let keyMatcher: (a: T, b: T) => boolean;\n\n if (keys.length === 0) {\n keyMatcher = () => true;\n } else if (keys.length === 1) {\n const key = keys[0];\n keyMatcher = (a, b) => a[key] === b[key];\n } else {\n keyMatcher = (a, b) => {\n return keys.every((k) => a[k] === b[k]);\n };\n }\n\n return (a?: T, b?: T): boolean => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return keyMatcher(a, b);\n };\n}\n\ntype TFunction<TMap extends AnyStringRecord> = <\n TKey extends keyof TMap & string,\n>(\n key: TKey,\n ...args: TMap[TKey] extends void ? [] : [TMap[TKey]]\n) => string;\n\ntype SignalTFunction<TMap extends AnyStringRecord> = <\n TKey extends keyof TMap & string,\n>(\n key: TKey,\n ...args: TMap[TKey] extends void ? [] : [() => TMap[TKey]]\n) => Signal<string>;\n\ntype TFunctionWithSignalConstructor<\n TMap extends AnyStringRecord,\n TFN extends TFunction<TMap>,\n> = TFN & {\n asSignal: SignalTFunction<TMap>;\n};\n\nexport function addSignalFn<\n TMap extends AnyStringRecord,\n TFn extends TFunction<TMap>,\n>(\n fn: TFn,\n store: TranslationStore,\n keyMap: Map<string, string>,\n): TFunctionWithSignalConstructor<TMap, TFn> {\n const withSig = fn as TFunctionWithSignalConstructor<TMap, TFn>;\n\n const asSignal = <TKey extends keyof TMap & string>(\n key: TKey,\n variables?: () => AnyStringRecord,\n ): Signal<string> => {\n const stringKey = key as string;\n\n let flatPath = keyMap.get(stringKey);\n\n if (flatPath === undefined) {\n flatPath = replaceWithDelim(stringKey);\n keyMap.set(stringKey, flatPath);\n }\n\n if (variables === undefined) return store.buildSimpleKeySignal(flatPath);\n\n const varsFn = variables;\n const varsSignal = isSignal(varsFn)\n ? varsFn\n : computed(() => varsFn(), {\n equal: createEqualsRecord(Object.keys(varsFn())),\n });\n\n return computed(() => store.formatMessage(flatPath, varsSignal()));\n };\n\n withSig.asSignal = asSignal as unknown as TFunctionWithSignalConstructor<\n TMap,\n TFn\n >['asSignal'];\n\n return withSig;\n}\n\nexport function createT<TMap extends AnyStringRecord>(\n store: TranslationStore,\n keyMap = new Map<string, string>(),\n): TFunction<TMap> {\n const fn = <TKey extends keyof TMap & string>(\n key: TKey,\n variables?: AnyStringRecord,\n ): string => {\n const stringKey = key as string;\n\n let k = keyMap.get(stringKey);\n\n if (k === undefined) {\n k = replaceWithDelim(stringKey);\n keyMap.set(stringKey, k);\n }\n\n return store.formatMessage(k, variables);\n };\n\n return fn as unknown as TFunction<TMap>;\n}\n\nexport function registerNamespace<\n TDefault extends CompiledTranslation<UnknownStringKeyObject, string>,\n>(\n defaultTranslation: () => Promise<TDefault>,\n other: Record<\n string,\n () => Promise<\n CompiledTranslation<\n UnknownStringKeyObject,\n inferCompiledTranslationNamespace<TDefault>,\n string\n >\n >\n >,\n) {\n type $Map = inferCompiledTranslationMap<TDefault>;\n type $BaseTFN = TFunction<$Map>;\n type $TFN = TFunctionWithSignalConstructor<$Map, $BaseTFN>;\n\n const keyMap = new Map<string, string>();\n\n const injectT = (): $TFN => {\n const store = inject(TranslationStore);\n\n return addSignalFn(createT(store, keyMap), store, keyMap);\n };\n\n let defaultTranslationLoaded = false;\n const resolver: ResolveFn<void> = async (snapshot) => {\n const store = inject(TranslationStore);\n\n const locale = injectResolveParamLocale(snapshot);\n\n const defaultLocale = injectDefaultLocale();\n const shouldPreloadDefault =\n injectIntlConfig()?.preloadDefaultLocale ?? false;\n\n const tPromise = other[locale] as (typeof other)[string] | undefined;\n\n const promise = tPromise ?? defaultTranslation;\n if (!promise && isDevMode()) {\n return console.warn(`No translation found for locale: ${locale}`);\n }\n\n if (promise === defaultTranslation && defaultTranslationLoaded) return;\n\n try {\n const promises = [promise()];\n\n if (\n shouldPreloadDefault &&\n !defaultTranslationLoaded &&\n promise !== defaultTranslation\n )\n promises.push(defaultTranslation());\n\n const translations = await Promise.allSettled(promises);\n\n const fullfilled = translations.map((t) =>\n t.status === 'fulfilled' ? t.value : null,\n );\n\n if (fullfilled.at(0) === null && fullfilled.at(1) === null)\n throw new Error('Failed to load translations');\n\n const [t, defaultT] = fullfilled;\n\n const ns = t?.namespace ?? defaultT?.namespace;\n if (!ns) throw new Error('No namespace found in translation');\n\n if (isDevMode() && t && t.locale !== locale && t.locale)\n console.warn(`Expected locale to be ${locale} but got ${t.locale}`);\n\n store.registerOnDemandLoaders(ns, {\n ...other,\n [defaultLocale]: defaultTranslation,\n });\n\n const toRegister: Record<string, Record<string, string>> = {};\n if (t) toRegister[locale] = t.flat;\n if (defaultT) toRegister[defaultLocale] = defaultT.flat;\n\n store.register(ns, toRegister);\n\n if (promise === defaultTranslation || defaultT)\n defaultTranslationLoaded = true;\n } catch {\n if (isDevMode()) {\n console.warn(`Failed to load translation for locale: ${locale}`);\n }\n } finally {\n if (locale !== untracked(store.locale)) store.locale.set(locale);\n }\n };\n\n return {\n injectNamespaceT: injectT,\n resolveNamespaceTranslation: resolver,\n };\n}\n\ntype UntypedTFunction<TNS extends string> = {\n (key: `${TNS}.${string}`, args?: Record<string, string>): string;\n asSignal: (\n key: `${TNS}.${string}`,\n args?: () => Record<string, string>,\n ) => Signal<string>;\n};\n\n/**\n * Registers a type-unsafe namespace, meant for remote loading of unknown key-value pairs using mmstack/translate infrastructure\n * The resolver & t function work the same as they would with typed namespaces, but without type safety\n */\nexport function registerRemoteNamespace<TNS extends string>(\n ns: TNS,\n defaultTranslation: () => Promise<Record<string, string>>,\n other: Record<string, () => Promise<Record<string, string>>>,\n) {\n const keyMap = new Map<string, string>();\n\n const injectT = (): UntypedTFunction<TNS> => {\n const store = inject(TranslationStore);\n\n return addSignalFn(\n createT(store, keyMap),\n store,\n keyMap,\n ) as UntypedTFunction<TNS>;\n };\n\n let defaultTranslationLoaded = false;\n const resolver: ResolveFn<void> = async (snapshot) => {\n const store = inject(TranslationStore);\n\n const locale = injectResolveParamLocale(snapshot);\n\n const defaultLocale = injectDefaultLocale();\n const shouldPreloadDefault =\n injectIntlConfig()?.preloadDefaultLocale ?? false;\n\n const tPromise = other[locale] as (typeof other)[string] | undefined;\n\n const promise = tPromise ?? defaultTranslation;\n\n if (!promise && isDevMode()) {\n return console.warn(`No translation found for locale: ${locale}`);\n }\n\n if (promise === defaultTranslation && defaultTranslationLoaded) return;\n\n try {\n const promises = [promise()];\n\n if (\n shouldPreloadDefault &&\n !defaultTranslationLoaded &&\n promise !== defaultTranslation\n )\n promises.push(defaultTranslation());\n\n const translations = await Promise.allSettled(promises);\n\n const fullfilled = translations.map((t) =>\n t.status === 'fulfilled' ? t.value : null,\n );\n\n if (fullfilled.at(0) === null && fullfilled.at(1) === null)\n throw new Error('Failed to load translations');\n\n const [baseT, baseDefaultT] = fullfilled;\n\n const t = baseT ? compileTranslation(baseT, ns, locale) : null;\n const defaultT = baseDefaultT\n ? compileTranslation(baseDefaultT, ns, defaultLocale)\n : null;\n\n if (isDevMode() && t && t.locale !== locale && t.locale)\n console.warn(`Expected locale to be ${locale} but got ${t.locale}`);\n\n store.registerOnDemandLoaders(ns, {\n ...other,\n [defaultLocale]: defaultTranslation,\n });\n\n const toRegister: Record<string, Record<string, string>> = {};\n if (t) toRegister[locale] = t.flat;\n if (defaultT) toRegister[defaultLocale] = defaultT.flat;\n\n store.register(ns, toRegister);\n\n if (promise === defaultTranslation || defaultT)\n defaultTranslationLoaded = true;\n } catch {\n if (isDevMode()) {\n console.warn(`Failed to load translation for locale: ${locale}`);\n }\n } finally {\n if (locale !== untracked(store.locale)) store.locale.set(locale);\n }\n };\n\n return {\n injectNamespaceT: injectT,\n resolveNamespaceTranslation: resolver,\n };\n}\n","import { inject } from '@angular/core';\nimport {\n Router,\n type CanMatchFn,\n type Route,\n type UrlSegment,\n} from '@angular/router';\nimport {\n injectDefaultLocale,\n injectSupportedLocales,\n} from './translation-store';\n\n/**\n * Guard that validates the locale parameter against supported locales.\n * Redirects to default locale if the locale is invalid.\n *\n * @param prefixSegments Optional array of path segments preceding the locale segment.\n * if (you wanted to match /app/:locale/... you would pass ['app'] here) & the function would match the second parameter + redirect accordingly\n *\n * @example\n * ```typescript\n * {\n * path: ':locale',\n * canMatch: [canMatchLocale()],\n * children: [...]\n * }\n * ```\n */\nexport function canMatchLocale(prefixSegments: string[] = []): CanMatchFn {\n return (_route: Route, segments: UrlSegment[]) => {\n const supportedLocales = injectSupportedLocales();\n\n const locale = segments.at(prefixSegments.length)?.path;\n\n if (!locale || !supportedLocales.includes(locale))\n return inject(Router).createUrlTree([\n ...prefixSegments,\n injectDefaultLocale(),\n ]);\n\n return true;\n };\n}\n","import {\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n Renderer2,\n} from '@angular/core';\nimport {\n type CompiledTranslation,\n type inferCompiledTranslationMap,\n} from './compile';\nimport { createT } from './register-namespace';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\nimport { TranslationStore } from './translation-store';\n\nfunction compareObjects(\n a?: Record<string, string>,\n b?: Record<string, string>,\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every((key) => a[key] === b[key]);\n}\n\n@Directive()\nexport abstract class Translate<\n TInput extends string,\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T> = inferCompiledTranslationMap<T>,\n TKey extends TInput & keyof TMap & string = TInput & keyof TMap & string,\n> {\n private readonly t = createT(inject(TranslationStore));\n\n readonly translate =\n input.required<\n TMap[TKey] extends void\n ? TKey | [key: TKey]\n : [key: TKey, vars: TMap[TKey]]\n >();\n\n constructor() {\n const inputs = computed(() => this.translate(), {\n equal: (a, b) => {\n if (a === b) return true;\n if (typeof a === 'string' || typeof b === 'string') return false;\n if (a[0] !== b[0]) return false;\n return compareObjects(\n a[1] as Record<string, string>,\n b[1] as Record<string, string>,\n );\n },\n });\n\n const translation = computed(() => {\n const inp = inputs();\n return typeof inp === 'string'\n ? this.t(inp)\n : this.t(inp[0], inp[1] as Record<string, string>);\n });\n\n const renderer = inject(Renderer2);\n const el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n afterRenderEffect({\n write: () => {\n renderer.setProperty(el.nativeElement, 'textContent', translation());\n },\n });\n }\n}\n","import { ChangeDetectorRef, effect, inject } from '@angular/core';\nimport {\n type CompiledTranslation,\n type inferCompiledTranslationMap,\n} from './compile';\nimport { createT } from './register-namespace';\nimport {\n type AnyStringRecord,\n type UnknownStringKeyObject,\n} from './string-key-object.type';\nimport { TranslationStore } from './translation-store';\n\ntype TransformTFn<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T>,\n> = <TKey extends keyof TMap & string>(\n key: TKey,\n ...args: TMap[TKey] extends void\n ? [locale?: string]\n : [TMap[TKey], locale?: string]\n) => string;\n\nfunction createTransformFn<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T>,\n>(): TransformTFn<T, TMap> {\n const store = inject(TranslationStore);\n const t = createT<TMap>(store);\n\n const fn = <TKey extends keyof TMap & string>(\n key: TKey,\n variablesOrLocale?: string | AnyStringRecord,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _?: string, // maybeLocale\n ): string => {\n const vars =\n typeof variablesOrLocale === 'string' ? undefined : variablesOrLocale;\n\n return (t as (key: TKey, vars?: AnyStringRecord) => string)(key, vars);\n };\n\n return fn as unknown as TransformTFn<T, TMap>;\n}\n\nexport abstract class Translator<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T> = inferCompiledTranslationMap<T>,\n> {\n constructor() {\n const cdr = inject(ChangeDetectorRef);\n const locale = inject(TranslationStore).locale;\n\n effect(() => {\n locale();\n cdr.markForCheck();\n });\n }\n\n transform = createTransformFn<T, TMap>();\n}\n","import { type Provider, signal } from '@angular/core';\nimport { createIntl, createIntlCache, type IntlShape } from '@formatjs/intl';\nimport { compileTranslation } from '../compile';\nimport { type UnknownStringKeyObject } from '../string-key-object.type';\nimport { TranslationStore } from '../translation-store';\n\n/**\n * Options designed to feed into the mock translations function.\n */\nexport interface MockTranslationOptions {\n /**\n * If provided, allows overriding the default behavior of simply echoing translation keys back.\n * Format: Record of namespace -> (Translation shape similar to what you pass to `createNamespace`)\n *\n * Example:\n * ```ts\n * {\n * home: { title: 'Mocked Title' },\n * auth: { error: 'Mocked Error' }\n * }\n * ```\n */\n translations?: Record<string, UnknownStringKeyObject>;\n\n /**\n * When true, uses `@formatjs/intl` to process ICU message syntax (e.g. `{name}`, plurals, selects).\n * This gives you real variable interpolation in your test assertions.\n *\n * @default false — values are ignored and the raw message string is returned.\n *\n * @example\n * ```ts\n * provideMockTranslations({\n * translations: { home: { greet: 'Hello {name}' } },\n * formatValues: true,\n * })\n * // t('home.greet', { name: 'Alice' }) → 'Hello Alice'\n * ```\n */\n formatValues?: boolean;\n\n /**\n * The locale to use when `formatValues` is true.\n * @default 'en-US'\n */\n locale?: string;\n}\n\n/**\n * Provides an isolated mock `TranslationStore` usable across testing modules that use components\n * depending on `@mmstack/translate` APIs (like `Translate` directive, `Translator` pipe, or `injectNamespaceT`).\n *\n * This provider intercepts all translation logic, bypassing chunk loaders and Intl.\n * When a custom configuration isn't provided, formatMessage simply echoes the translation key, using dots `.`.\n *\n * ### Usage\n * ```typescript\n * TestBed.configureTestingModule({\n * providers: [provideMockTranslations()]\n * });\n * ```\n */\nexport function provideMockTranslations(\n options?: MockTranslationOptions,\n): Provider[] {\n // We compile the mock strings to flat delimiters just like the internal compile module.\n const mappedMocks: Record<string, string> = {};\n\n if (options?.translations) {\n for (const [namespace, translationObj] of Object.entries(\n options.translations,\n )) {\n const compiled = compileTranslation(translationObj, namespace);\n\n for (const [key, val] of Object.entries(compiled.flat)) {\n // e.g. from 'home::MMT_DELIM::title'\n const fullKey = `${namespace}::MMT_DELIM::${key}`;\n mappedMocks[fullKey] = val;\n }\n }\n }\n\n const locale = options?.locale ?? 'en-US';\n\n let intl: IntlShape | undefined;\n\n if (options?.formatValues) {\n intl = createIntl({ locale, messages: mappedMocks }, createIntlCache());\n }\n\n return [\n {\n provide: TranslationStore,\n useValue: {\n locale: signal(locale),\n formatMessage: (\n key: string,\n values?: Record<string, string | number>,\n ) => {\n const message = mappedMocks[key];\n\n if (!message) {\n // Fallback to echoing the key back in dot notation (more readable for unit assertions).\n return key.replaceAll('::MMT_DELIM::', '.');\n }\n\n if (intl) {\n return intl.formatMessage(\n { id: key, defaultMessage: message },\n values,\n );\n }\n\n return message;\n },\n hasLocaleLoaders: () => false,\n register: () => {\n // noop\n },\n registerOnDemandLoaders: () => {\n // noop\n },\n dynamicLocaleLoader: {\n isLoading: signal(false),\n value: signal(null),\n error: signal(null),\n },\n loadQueue: signal([]),\n },\n },\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["cache","getFormatter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmstack/translate",
3
- "version": "21.1.9",
3
+ "version": "21.1.11",
4
4
  "keywords": [
5
5
  "angular",
6
6
  "localize",
@@ -18,7 +18,8 @@ type extractSelectParam<TName extends string, TOpt extends string> = [
18
18
  Autocomplete<Exclude<Trimmed<extractSelectOptions<TOpt>>, 'other'>>
19
19
  ];
20
20
  type extractComplexParam<T extends string> = T extends `{${infer VarName}, plural, ${infer _}}}${infer REST}` | `{${infer VarName}, selectordinal, ${infer _}}}${infer REST}` ? [VarName, number] | extractParams<REST> : T extends `{${infer VarName}, select, ${infer SelectOptions}}}${infer REST}` ? extractSelectParam<VarName, `${SelectOptions}}`> | extractParams<REST> : never;
21
- type extractParams<T extends string> = T extends `${infer _Start}{${infer Var}}${infer End}` ? Var extends `${infer _}, ${infer __}` ? extractComplexParam<`{${Var}}${End}`> : [Var, string] | extractParams<End> : never;
21
+ type IsSimpleIdent<T extends string> = T extends '' ? false : T extends `${string} ${string}` | `${string},${string}` | `${string}{${string}` | `${string}#${string}` ? false : true;
22
+ type extractParams<T extends string> = T extends `${infer _Start}{${infer Var}}${infer End}` ? Var extends `${infer _}, ${infer __}` ? extractComplexParam<`{${Var}}${End}`> : IsSimpleIdent<Var> extends true ? [Var, string] | extractParams<End> : extractParams<End> : never;
22
23
  type mergeParams<TExtracted extends [string, any]> = {
23
24
  [K in TExtracted as K[0]]: K[1];
24
25
  };
@@ -277,14 +278,30 @@ type SupportedRelativeTimeInput = number | null | undefined;
277
278
  */
278
279
  declare function formatRelativeTime(value: SupportedRelativeTimeInput | Signal<SupportedRelativeTimeInput>, unit: RelativeTimeUnit | Signal<RelativeTimeUnit>, opt?: FormatRelativeTimeOptions | Signal<FormatRelativeTimeOptions>): string;
279
280
 
280
- declare function provideIntlConfig(config: Omit<IntlConfig, 'locale' | 'messages'> & {
281
+ type BaseConfig = Omit<IntlConfig, 'locale' | 'messages'> & {
281
282
  /** Checks next locale is in provided array before switching locales */
282
283
  supportedLocales?: string[];
283
284
  /** Preloads the default locale ensuring sync fallback, not necessary for most cases as it will lazily load automatically when needed */
284
285
  preloadDefaultLocale?: boolean;
286
+ };
287
+ type RouteBasedConfig = BaseConfig & {
285
288
  /** Auto-resolution when using a locale parameter via angular router */
286
289
  localeParamName?: string;
287
- }): Provider[];
290
+ localeStorage?: never;
291
+ };
292
+ type LocaleStorage = {
293
+ /** Called once on init to restore the last selected locale. Return `null` if nothing is stored. Values not in `supportedLocales` are ignored. */
294
+ read: () => string | null;
295
+ /** Called whenever the active locale changes. Fires once on init with the resolved initial value. */
296
+ write: (locale: string) => void;
297
+ };
298
+ type DynamicConfig = BaseConfig & {
299
+ /** Custom storage mechanism for last set locale, it will be read on init & set the locale to the last value if it is still valid */
300
+ localeStorage?: LocaleStorage;
301
+ localeParamName?: never;
302
+ };
303
+ type Config = RouteBasedConfig | DynamicConfig;
304
+ declare function provideIntlConfig(config: Config): Provider[];
288
305
  declare function injectSupportedLocales(): string[];
289
306
  declare function injectIntl(): Signal<_formatjs_intl.IntlShape<string>>;
290
307
  /**