@mmstack/translate 21.1.8 β 21.1.10
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
|
@@ -30,23 +30,25 @@ It uses the robust **FormatJS** Intl runtime (`@formatjs/intl`) for ICU message
|
|
|
30
30
|
- π **ICU Message Syntax:** Uses FormatJS runtime for robust support of variables (`{name}`), `plural`, `select`, and `selectordinal`. (Note: Complex inline date/number formats are not the focus; use Angular's built-in Pipes/format functions & use the result as variables in your translation.)
|
|
31
31
|
- π **Shared Namespace Support:** Define common translations (e.g., 'Save', 'Cancel') in one namespace and make them type-safely accessible from others.
|
|
32
32
|
- π οΈ **Template Helpers:** Includes abstract `Translator` pipe and `Translate` directive for easy, type-safe templating.
|
|
33
|
+
- π’ **Reactive Formatters:** First-class, Intl-based, locale-aware formatters for dates, numbers, currencies, percentages, lists, and relative time β all automatically reactive to locale changes via signals, no zone or common/locale dependency required.
|
|
33
34
|
|
|
34
35
|
### Comparison
|
|
35
36
|
|
|
36
|
-
While Angular offers excellent i18n solutions like `@angular/localize` and
|
|
37
|
-
|
|
38
|
-
| Feature | `@mmstack/translate` |
|
|
39
|
-
| :----------------------- | :----------------------------------: |
|
|
40
|
-
| **Build Process** | β
Single or Multi-Build |
|
|
41
|
-
| **Translation Timing** | Runtime or Build Time |
|
|
42
|
-
| **Type Safety (Keys)** | β
Strong (Inferred from structure) |
|
|
43
|
-
| **Type Safety (Params)** | β
Strong (Inferred from ICU) |
|
|
44
|
-
| **Locale Switching** | β
Dynamic (Runtime) or Page refresh |
|
|
45
|
-
| **Lazy Loading** | β
Built-in (Namespaces/Resolvers) |
|
|
46
|
-
| **Namespacing/Scopes** | β
Built-in |
|
|
47
|
-
| **ICU Support** | β
Subset (via FormatJS Runtime) |
|
|
48
|
-
| **Signal Integration** |
|
|
49
|
-
| **
|
|
37
|
+
While Angular offers excellent i18n solutions like `@angular/localize` and `@jsverse/transloco`, `@mmstack/translate` aims to fill a specific niche by supporting **both** traditional multi-build and modern single-build approaches with a typesafe & modular approach, perfect for nx-based environments.
|
|
38
|
+
|
|
39
|
+
| Feature | `@mmstack/translate` | `@angular/localize` | `@jsverse/transloco` | `ngx-translate` |
|
|
40
|
+
| :----------------------- | :----------------------------------: | :---------------------------: | :--------------------------------------------------------------------------------------------------: | :-------------------------: |
|
|
41
|
+
| **Build Process** | β
Single or Multi-Build | β Multi-Build (Typical) | β
Single Build | β
Single Build |
|
|
42
|
+
| **Translation Timing** | Runtime or Build Time | Compile Time | Runtime | Runtime |
|
|
43
|
+
| **Type Safety (Keys)** | β
Strong (Inferred from structure) | π‘ via extraction | π‘ Tooling/TS Files | π‘ OK Manual/Tooling |
|
|
44
|
+
| **Type Safety (Params)** | β
Strong (Inferred from ICU) | β None | π‘ Manual | π‘ Manual |
|
|
45
|
+
| **Locale Switching** | β
Dynamic (Runtime) or Page refresh | π Page Refresh Required | β
Dynamic (Runtime) | β
Dynamic (Runtime) |
|
|
46
|
+
| **Lazy Loading** | β
Built-in (Namespaces/Resolvers) | N/A (Compile Time) | β
Built-in (Scopes) | β
Yes (Custom Loaders) |
|
|
47
|
+
| **Namespacing/Scopes** | β
Built-in | β None | β
Built-in (Scopes) | π‘ Manual (File Structure) |
|
|
48
|
+
| **ICU Support** | β
Subset (via FormatJS Runtime) | β
Yes (Compile Time) | β
Yes (Runtime Intl/Plugins) | π‘ Via Extensions |
|
|
49
|
+
| **Signal Integration** | β
Great (fully reactive) | N/A | β
Good (`translateSignal()`, `activeLang` signal) | β Minimal/NoneΒΉ |
|
|
50
|
+
| **Reactive Formatters** | β
Built-in Intl integration | π‘ Angular pipes (zone-based) | β
@jsverse/transloco-locale(`transloco-locale`Β²: date/number/currency/percent, not signal-reactive) | β None (use Angular pipes) |
|
|
51
|
+
| **Maturity / Community** | π‘ Less mature, but battle tested | Core Angular | β
Mature / Active | β
Mature |
|
|
50
52
|
|
|
51
53
|
## Installation
|
|
52
54
|
|
|
@@ -215,13 +217,11 @@ import { type QuoteLocale } from './quote.namespace';
|
|
|
215
217
|
|
|
216
218
|
@Pipe({
|
|
217
219
|
name: 'translate',
|
|
218
|
-
standalone: true,
|
|
219
220
|
})
|
|
220
221
|
export class QuoteTranslator extends Translator<QuoteLocale> {}
|
|
221
222
|
|
|
222
223
|
@Directive({
|
|
223
224
|
selector: '[translate]', // Input in Translate is named 'translate'
|
|
224
|
-
standalone: true,
|
|
225
225
|
})
|
|
226
226
|
export class QuoteTranslate<TInput extends string> extends Translate<TInput, QuoteLocale> {}
|
|
227
227
|
```
|
|
@@ -235,12 +235,18 @@ import { QuoteTranslator, QuoteTranslate } from './quote.helpers';
|
|
|
235
235
|
|
|
236
236
|
@Component({
|
|
237
237
|
selector: 'app-quote',
|
|
238
|
-
standalone: true,
|
|
239
238
|
imports: [QuoteTranslator, QuoteTranslate],
|
|
240
239
|
template: `
|
|
240
|
+
<!-- t() can be called directly in templates for variable-free keys.
|
|
241
|
+
It is fully reactive & performant enough for this to work well -->
|
|
242
|
+
<h1>{{ t('quote.pageTitle') }}</h1>
|
|
243
|
+
<span>{{ t('quote.detail.authorLabel') }}</span>
|
|
244
|
+
|
|
245
|
+
<!-- For keys with variables, use t.asSignal() instead (see below).
|
|
246
|
+
Calling t('key', { ... }) in a template creates a new object literal
|
|
247
|
+
every change detection cycle, causing recomputation & gc churn -->
|
|
248
|
+
|
|
241
249
|
<!-- Pipe validates key & variables match -->
|
|
242
|
-
<h1>{{ 'quote.pageTitle' | translate }}</h1>
|
|
243
|
-
<!-- Non-pluralized params must be string -->
|
|
244
250
|
<span>{{ 'quote.errors.minLength' | translate: { min: '5' } }}</span>
|
|
245
251
|
|
|
246
252
|
<!-- Directive replaces textContent of element -->
|
|
@@ -250,18 +256,35 @@ import { QuoteTranslator, QuoteTranslate } from './quote.helpers';
|
|
|
250
256
|
})
|
|
251
257
|
export class QuoteComponent {
|
|
252
258
|
protected readonly count = signal(0);
|
|
253
|
-
private readonly t = injectQuoteT();
|
|
254
259
|
|
|
255
|
-
//
|
|
256
|
-
|
|
260
|
+
// Must be protected/public to be accessible from the template
|
|
261
|
+
protected readonly t = injectQuoteT();
|
|
257
262
|
|
|
258
|
-
//
|
|
259
|
-
|
|
263
|
+
// performance best case, but only useful in a compiled locale scenario (when using LOCALE_ID)
|
|
264
|
+
protected readonly title = t('quote.pageTitle');
|
|
265
|
+
|
|
266
|
+
// For variable keys (or optimization scenarios), use asSignal() β it memoizes the result and only
|
|
267
|
+
// re-evaluates when the signal-based parameters actually change. If no variables are provided it basically
|
|
268
|
+
// recomputes only on locale changes
|
|
269
|
+
protected readonly stats = this.t.asSignal('quote.stats', () => ({
|
|
260
270
|
count: this.count(), // Must match ICU parameter (type: number)
|
|
261
271
|
}));
|
|
262
272
|
}
|
|
263
273
|
```
|
|
264
274
|
|
|
275
|
+
**When to use each API:**
|
|
276
|
+
|
|
277
|
+
| Scenario | Recommended API |
|
|
278
|
+
| :----------------------------------------- | :----------------------------------------------------------- |
|
|
279
|
+
| Variable-free key in a template | `{{ t('ns.key') }}` |
|
|
280
|
+
| Variable-free key in class logic | `this.t('ns.key')` |
|
|
281
|
+
| Key with variables in a template | `t.asSignal('ns.key', () => ({ var: val() }))` |
|
|
282
|
+
| Key with variables in class logic | `this.t.asSignal('ns.key', () => ({ var: val() }))` |
|
|
283
|
+
| Type-safe pipe (with or without variables) | `'ns.key' \| translate` / `'ns.key' \| translate: vars` |
|
|
284
|
+
| Structural DOM replacement | `<el translate="ns.key">` / `[translate]="['ns.key', vars]"` |
|
|
285
|
+
|
|
286
|
+
> **Why not `t(key, vars)` in templates?** Each change detection cycle creates a new object literal for `vars`, so FormatJS re-formats the message even when the values haven't changed. `t.asSignal()` wraps the params in a `computed()` with deep equality, skipping re-evaluation when the underlying values are stable.
|
|
287
|
+
|
|
265
288
|
### 4. [OPTIONAL] Route-Based Locale Detection
|
|
266
289
|
|
|
267
290
|
For applications with locale-based routing (e.g., `/en-US/quotes`, `/sl-SI/quotes`), the library can automatically detect and switch locales.
|
|
@@ -544,6 +567,12 @@ The library includes a set of reactive formatters that automatically adapt to th
|
|
|
544
567
|
|
|
545
568
|
**Note:** For reactivity, wrap them in a `computed()` if the input signals change or if you want them to react to dynamic locale changes.
|
|
546
569
|
|
|
570
|
+
**SSR note:** Formatters read the active locale from a process-level signal. This is safe for all client-side usage and for SSR on serverless platforms (Lambda, Vercel, Netlify Edge) or worker-thread pools, where each request runs in an isolated V8 context. If you run a traditional single-process Node.js SSR server and concurrently render pages for **different** locales, pass the locale explicitly via the `locale` option on each formatter to avoid a potential cross-request read:
|
|
571
|
+
|
|
572
|
+
```typescript
|
|
573
|
+
readonly displayDate = computed(() => formatDate(this.date, { locale: this.currentLocale() }));
|
|
574
|
+
```
|
|
575
|
+
|
|
547
576
|
Available formatters:
|
|
548
577
|
|
|
549
578
|
- **`formatDate`**: Wraps `Intl.DateTimeFormat`
|
|
@@ -131,29 +131,30 @@ function injectSupportedLocales() {
|
|
|
131
131
|
* @internal
|
|
132
132
|
* the actual locale signal used to store the current locale string
|
|
133
133
|
*/
|
|
134
|
-
const STORE_LOCALE = signal('en-US', ...(ngDevMode ? [{ debugName: "STORE_LOCALE" }] : []));
|
|
134
|
+
const STORE_LOCALE = signal('en-US', ...(ngDevMode ? [{ debugName: "STORE_LOCALE" }] : /* istanbul ignore next */ []));
|
|
135
135
|
function injectLocaleInternal() {
|
|
136
136
|
return STORE_LOCALE;
|
|
137
137
|
}
|
|
138
138
|
class TranslationStore {
|
|
139
|
+
simpleKeyMap = new Map();
|
|
139
140
|
cache = createIntlCache();
|
|
140
141
|
config = injectIntlConfig();
|
|
141
|
-
loadQueue = signal([], ...(ngDevMode ? [{ debugName: "loadQueue" }] : []));
|
|
142
|
+
loadQueue = signal([], ...(ngDevMode ? [{ debugName: "loadQueue" }] : /* istanbul ignore next */ []));
|
|
142
143
|
locale;
|
|
143
144
|
defaultLocale = injectDefaultLocale();
|
|
144
145
|
translations = signal({
|
|
145
146
|
[this.defaultLocale]: {},
|
|
146
|
-
}, ...(ngDevMode ? [{ debugName: "translations" }] : []));
|
|
147
|
+
}, ...(ngDevMode ? [{ debugName: "translations" }] : /* istanbul ignore next */ []));
|
|
147
148
|
attemptedFallbackLoad = false;
|
|
148
149
|
onDemandLoaders = new Map();
|
|
149
150
|
nonMessageConfig = computed(() => ({
|
|
150
151
|
...this.config,
|
|
151
152
|
locale: this.locale(),
|
|
152
|
-
}), ...(ngDevMode ? [{ debugName: "nonMessageConfig" }] : []));
|
|
153
|
+
}), ...(ngDevMode ? [{ debugName: "nonMessageConfig" }] : /* istanbul ignore next */ []));
|
|
153
154
|
messages = computed(() => this.translations()[this.locale()] ??
|
|
154
155
|
this.translations()[this.defaultLocale] ??
|
|
155
|
-
{}, ...(ngDevMode ? [{ debugName: "messages" }] : []));
|
|
156
|
-
dynamicLocaleLoader = resource({ ...(ngDevMode ? { debugName: "dynamicLocaleLoader" } : {}), params: computed(() => this.loadQueue().at(0) ?? null),
|
|
156
|
+
{}, ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
|
|
157
|
+
dynamicLocaleLoader = resource({ ...(ngDevMode ? { debugName: "dynamicLocaleLoader" } : /* istanbul ignore next */ {}), params: computed(() => this.loadQueue().at(0) ?? null),
|
|
157
158
|
loader: async ({ params: newLocale, abortSignal }) => {
|
|
158
159
|
if (!newLocale)
|
|
159
160
|
return;
|
|
@@ -193,7 +194,7 @@ class TranslationStore {
|
|
|
193
194
|
intl = computed(() => createIntl({
|
|
194
195
|
...this.nonMessageConfig(),
|
|
195
196
|
messages: this.messages(),
|
|
196
|
-
}, this.cache), ...(ngDevMode ? [{ debugName: "intl" }] : []));
|
|
197
|
+
}, this.cache), ...(ngDevMode ? [{ debugName: "intl" }] : /* istanbul ignore next */ []));
|
|
197
198
|
constructor() {
|
|
198
199
|
this.locale = STORE_LOCALE;
|
|
199
200
|
this.locale.set(injectDefaultLocale());
|
|
@@ -235,7 +236,20 @@ class TranslationStore {
|
|
|
235
236
|
}
|
|
236
237
|
});
|
|
237
238
|
}
|
|
239
|
+
buildSimpleKeySignal(key) {
|
|
240
|
+
const found = this.simpleKeyMap.get(key);
|
|
241
|
+
if (found)
|
|
242
|
+
return found;
|
|
243
|
+
const sig = computed(() => this.formatMessageInternal(key), ...(ngDevMode ? [{ debugName: "sig" }] : /* istanbul ignore next */ []));
|
|
244
|
+
this.simpleKeyMap.set(key, sig);
|
|
245
|
+
return sig;
|
|
246
|
+
}
|
|
238
247
|
formatMessage(key, values) {
|
|
248
|
+
if (values === undefined)
|
|
249
|
+
return this.buildSimpleKeySignal(key)();
|
|
250
|
+
return this.formatMessageInternal(key, values);
|
|
251
|
+
}
|
|
252
|
+
formatMessageInternal(key, values) {
|
|
239
253
|
const message = this.translations()[this.locale()]?.[key] ??
|
|
240
254
|
this.translations()[this.defaultLocale]?.[key] ??
|
|
241
255
|
'';
|
|
@@ -273,10 +287,10 @@ class TranslationStore {
|
|
|
273
287
|
hasLocaleLoaders(locale) {
|
|
274
288
|
return Array.from(this.onDemandLoaders.values()).some((loaders) => loaders[locale]);
|
|
275
289
|
}
|
|
276
|
-
static Ι΅fac = i0.Ι΅Ι΅ngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
277
|
-
static Ι΅prov = i0.Ι΅Ι΅ngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
290
|
+
static Ι΅fac = i0.Ι΅Ι΅ngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TranslationStore, deps: [], target: i0.Ι΅Ι΅FactoryTarget.Injectable });
|
|
291
|
+
static Ι΅prov = i0.Ι΅Ι΅ngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TranslationStore, providedIn: 'root' });
|
|
278
292
|
}
|
|
279
|
-
i0.Ι΅Ι΅ngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
293
|
+
i0.Ι΅Ι΅ngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TranslationStore, decorators: [{
|
|
280
294
|
type: Injectable,
|
|
281
295
|
args: [{
|
|
282
296
|
providedIn: 'root',
|
|
@@ -595,34 +609,45 @@ function createEqualsRecord(keys = []) {
|
|
|
595
609
|
return keyMatcher(a, b);
|
|
596
610
|
};
|
|
597
611
|
}
|
|
598
|
-
function addSignalFn(fn, store) {
|
|
612
|
+
function addSignalFn(fn, store, keyMap) {
|
|
599
613
|
const withSig = fn;
|
|
600
|
-
const asSignal = (key,
|
|
601
|
-
const variables = args[0];
|
|
614
|
+
const asSignal = (key, variables) => {
|
|
602
615
|
const stringKey = key;
|
|
603
|
-
|
|
604
|
-
|
|
616
|
+
let flatPath = keyMap.get(stringKey);
|
|
617
|
+
if (flatPath === undefined) {
|
|
618
|
+
flatPath = replaceWithDelim(stringKey);
|
|
619
|
+
keyMap.set(stringKey, flatPath);
|
|
620
|
+
}
|
|
621
|
+
if (variables === undefined)
|
|
622
|
+
return store.buildSimpleKeySignal(flatPath);
|
|
623
|
+
const varsFn = variables;
|
|
605
624
|
const varsSignal = isSignal(varsFn)
|
|
606
625
|
? varsFn
|
|
607
|
-
: computed(varsFn, {
|
|
608
|
-
equal: createEqualsRecord(Object.keys(varsFn()
|
|
626
|
+
: computed(() => varsFn(), {
|
|
627
|
+
equal: createEqualsRecord(Object.keys(varsFn())),
|
|
609
628
|
});
|
|
610
629
|
return computed(() => store.formatMessage(flatPath, varsSignal()));
|
|
611
630
|
};
|
|
612
631
|
withSig.asSignal = asSignal;
|
|
613
632
|
return withSig;
|
|
614
633
|
}
|
|
615
|
-
function createT(store) {
|
|
616
|
-
|
|
617
|
-
const variables = args[0];
|
|
634
|
+
function createT(store, keyMap = new Map()) {
|
|
635
|
+
const fn = (key, variables) => {
|
|
618
636
|
const stringKey = key;
|
|
619
|
-
|
|
637
|
+
let k = keyMap.get(stringKey);
|
|
638
|
+
if (k === undefined) {
|
|
639
|
+
k = replaceWithDelim(stringKey);
|
|
640
|
+
keyMap.set(stringKey, k);
|
|
641
|
+
}
|
|
642
|
+
return store.formatMessage(k, variables);
|
|
620
643
|
};
|
|
644
|
+
return fn;
|
|
621
645
|
}
|
|
622
646
|
function registerNamespace(defaultTranslation, other) {
|
|
647
|
+
const keyMap = new Map();
|
|
623
648
|
const injectT = () => {
|
|
624
649
|
const store = inject(TranslationStore);
|
|
625
|
-
return addSignalFn(createT(store), store);
|
|
650
|
+
return addSignalFn(createT(store, keyMap), store, keyMap);
|
|
626
651
|
};
|
|
627
652
|
let defaultTranslationLoaded = false;
|
|
628
653
|
const resolver = async (snapshot) => {
|
|
@@ -686,9 +711,10 @@ function registerNamespace(defaultTranslation, other) {
|
|
|
686
711
|
* The resolver & t function work the same as they would with typed namespaces, but without type safety
|
|
687
712
|
*/
|
|
688
713
|
function registerRemoteNamespace(ns, defaultTranslation, other) {
|
|
714
|
+
const keyMap = new Map();
|
|
689
715
|
const injectT = () => {
|
|
690
716
|
const store = inject(TranslationStore);
|
|
691
|
-
return addSignalFn(createT(store), store);
|
|
717
|
+
return addSignalFn(createT(store, keyMap), store, keyMap);
|
|
692
718
|
};
|
|
693
719
|
let defaultTranslationLoaded = false;
|
|
694
720
|
const resolver = async (snapshot) => {
|
|
@@ -778,30 +804,36 @@ function canMatchLocale(prefixSegments = []) {
|
|
|
778
804
|
};
|
|
779
805
|
}
|
|
780
806
|
|
|
807
|
+
function compareObjects(a, b) {
|
|
808
|
+
if (!a && !b)
|
|
809
|
+
return true;
|
|
810
|
+
if (!a || !b)
|
|
811
|
+
return false;
|
|
812
|
+
const aKeys = Object.keys(a);
|
|
813
|
+
const bKeys = Object.keys(b);
|
|
814
|
+
if (aKeys.length !== bKeys.length)
|
|
815
|
+
return false;
|
|
816
|
+
return aKeys.every((key) => a[key] === b[key]);
|
|
817
|
+
}
|
|
781
818
|
class Translate {
|
|
782
819
|
t = createT(inject(TranslationStore));
|
|
783
|
-
translate = input.required(...(ngDevMode ? [{ debugName: "translate" }] : []));
|
|
820
|
+
translate = input.required(...(ngDevMode ? [{ debugName: "translate" }] : /* istanbul ignore next */ []));
|
|
784
821
|
constructor() {
|
|
785
|
-
const
|
|
786
|
-
|
|
787
|
-
return (Array.isArray(vars) ? vars[0] : vars);
|
|
788
|
-
}, ...(ngDevMode ? [{ debugName: "key" }] : []));
|
|
789
|
-
const args = computed(() => {
|
|
790
|
-
const vars = this.translate();
|
|
791
|
-
return (Array.isArray(vars) ? vars[1] : undefined);
|
|
792
|
-
}, { ...(ngDevMode ? { debugName: "args" } : {}), equal: (a, b) => {
|
|
793
|
-
if (a === undefined && b === undefined)
|
|
822
|
+
const inputs = computed(() => this.translate(), { ...(ngDevMode ? { debugName: "inputs" } : /* istanbul ignore next */ {}), equal: (a, b) => {
|
|
823
|
+
if (a === b)
|
|
794
824
|
return true;
|
|
795
|
-
if (a ===
|
|
825
|
+
if (typeof a === 'string' || typeof b === 'string')
|
|
796
826
|
return false;
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
if (!keys.length)
|
|
801
|
-
return !Object.keys(bObj).length;
|
|
802
|
-
return keys.every((key) => aObj[key] === bObj[key]);
|
|
827
|
+
if (a[0] !== b[0])
|
|
828
|
+
return false;
|
|
829
|
+
return compareObjects(a[1], b[1]);
|
|
803
830
|
} });
|
|
804
|
-
const translation = computed(() =>
|
|
831
|
+
const translation = computed(() => {
|
|
832
|
+
const inp = inputs();
|
|
833
|
+
return typeof inp === 'string'
|
|
834
|
+
? this.t(inp)
|
|
835
|
+
: this.t(inp[0], inp[1]);
|
|
836
|
+
}, ...(ngDevMode ? [{ debugName: "translation" }] : /* istanbul ignore next */ []));
|
|
805
837
|
const renderer = inject(Renderer2);
|
|
806
838
|
const el = inject(ElementRef);
|
|
807
839
|
afterRenderEffect({
|
|
@@ -810,27 +842,34 @@ class Translate {
|
|
|
810
842
|
},
|
|
811
843
|
});
|
|
812
844
|
}
|
|
813
|
-
static Ι΅fac = i0.Ι΅Ι΅ngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
814
|
-
static Ι΅dir = i0.Ι΅Ι΅ngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
845
|
+
static Ι΅fac = i0.Ι΅Ι΅ngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Translate, deps: [], target: i0.Ι΅Ι΅FactoryTarget.Directive });
|
|
846
|
+
static Ι΅dir = i0.Ι΅Ι΅ngDeclareDirective({ minVersion: "17.1.0", version: "21.2.8", type: Translate, isStandalone: true, inputs: { translate: { classPropertyName: "translate", publicName: "translate", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
|
|
815
847
|
}
|
|
816
|
-
i0.Ι΅Ι΅ngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
848
|
+
i0.Ι΅Ι΅ngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Translate, decorators: [{
|
|
817
849
|
type: Directive
|
|
818
850
|
}], ctorParameters: () => [], propDecorators: { translate: [{ type: i0.Input, args: [{ isSignal: true, alias: "translate", required: true }] }] } });
|
|
819
851
|
|
|
852
|
+
function createTransformFn() {
|
|
853
|
+
const store = inject(TranslationStore);
|
|
854
|
+
const t = createT(store);
|
|
855
|
+
const fn = (key, variablesOrLocale,
|
|
856
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
857
|
+
_) => {
|
|
858
|
+
const vars = typeof variablesOrLocale === 'string' ? undefined : variablesOrLocale;
|
|
859
|
+
return t(key, vars);
|
|
860
|
+
};
|
|
861
|
+
return fn;
|
|
862
|
+
}
|
|
820
863
|
class Translator {
|
|
821
|
-
store = inject(TranslationStore);
|
|
822
|
-
t = createT(this.store);
|
|
823
864
|
constructor() {
|
|
824
865
|
const cdr = inject(ChangeDetectorRef);
|
|
866
|
+
const locale = inject(TranslationStore).locale;
|
|
825
867
|
effect(() => {
|
|
826
|
-
|
|
868
|
+
locale();
|
|
827
869
|
cdr.markForCheck();
|
|
828
870
|
});
|
|
829
871
|
}
|
|
830
|
-
transform(
|
|
831
|
-
const actualArgs = args.filter((a) => typeof a === 'object');
|
|
832
|
-
return this.t(key, ...actualArgs);
|
|
833
|
-
}
|
|
872
|
+
transform = createTransformFn();
|
|
834
873
|
}
|
|
835
874
|
|
|
836
875
|
/**
|
|
@@ -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 { type UnknownStringKeyObject } from './string-key-object.type';\nimport {\n injectDefaultLocale,\n injectIntlConfig,\n TranslationStore,\n} from './translation-store';\n\n \ntype AnyStringRecord = Record<string, any>;\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): TFunctionWithSignalConstructor<TMap, TFn> {\n const withSig = fn as TFunctionWithSignalConstructor<TMap, TFn>;\n\n const asSignal = <TKey extends keyof TMap & string>(\n key: TKey,\n ...args: TMap[TKey] extends void ? [] : [() => TMap[TKey]]\n ): Signal<string> => {\n const variables = args[0] as () => AnyStringRecord | undefined;\n const stringKey = key as string;\n\n const flatPath = replaceWithDelim(stringKey);\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;\n\n return withSig;\n}\n\nexport function createT<TMap extends AnyStringRecord>(\n store: TranslationStore,\n): TFunction<TMap> {\n return <TKey extends keyof TMap & string>(\n key: TKey,\n ...args: TMap[TKey] extends void ? [] : [TMap[TKey]]\n ): string => {\n const variables = args[0] as AnyStringRecord | undefined;\n const stringKey = key as string;\n\n return store.formatMessage(replaceWithDelim(stringKey), variables);\n };\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 injectT = (): $TFN => {\n const store = inject(TranslationStore);\n\n return addSignalFn(createT(store), store);\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 injectT = (): UntypedTFunction<TNS> => {\n const store = inject(TranslationStore);\n\n return addSignalFn(createT(store), store) 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\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 key = computed(() => {\n const vars = this.translate();\n return (Array.isArray(vars) ? vars[0] : vars) as TKey;\n });\n\n const args = computed(\n () => {\n const vars = this.translate();\n return (Array.isArray(vars) ? vars[1] : undefined) as TMap[TKey];\n },\n {\n equal: (a, b) => {\n if (a === undefined && b === undefined) return true;\n if (a === undefined || b === undefined) return false;\n\n const aObj = a as Record<string, string>;\n const keys = Object.keys(aObj);\n const bObj = b as Record<string, string>;\n\n if (!keys.length) return !Object.keys(bObj).length;\n\n return keys.every((key) => aObj[key] === bObj[key]);\n },\n },\n );\n\n const translation = computed(() => this.t(key(), args()));\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 { type CompiledTranslation, type inferCompiledTranslationMap } from './compile';\nimport { createT } from './register-namespace';\nimport { type UnknownStringKeyObject } from './string-key-object.type';\nimport { TranslationStore } from './translation-store';\n\nexport abstract class Translator<\n T extends CompiledTranslation<UnknownStringKeyObject, string>,\n TMap extends inferCompiledTranslationMap<T> = inferCompiledTranslationMap<T>,\n> {\n private readonly store = inject(TranslationStore);\n private readonly t = createT<TMap>(this.store);\n\n constructor() {\n const cdr = inject(ChangeDetectorRef);\n\n effect(() => {\n this.store.locale();\n cdr.markForCheck();\n });\n }\n\n transform<K extends keyof TMap & string>(\n key: K,\n ...args: TMap[K] extends void\n ? [locale?: string]\n : [TMap[K], locale?: string]\n ): string {\n const actualArgs = args.filter(\n (a) => typeof a === 'object',\n ) as TMap[K] extends void ? [] : [TMap[K]];\n\n return this.t(key, ...actualArgs);\n }\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\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 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 = 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 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.
|
|
3
|
+
"version": "21.1.10",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"angular",
|
|
6
6
|
"localize",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git",
|
|
14
|
-
"url": "https://github.com/mihajm/mmstack"
|
|
14
|
+
"url": "git+https://github.com/mihajm/mmstack.git",
|
|
15
|
+
"directory": "packages/translate"
|
|
15
16
|
},
|
|
16
17
|
"peerDependencies": {
|
|
17
18
|
"@angular/core": ">=21 <22",
|
|
@@ -31,6 +32,7 @@
|
|
|
31
32
|
"default": "./fesm2022/mmstack-translate.mjs"
|
|
32
33
|
}
|
|
33
34
|
},
|
|
35
|
+
"type": "module",
|
|
34
36
|
"dependencies": {
|
|
35
37
|
"tslib": "^2.3.0"
|
|
36
38
|
}
|
|
@@ -5,6 +5,7 @@ import * as _formatjs_intl from '@formatjs/intl';
|
|
|
5
5
|
import { IntlConfig } from '@formatjs/intl';
|
|
6
6
|
|
|
7
7
|
type UnknownStringKeyObject = Record<string, unknown>;
|
|
8
|
+
type AnyStringRecord = Record<string, any>;
|
|
8
9
|
|
|
9
10
|
type Simplify<T> = T extends infer U ? {
|
|
10
11
|
[K in keyof U]: Simplify<U[K]>;
|
|
@@ -309,7 +310,6 @@ declare function injectDynamicLocale(): WritableSignal<string> & {
|
|
|
309
310
|
isLoading: Signal<boolean>;
|
|
310
311
|
};
|
|
311
312
|
|
|
312
|
-
type AnyStringRecord = Record<string, any>;
|
|
313
313
|
type TFunction<TMap extends AnyStringRecord> = <TKey extends keyof TMap & string>(key: TKey, ...args: TMap[TKey] extends void ? [] : [TMap[TKey]]) => string;
|
|
314
314
|
type SignalTFunction<TMap extends AnyStringRecord> = <TKey extends keyof TMap & string>(key: TKey, ...args: TMap[TKey] extends void ? [] : [() => TMap[TKey]]) => Signal<string>;
|
|
315
315
|
type TFunctionWithSignalConstructor<TMap extends AnyStringRecord, TFN extends TFunction<TMap>> = TFN & {
|
|
@@ -360,11 +360,10 @@ declare abstract class Translate<TInput extends string, T extends CompiledTransl
|
|
|
360
360
|
static Ι΅dir: i0.Ι΅Ι΅DirectiveDeclaration<Translate<any, any, any, any>, never, never, { "translate": { "alias": "translate"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
+
type TransformTFn<T extends CompiledTranslation<UnknownStringKeyObject, string>, TMap extends inferCompiledTranslationMap<T>> = <TKey extends keyof TMap & string>(key: TKey, ...args: TMap[TKey] extends void ? [locale?: string] : [TMap[TKey], locale?: string]) => string;
|
|
363
364
|
declare abstract class Translator<T extends CompiledTranslation<UnknownStringKeyObject, string>, TMap extends inferCompiledTranslationMap<T> = inferCompiledTranslationMap<T>> {
|
|
364
|
-
private readonly store;
|
|
365
|
-
private readonly t;
|
|
366
365
|
constructor();
|
|
367
|
-
transform
|
|
366
|
+
transform: TransformTFn<T, TMap>;
|
|
368
367
|
}
|
|
369
368
|
|
|
370
369
|
/**
|