@xndrjs/i18n 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +154 -141
  2. package/dist/codegen/index.js.map +1 -1
  3. package/dist/index.d.ts +268 -69
  4. package/dist/index.js +572 -65
  5. package/dist/index.js.map +1 -1
  6. package/dist/validation/index.d.ts +23 -7
  7. package/dist/validation/index.js +196 -89
  8. package/dist/validation/index.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/IcuTranslationProviderMulti.test.ts +80 -234
  11. package/src/IcuTranslationProviderMulti.ts +101 -112
  12. package/src/IcuTranslationProviderSingle.test.ts +30 -309
  13. package/src/IcuTranslationProviderSingle.ts +42 -75
  14. package/src/builder-load-registry.ts +18 -0
  15. package/src/builder-loaders.ts +18 -0
  16. package/src/builder-multi.ts +481 -0
  17. package/src/builder-types.test.ts +80 -0
  18. package/src/builder-types.ts +24 -0
  19. package/src/builder.test.ts +421 -0
  20. package/src/builder.ts +112 -0
  21. package/src/codegen/delivery-artifacts.test.ts +2 -1
  22. package/src/codegen/delivery-artifacts.ts +2 -1
  23. package/src/codegen/emit/dictionary-file.test.ts +0 -7
  24. package/src/codegen/emit/dictionary-schema-file.ts +55 -42
  25. package/src/codegen/emit/instance-file.test.ts +88 -0
  26. package/src/codegen/emit/instance-file.ts +164 -17
  27. package/src/codegen/emit/namespace-loaders-file.test.ts +4 -18
  28. package/src/codegen/emit/namespace-loaders-file.ts +4 -54
  29. package/src/codegen/emit/types-file.test.ts +0 -2
  30. package/src/codegen/generate-i18n-types.test.ts +8 -303
  31. package/src/codegen/generate-i18n-types.ts +16 -1
  32. package/src/codegen/project-locales-set-namespace.test.ts +25 -32
  33. package/src/engine.ts +71 -0
  34. package/src/index.ts +45 -7
  35. package/src/patch-key.test.ts +186 -0
  36. package/src/patch-key.ts +140 -0
  37. package/src/project-locales.test.ts +16 -6
  38. package/src/project-locales.ts +17 -6
  39. package/src/scope-multi.ts +124 -0
  40. package/src/scope-single.ts +85 -0
  41. package/src/scope-types.ts +27 -0
  42. package/src/scope.test.ts +481 -0
  43. package/src/single-builder.ts +153 -0
  44. package/src/types.ts +16 -0
  45. package/src/validation/create-normalized-schema.ts +1 -1
  46. package/src/validation/errors.ts +2 -0
  47. package/src/validation/index.ts +135 -27
  48. package/src/validation/normalize.ts +176 -46
  49. package/src/validation/types.ts +4 -0
  50. package/src/validation/validate-normalized.ts +43 -1
  51. package/src/validation/validation.test.ts +200 -7
package/dist/index.d.ts CHANGED
@@ -1,3 +1,12 @@
1
+ /** Locales served by a delivery area, from a codegen `DELIVERY_ARTIFACTS`-shaped map. */
2
+ type LocalesForDeliveryArea<Artifacts extends Record<string, readonly string[]>, Area extends keyof Artifacts & string> = Artifacts[Area][number];
3
+ /** Map from delivery area to locale lists; empty when custom delivery is not configured. */
4
+ type DeliveryArtifactsMap<RequestLocales extends string, DeliveryArea extends string> = [
5
+ DeliveryArea
6
+ ] extends [never] ? Record<string, never> : Record<DeliveryArea, readonly RequestLocales[]>;
7
+ /** When a delivery-area map is configured, resolve partition locales; otherwise keep the full pool. */
8
+ type LocalesForDeliveryAreaOrAll<RequestLocales extends string, DeliveryArea extends string, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea>, Area extends string> = [DeliveryArea] extends [never] ? RequestLocales : Area extends DeliveryArea ? DeliveryArtifacts[Area][number] : never;
9
+
1
10
  type LocaleDictionary = Record<string, string>;
2
11
  type KeyDictionary = Record<string, LocaleDictionary>;
3
12
  type MultiDictionary = Record<string, KeyDictionary>;
@@ -9,6 +18,14 @@ type LocaleOfMulti<Schema extends MultiDictionary> = {
9
18
  [K in keyof Schema[NS]]: keyof Schema[NS][K];
10
19
  }[keyof Schema[NS]];
11
20
  }[keyof Schema] & string;
21
+ /** Subset of schema keys with any subset of project locales per key — valid input for merge operations. */
22
+ type PartialKeyDictionary<T extends KeyDictionary, Locales extends string = LocaleOfSingle<T>> = {
23
+ [K in keyof T]?: Partial<Record<Locales, string>>;
24
+ };
25
+ /** Subset of schema namespaces with partial keys/locales — valid input for multi merge operations. */
26
+ type PartialMultiDictionary<T extends MultiDictionary, Locales extends string = LocaleOfMulti<T>> = {
27
+ [NS in keyof T]?: PartialKeyDictionary<T[NS], Locales>;
28
+ };
12
29
  type LocaleFallbackMap$1 = Record<string, string | null>;
13
30
  type MissingTranslationContext = {
14
31
  /** Only set by the multi-namespace provider. */
@@ -29,98 +46,280 @@ type IcuTranslationProviderOptions<Fallback extends LocaleFallbackMap$1 | undefi
29
46
  onMissing?: OnMissingTranslation;
30
47
  };
31
48
 
32
- interface TranslationProviderSingleForLocale<Schema extends KeyDictionary, Params extends {
49
+ /** ICU argument map for a multi-namespace schema. */
50
+ type MultiParams<Schema extends MultiDictionary> = {
51
+ [NS in keyof Schema]: {
52
+ [K in keyof Schema[NS]]: unknown;
53
+ };
54
+ };
55
+ /** Restrict a multi schema to a subset of namespaces. */
56
+ type SchemaForNamespaces<Schema extends MultiDictionary, NsList extends readonly (keyof Schema & string)[]> = Pick<Schema, NsList[number]>;
57
+ /** Restrict multi ICU params to a subset of namespaces. */
58
+ type ParamsForNamespaces<Schema extends MultiDictionary, Params extends MultiParams<Schema>, NsList extends readonly (keyof Schema & string)[]> = Pick<Params, NsList[number]>;
59
+ /** ICU argument map for a single-namespace schema. */
60
+ type SingleParams<Schema extends KeyDictionary> = {
33
61
  [K in keyof Schema]: unknown;
34
- }, Locale extends string> {
62
+ };
63
+ /** Rest args for `t()` — `never` params omit the third argument. */
64
+ type ParamArgs<P> = [P] extends [never] ? [] : [params: P];
65
+
66
+ /** Type-safe translation scope for a multi-namespace schema subset. */
67
+ interface I18nScopeMulti<Schema extends MultiDictionary, Params, RequestLocales extends string = LocaleOfMulti<Schema>> {
68
+ t<const NS extends keyof Schema & keyof Params & string, const K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, locale: RequestLocales, ...params: ParamArgs<Params[NS][K]>): string;
69
+ forLocale<Locale extends RequestLocales>(locale: Locale): I18nScopeMultiForLocale<Schema, Params, RequestLocales, Locale>;
70
+ }
71
+ /** Multi-namespace scope with a bound locale — `t(namespace, key)` and `set(...)` without a locale argument. */
72
+ interface I18nScopeMultiForLocale<Schema extends MultiDictionary, Params, RequestLocales extends string, Locale extends RequestLocales> {
35
73
  readonly locale: Locale;
36
- get<K extends keyof Schema & string>(key: K, ...params: Params[K] extends never ? [] : [params: Params[K]]): string;
74
+ t<const NS extends keyof Schema & keyof Params & string, const K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, ...params: ParamArgs<Params[NS][K]>): string;
75
+ set<const NS extends keyof Schema & keyof Params & string, const K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, template: string): void;
76
+ forLocale<Next extends RequestLocales>(locale: Next): I18nScopeMultiForLocale<Schema, Params, RequestLocales, Next>;
77
+ }
78
+
79
+ declare class IcuTranslationProviderMulti<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements I18nEngineMulti<Schema, Params, RequestLocales> {
80
+ readonly __i18nEngineMode: "multi";
81
+ private dictionary;
82
+ private compiledCache;
83
+ private readonly preloadedKeys;
84
+ private readonly builderLoadRegistry;
85
+ private readonly localeFallback?;
86
+ private readonly onMissing;
87
+ constructor(dictionary: PartialMultiDictionary<Schema, RequestLocales>, options?: IcuTranslationProviderOptions<Fallback>);
88
+ getWithLocale(namespace: string, key: string, locale: string, params?: Record<string, unknown>): string;
89
+ toScope<NsList extends readonly (keyof Schema & string)[], Locale extends RequestLocales>(options: {
90
+ namespaces: NsList;
91
+ locale: Locale;
92
+ }): I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales, Locale>;
93
+ toScope<NsList extends readonly (keyof Schema & string)[]>(options: {
94
+ namespaces: NsList;
95
+ }): I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales>;
96
+ getAll(): Schema;
97
+ hasBuilderResourceLoaded(namespace: string, partition: string | undefined): boolean;
98
+ markBuilderResourceLoaded(namespace: string, partition: string | undefined): void;
99
+ applyLoadMergeNamespace<NS extends keyof Schema>(namespace: NS, values: PartialKeyDictionary<Schema[NS], RequestLocales>): void;
100
+ applyLoadMergeAll(values: PartialMultiDictionary<Schema, RequestLocales>): void;
101
+ patchKeyMulti(namespace: string, key: string, locale: string, template: string): void;
37
102
  }
38
- interface TranslationProviderSingle<Schema extends KeyDictionary, Params extends {
103
+
104
+ /** Type-safe translation scope for a single-namespace schema. */
105
+ interface I18nScopeSingle<Schema extends KeyDictionary, Params extends {
39
106
  [K in keyof Schema]: unknown;
40
107
  }, RequestLocales extends string = LocaleOfSingle<Schema>> {
41
- get<K extends keyof Schema & string>(key: K, locale: RequestLocales, ...params: Params[K] extends never ? [] : [params: Params[K]]): string;
42
- forLocale<Locale extends RequestLocales>(locale: Locale): TranslationProviderSingleForLocale<Schema, Params, Locale>;
43
- getAll(): Schema;
44
- setAll(values: Schema): void;
45
- mergeAll(values: Partial<Schema>): void;
108
+ t<const K extends keyof Schema & string>(key: K, locale: RequestLocales, ...params: ParamArgs<Params[K]>): string;
109
+ forLocale<Locale extends RequestLocales>(locale: Locale): I18nScopeSingleForLocale<Schema, Params, Locale>;
110
+ }
111
+ /** Single-namespace scope with a bound locale — `t(key)` and `set(key)` without a locale argument. */
112
+ interface I18nScopeSingleForLocale<Schema extends KeyDictionary, Params extends {
113
+ [K in keyof Schema]: unknown;
114
+ }, Locale extends string> {
115
+ readonly locale: Locale;
116
+ t<const K extends keyof Schema & string>(key: K, ...params: ParamArgs<Params[K]>): string;
117
+ set<const K extends keyof Schema & string>(key: K, template: string): void;
118
+ forLocale<Next extends Locale>(locale: Next): I18nScopeSingleForLocale<Schema, Params, Next>;
46
119
  }
47
- declare class IcuTranslationProviderSingleForLocale<Schema extends KeyDictionary, Params extends {
120
+ declare class I18nScopeSingleImpl<Schema extends KeyDictionary, Params extends {
48
121
  [K in keyof Schema]: unknown;
49
- }, RequestLocales extends string, Locale extends RequestLocales, Fallback extends LocaleFallbackMap$1 | undefined> implements TranslationProviderSingleForLocale<Schema, Params, Locale> {
50
- private readonly provider;
122
+ }, RequestLocales extends string, Fallback extends LocaleFallbackMap$1 | undefined> implements I18nScopeSingle<Schema, Params, RequestLocales> {
123
+ private readonly engine;
124
+ constructor(engine: IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>);
125
+ t: <const K extends keyof Schema & string>(key: K, locale: RequestLocales, ...args: ParamArgs<Params[K]>) => string;
126
+ forLocale: <Locale extends RequestLocales>(locale: Locale) => I18nScopeSingleForLocaleImpl<Schema, Params, RequestLocales, Locale, Fallback>;
127
+ }
128
+ declare class I18nScopeSingleForLocaleImpl<Schema extends KeyDictionary, Params extends {
129
+ [K in keyof Schema]: unknown;
130
+ }, RequestLocales extends string, Locale extends RequestLocales, Fallback extends LocaleFallbackMap$1 | undefined> implements I18nScopeSingleForLocale<Schema, Params, Locale> {
131
+ private readonly engine;
51
132
  readonly locale: Locale;
52
- constructor(provider: IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>, locale: Locale);
53
- get<K extends keyof Schema & string>(key: K, ...args: Params[K] extends never ? [] : [params: Params[K]]): string;
133
+ constructor(engine: IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>, locale: Locale);
134
+ t: <const K extends keyof Schema & string>(key: K, ...args: ParamArgs<Params[K]>) => string;
135
+ set: <const K extends keyof Schema & string>(key: K, template: string) => void;
136
+ forLocale: <Next extends Locale>(locale: Next) => I18nScopeSingleForLocaleImpl<Schema, Params, RequestLocales, Next, Fallback>;
54
137
  }
138
+
55
139
  declare class IcuTranslationProviderSingle<Schema extends KeyDictionary, Params extends {
56
140
  [K in keyof Schema]: unknown;
57
- }, RequestLocales extends string = LocaleOfSingle<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements TranslationProviderSingle<Schema, Params, RequestLocales> {
141
+ }, RequestLocales extends string = LocaleOfSingle<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements I18nEngineSingle<Schema, Params, RequestLocales> {
142
+ readonly __i18nEngineMode: "single";
58
143
  private dictionary;
59
144
  private compiledCache;
145
+ private readonly preloadedKeys;
146
+ private readonly builderLoadRegistry;
60
147
  private readonly localeFallback?;
61
148
  private readonly onMissing;
62
149
  constructor(dictionary: Schema, options?: IcuTranslationProviderOptions<Fallback>);
63
- get<K extends keyof Schema & string>(key: K, locale: RequestLocales, ...args: Params[K] extends never ? [] : [params: Params[K]]): string;
64
150
  getWithLocale(key: string, locale: string, params?: Record<string, unknown>): string;
65
- forLocale<Locale extends RequestLocales>(locale: Locale): IcuTranslationProviderSingleForLocale<Schema, Params, RequestLocales, Locale, Fallback>;
151
+ toScope(): I18nScopeSingleImpl<Schema, Params, RequestLocales, Fallback>;
152
+ toScope<Locale extends RequestLocales>(options: {
153
+ locale: Locale;
154
+ }): I18nScopeSingleForLocaleImpl<Schema, Params, RequestLocales, Locale, Fallback>;
66
155
  getAll(): Schema;
67
- setAll(values: Schema): void;
68
- mergeAll(values: Partial<Schema>): void;
156
+ hasBuilderResourceLoaded(partition: string | undefined): boolean;
157
+ markBuilderResourceLoaded(partition: string | undefined): void;
158
+ applyLoadMergeSingle(values: PartialKeyDictionary<Schema, RequestLocales>): void;
159
+ patchKey(key: string, locale: string, template: string): void;
69
160
  }
70
161
 
71
- interface TranslationProviderMultiForLocale<Schema extends MultiDictionary, Params extends {
72
- [NS in keyof Schema]: {
73
- [K in keyof Schema[NS]]: unknown;
74
- };
75
- }, Locale extends string> {
76
- readonly locale: Locale;
77
- get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
162
+ /** Mutable translation engine for a single-namespace dictionary. */
163
+ interface I18nEngineSingle<Schema extends KeyDictionary, Params extends {
164
+ [K in keyof Schema]: unknown;
165
+ }, RequestLocales extends string = LocaleOfSingle<Schema>> {
166
+ readonly __i18nEngineMode: "single";
167
+ getAll(): Schema;
168
+ toScope(): I18nScopeSingle<Schema, Params, RequestLocales>;
169
+ toScope<Locale extends RequestLocales>(options: {
170
+ locale: Locale;
171
+ }): I18nScopeSingleForLocale<Schema, Params, Locale>;
78
172
  }
79
- interface TranslationProviderMulti<Schema extends MultiDictionary, Params extends {
80
- [NS in keyof Schema]: {
81
- [K in keyof Schema[NS]]: unknown;
82
- };
83
- }, RequestLocales extends string = LocaleOfMulti<Schema>> {
84
- get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, locale: RequestLocales, ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
85
- forLocale<Locale extends RequestLocales>(locale: Locale): TranslationProviderMultiForLocale<Schema, Params, Locale>;
173
+ /** Mutable translation engine for a multi-namespace dictionary. */
174
+ interface I18nEngineMulti<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>> {
175
+ readonly __i18nEngineMode: "multi";
86
176
  getAll(): Schema;
87
- hasNamespace<NS extends keyof Schema & string>(namespace: NS): boolean;
88
- setAll(values: Schema): void;
89
- mergeAll(values: Partial<Schema>): void;
90
- setNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;
91
- mergeNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;
177
+ toScope<NsList extends readonly (keyof Schema & string)[]>(options: {
178
+ namespaces: NsList;
179
+ }): I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales>;
180
+ toScope<NsList extends readonly (keyof Schema & string)[], Locale extends RequestLocales>(options: {
181
+ namespaces: NsList;
182
+ locale: Locale;
183
+ }): I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales, Locale>;
92
184
  }
93
- declare class IcuTranslationProviderMultiForLocale<Schema extends MultiDictionary, Params extends {
94
- [NS in keyof Schema]: {
95
- [K in keyof Schema[NS]]: unknown;
185
+ /** Alias for the default single-namespace engine implementation. */
186
+ type I18nEngineSingleImpl<Schema extends KeyDictionary, Params extends {
187
+ [K in keyof Schema]: unknown;
188
+ }, RequestLocales extends string = LocaleOfSingle<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> = IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>;
189
+ /** Alias for the default multi-namespace engine implementation. */
190
+ type I18nEngineMultiImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> = IcuTranslationProviderMulti<Schema, Params, RequestLocales, Fallback>;
191
+
192
+ /** Canonical lazy loader — no locale or delivery-area partition. */
193
+ type CanonicalLoader<T> = () => Promise<T> | T;
194
+ /** Split-by-locale or custom-area loader — partition key is locale or area name. */
195
+ type PartitionedLoader<T> = (partition: string) => Promise<T> | T;
196
+ type NamespaceLoader<T> = CanonicalLoader<T> | PartitionedLoader<T>;
197
+ declare function invokeNamespaceLoader<T>(loader: NamespaceLoader<T>, partition: string | undefined): Promise<T>;
198
+
199
+ type I18nBuilderMultiOptions<Schema extends MultiDictionary, RequestLocales extends string = LocaleOfMulti<Schema>> = {
200
+ namespaceLoaders?: {
201
+ [NS in keyof Schema & string]?: NamespaceLoader<PartialKeyDictionary<Schema[NS], RequestLocales> | Schema[NS]>;
96
202
  };
97
- }, RequestLocales extends string, Locale extends RequestLocales, Fallback extends LocaleFallbackMap$1 | undefined> implements TranslationProviderMultiForLocale<Schema, Params, Locale> {
98
- private readonly provider;
99
- readonly locale: Locale;
100
- constructor(provider: IcuTranslationProviderMulti<Schema, Params, RequestLocales, Fallback>, locale: Locale);
101
- get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, ...args: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
203
+ };
204
+ /** Non-empty namespace list — required before partition or load. */
205
+ type NonEmptyNamespaces<NS extends readonly string[]> = NS extends readonly [] ? never : NS;
206
+ type MultiBuilderState<Schema extends MultiDictionary, RequestLocales extends string = LocaleOfMulti<Schema>, NsList extends readonly (keyof Schema & string)[] = readonly (keyof Schema & string)[]> = {
207
+ namespaces: NsList;
208
+ locale?: RequestLocales;
209
+ deliveryArea?: string;
210
+ };
211
+ /** Builder returned by `createI18n({})` — only `withNamespaces` until namespaces are selected. */
212
+ interface I18nBuilderMultiInitial<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> {
213
+ withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
102
214
  }
103
- declare class IcuTranslationProviderMulti<Schema extends MultiDictionary, Params extends {
104
- [NS in keyof Schema]: {
105
- [K in keyof Schema[NS]]: unknown;
106
- };
107
- }, RequestLocales extends string = LocaleOfMulti<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements TranslationProviderMulti<Schema, Params, RequestLocales> {
108
- private dictionary;
109
- private compiledCache;
110
- private readonly localeFallback?;
111
- private readonly onMissing;
112
- private loadedNamespaces;
113
- constructor(dictionary: Partial<Schema>, options?: IcuTranslationProviderOptions<Fallback>);
114
- get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, locale: RequestLocales, ...args: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
115
- getWithLocale(namespace: string, key: string, locale: string, params?: Record<string, unknown>): string;
116
- forLocale<Locale extends RequestLocales>(locale: Locale): IcuTranslationProviderMultiForLocale<Schema, Params, RequestLocales, Locale, Fallback>;
117
- getAll(): Schema;
118
- hasNamespace<NS extends keyof Schema & string>(namespace: NS): boolean;
119
- setAll(values: Schema): void;
120
- mergeAll(values: Partial<Schema>): void;
121
- setNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;
122
- mergeNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;
215
+ /** Builder after `withNamespaces([...])` partition selection and `load()` are available. */
216
+ interface I18nBuilderMultiReady<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, NsList extends readonly (keyof Schema & string)[] = readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> {
217
+ withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
218
+ withLocale<Locale extends ActiveLocales>(locale: Locale): I18nBuilderMultiForLocale<Schema, Params, RequestLocales, ActiveLocales, NsList, Locale>;
219
+ withDeliveryArea<Area extends DeliveryArea>(area: Area): I18nBuilderMultiPartitioned<Schema, Params, RequestLocales, LocalesForDeliveryAreaOrAll<RequestLocales, DeliveryArea, DeliveryArtifacts, Area>, NsList, DeliveryArea, DeliveryArtifacts>;
220
+ load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
221
+ }
222
+ /** @deprecated Alias for {@link I18nBuilderMultiInitial} — the multi builder before `withNamespaces`. */
223
+ type I18nBuilderMulti<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, NsList extends readonly (keyof Schema & string)[] = readonly [], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> = [NsList] extends [readonly []] ? I18nBuilderMultiInitial<Schema, Params, RequestLocales, ActiveLocales, DeliveryArea, DeliveryArtifacts> : I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NsList, DeliveryArea, DeliveryArtifacts>;
224
+ /** Builder after `withDeliveryArea` — partition is fixed; bind locale via `scope.forLocale` after `load()`. */
225
+ interface I18nBuilderMultiPartitioned<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> {
226
+ withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiPartitioned<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
227
+ load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
228
+ }
229
+ interface I18nBuilderMultiForLocale<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], Locale extends ActiveLocales> {
230
+ load(): Promise<I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, Locale, Locale>>;
231
+ }
232
+ declare class I18nBuilderMultiInitialImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> implements I18nBuilderMultiInitial<Schema, Params, RequestLocales, ActiveLocales, DeliveryArea, DeliveryArtifacts> {
233
+ private readonly engine;
234
+ private readonly options?;
235
+ constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options?: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined);
236
+ withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReadyImpl<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
237
+ }
238
+ declare class I18nBuilderMultiReadyImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, NsList extends readonly (keyof Schema & string)[] = readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> implements I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NsList, DeliveryArea, DeliveryArtifacts> {
239
+ private readonly engine;
240
+ private readonly options;
241
+ private readonly state;
242
+ constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined, state: MultiBuilderState<Schema, RequestLocales, NsList>);
243
+ private clone;
244
+ withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReadyImpl<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
245
+ withLocale<Locale extends ActiveLocales>(locale: Locale): I18nBuilderMultiForLocaleImpl<Schema, Params, RequestLocales, ActiveLocales, NsList, Locale>;
246
+ withDeliveryArea<Area extends DeliveryArea>(area: Area): I18nBuilderMultiPartitionedImpl<Schema, Params, RequestLocales, LocalesForDeliveryAreaOrAll<RequestLocales, DeliveryArea, DeliveryArtifacts, Area>, NsList, DeliveryArea, DeliveryArtifacts>;
247
+ load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
123
248
  }
249
+ declare class I18nBuilderMultiPartitionedImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> implements I18nBuilderMultiPartitioned<Schema, Params, RequestLocales, ActiveLocales, NsList, DeliveryArea, DeliveryArtifacts> {
250
+ private readonly engine;
251
+ private readonly options;
252
+ private readonly state;
253
+ constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined, state: MultiBuilderState<Schema, RequestLocales, NsList> & {
254
+ deliveryArea: string;
255
+ });
256
+ withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiPartitionedImpl<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
257
+ load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
258
+ }
259
+ declare class I18nBuilderMultiForLocaleImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], Locale extends ActiveLocales> implements I18nBuilderMultiForLocale<Schema, Params, RequestLocales, ActiveLocales, NsList, Locale> {
260
+ private readonly engine;
261
+ private readonly options;
262
+ private readonly state;
263
+ constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined, state: MultiBuilderState<Schema, RequestLocales, NsList> & {
264
+ locale: Locale;
265
+ });
266
+ load(): Promise<I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, Locale, Locale>>;
267
+ }
268
+
269
+ type SingleScopeBound<Schema extends KeyDictionary, Params, Locale extends string> = I18nScopeSingleForLocale<Schema, Params & {
270
+ [K in keyof Schema]: unknown;
271
+ }, Locale>;
272
+ type I18nBuilderSingleOptions<Schema extends KeyDictionary, RequestLocales extends string = LocaleOfSingle<Schema>> = {
273
+ dictionaryLoader?: NamespaceLoader<PartialKeyDictionary<Schema, RequestLocales> | Schema>;
274
+ };
275
+ interface I18nBuilderSingle<Schema extends KeyDictionary, Params extends {
276
+ [K in keyof Schema]: unknown;
277
+ }, RequestLocales extends string = LocaleOfSingle<Schema>> {
278
+ withLocale<Locale extends RequestLocales>(locale: Locale): I18nBuilderSingleForLocaleImpl<Schema, Params, RequestLocales, Locale>;
279
+ withDeliveryArea<Area extends string>(area: Area): I18nBuilderSingle<Schema, Params, RequestLocales>;
280
+ load(): Promise<I18nScopeSingleImpl<Schema, Params, RequestLocales, LocaleFallbackMap$1 | undefined>>;
281
+ }
282
+ interface I18nBuilderSingleForLocale<Schema extends KeyDictionary, Params extends {
283
+ [K in keyof Schema]: unknown;
284
+ }, Locale extends string> {
285
+ load(): Promise<SingleScopeBound<Schema, Params, Locale>>;
286
+ }
287
+ type SingleBuilderState<Schema extends KeyDictionary, RequestLocales extends string = LocaleOfSingle<Schema>> = {
288
+ locale?: RequestLocales;
289
+ deliveryArea?: string;
290
+ };
291
+ declare class I18nBuilderSingleImpl<Schema extends KeyDictionary, Params extends {
292
+ [K in keyof Schema]: unknown;
293
+ }, RequestLocales extends string = LocaleOfSingle<Schema>> implements I18nBuilderSingle<Schema, Params, RequestLocales> {
294
+ private readonly engine;
295
+ private readonly options?;
296
+ private state;
297
+ constructor(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options?: I18nBuilderSingleOptions<Schema, RequestLocales> | undefined, state?: SingleBuilderState<Schema, RequestLocales>);
298
+ private clone;
299
+ withLocale<Locale extends RequestLocales>(locale: Locale): I18nBuilderSingleForLocaleImpl<Schema, Params, RequestLocales, Locale>;
300
+ withDeliveryArea<Area extends string>(_area: Area): I18nBuilderSingle<Schema, Params, RequestLocales>;
301
+ load(): Promise<I18nScopeSingleImpl<Schema, Params, RequestLocales, LocaleFallbackMap$1 | undefined>>;
302
+ }
303
+ declare class I18nBuilderSingleForLocaleImpl<Schema extends KeyDictionary, Params extends {
304
+ [K in keyof Schema]: unknown;
305
+ }, RequestLocales extends string = LocaleOfSingle<Schema>, Locale extends RequestLocales = RequestLocales> implements I18nBuilderSingleForLocale<Schema, Params, Locale> {
306
+ private readonly engine;
307
+ private readonly options;
308
+ private readonly state;
309
+ constructor(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options: I18nBuilderSingleOptions<Schema, RequestLocales> | undefined, state: SingleBuilderState<Schema, RequestLocales> & {
310
+ locale: Locale;
311
+ });
312
+ load(): Promise<SingleScopeBound<Schema, Params, Locale>>;
313
+ }
314
+
315
+ declare function createI18nSingleBuilder<Schema extends KeyDictionary, Params extends {
316
+ [K in keyof Schema]: unknown;
317
+ }, RequestLocales extends string = LocaleOfSingle<Schema>>(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options?: I18nBuilderSingleOptions<Schema, RequestLocales>): I18nBuilderSingleImpl<Schema, Params, RequestLocales>;
318
+ declare function createI18nMultiBuilder<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>>(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options?: I18nBuilderMultiOptions<Schema, RequestLocales>): I18nBuilderMultiInitialImpl<Schema, Params, RequestLocales, RequestLocales, DeliveryArea, DeliveryArtifacts>;
319
+ declare function createI18nBuilder<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>>(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options?: I18nBuilderMultiOptions<Schema, RequestLocales>): I18nBuilderMultiInitialImpl<Schema, Params, RequestLocales, RequestLocales, never, DeliveryArtifactsMap<RequestLocales, never>>;
320
+ declare function createI18nBuilder<Schema extends KeyDictionary, Params extends {
321
+ [K in keyof Schema]: unknown;
322
+ }, RequestLocales extends string = LocaleOfSingle<Schema>>(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options?: I18nBuilderSingleOptions<Schema, RequestLocales>): I18nBuilderSingleImpl<Schema, Params, RequestLocales>;
124
323
 
125
324
  type LocaleFallbackMap = Record<string, string | null>;
126
325
  interface ResolvedLocaleTemplate {
@@ -157,11 +356,11 @@ declare function projectDictionaryLocalesCore<T extends MultiDictionary>(diction
157
356
  * Merges locale entries per translation key without dropping keys or locales
158
357
  * already present in `existing`. Incoming locales overwrite the same locale on conflict.
159
358
  */
160
- declare function mergeNamespaceLocalesCore<T extends KeyDictionary>(existing: T, incoming: T): T;
359
+ declare function mergeNamespaceLocalesCore<T extends KeyDictionary, Locales extends string = LocaleOfSingle<T>>(existing: T, incoming: PartialKeyDictionary<T, Locales>): T;
161
360
  /**
162
361
  * Merges locale entries per key in every namespace present in `incoming`.
163
362
  * Namespaces and keys not in `incoming` are preserved from `existing`.
164
363
  */
165
- declare function mergeDictionaryLocalesCore<T extends MultiDictionary>(existing: T, incoming: Partial<T>): T;
364
+ declare function mergeDictionaryLocalesCore<T extends MultiDictionary, Locales extends string = LocaleOfMulti<T>>(existing: T, incoming: PartialMultiDictionary<T, Locales>): T;
166
365
 
167
- export { IcuTranslationProviderMulti, type IcuTranslationProviderOptions, IcuTranslationProviderSingle, type KeyDictionary, type LocaleDictionary, type LocaleFallbackMap$1 as LocaleFallbackMap, type LocaleOfMulti, type LocaleOfSingle, type MissingTranslationContext, type MultiDictionary, type OnMissingTranslation, type ResolvedLocaleTemplate, type TranslationProviderMulti, type TranslationProviderMultiForLocale, type TranslationProviderSingle, type TranslationProviderSingleForLocale, formatLocaleFallbackChain, mergeDictionaryLocalesCore, mergeNamespaceLocalesCore, projectDictionaryForDeliveryAreaCore, projectDictionaryLocalesCore, projectNamespaceForDeliveryAreaCore, projectNamespaceLocalesCore, resolveLocaleTemplate, validateLocaleFallback };
366
+ export { type CanonicalLoader, type DeliveryArtifactsMap, type I18nBuilderMulti, type I18nBuilderMultiForLocale, type I18nBuilderMultiInitial, type I18nBuilderMultiOptions, type I18nBuilderMultiPartitioned, type I18nBuilderMultiReady, type I18nBuilderSingle, type I18nBuilderSingleForLocale, type I18nBuilderSingleOptions, type I18nEngineMulti, type I18nEngineMultiImpl, type I18nEngineSingle, type I18nEngineSingleImpl, type I18nScopeMulti, type I18nScopeMultiForLocale, type I18nScopeSingle, type I18nScopeSingleForLocale, IcuTranslationProviderMulti, type IcuTranslationProviderOptions, IcuTranslationProviderSingle, type KeyDictionary, type LocaleDictionary, type LocaleFallbackMap$1 as LocaleFallbackMap, type LocaleOfMulti, type LocaleOfSingle, type LocalesForDeliveryArea, type LocalesForDeliveryAreaOrAll, type MissingTranslationContext, type MultiDictionary, type MultiParams, type NamespaceLoader, type OnMissingTranslation, type ParamsForNamespaces, type PartialKeyDictionary, type PartialMultiDictionary, type PartitionedLoader, type ResolvedLocaleTemplate, type SchemaForNamespaces, type SingleParams, createI18nBuilder, createI18nMultiBuilder, createI18nSingleBuilder, formatLocaleFallbackChain, invokeNamespaceLoader, mergeDictionaryLocalesCore, mergeNamespaceLocalesCore, projectDictionaryForDeliveryAreaCore, projectDictionaryLocalesCore, projectNamespaceForDeliveryAreaCore, projectNamespaceLocalesCore, resolveLocaleTemplate, validateLocaleFallback };