@flyingrobots/bijou-i18n 5.0.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/localization.d.ts +79 -0
- package/dist/localization.d.ts.map +1 -0
- package/dist/localization.js +159 -0
- package/dist/localization.js.map +1 -0
- package/dist/runtime.d.ts +13 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +239 -48
- package/dist/runtime.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -10,7 +10,13 @@ The in-memory localization runtime for Bijou.
|
|
|
10
10
|
- generic resource lookup
|
|
11
11
|
- runtime-safe references
|
|
12
12
|
- locale-aware formatting seams
|
|
13
|
+
- explicit fallback catalogs
|
|
14
|
+
- injectable missing-localization message formatting
|
|
13
15
|
- async locale loader support for runtime-integrated catalog activation
|
|
16
|
+
- an application-facing `LocalizationPort` that resolves structured localized
|
|
17
|
+
objects
|
|
18
|
+
- `isJsonShapedLocalizedValue()` for adapter-side resource/data payload
|
|
19
|
+
conformance checks
|
|
14
20
|
|
|
15
21
|
This package is intentionally runtime-only. Spreadsheet workflows, stale detection, pseudo-localization, and catalog compilation belong in `@flyingrobots/bijou-i18n-tools`.
|
|
16
22
|
|
|
@@ -34,6 +40,35 @@ const runtime = await createI18nRuntimeAsync({
|
|
|
34
40
|
});
|
|
35
41
|
```
|
|
36
42
|
|
|
43
|
+
When runtime payloads are generated as pure per-locale catalogs, load the source
|
|
44
|
+
or fallback catalog separately:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { createI18nRuntime } from '@flyingrobots/bijou-i18n';
|
|
48
|
+
|
|
49
|
+
const runtime = createI18nRuntime({
|
|
50
|
+
locale: 'fr',
|
|
51
|
+
direction: 'ltr',
|
|
52
|
+
fallbackLocale: 'en',
|
|
53
|
+
fallbackCatalogs: [englishCatalog],
|
|
54
|
+
catalogs: [frenchCatalog],
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Production apps can use fallback catalogs for readable missing translations.
|
|
59
|
+
Development apps can inject `missingMessage` to render a loud marker instead of
|
|
60
|
+
quietly falling back when the selected locale is missing a string:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
const runtime = createI18nRuntime({
|
|
64
|
+
locale: 'fr',
|
|
65
|
+
direction: 'ltr',
|
|
66
|
+
fallbackLocale: 'en',
|
|
67
|
+
fallbackCatalogs: [englishCatalog],
|
|
68
|
+
missingMessage: ({ key }) => `<MISSING LOC STRING KEY=${key.namespace}:${key.id}>`,
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
37
72
|
The same loader seam also supports file-backed locale bundles through
|
|
38
73
|
`@flyingrobots/bijou-i18n-tools-node`:
|
|
39
74
|
|
|
@@ -57,6 +92,106 @@ await runtime.preloadLocale('de');
|
|
|
57
92
|
await runtime.setLocale('de');
|
|
58
93
|
```
|
|
59
94
|
|
|
95
|
+
## Localization Port
|
|
96
|
+
|
|
97
|
+
Use `LocalizationPort` at application and view boundaries when callers need a
|
|
98
|
+
localized object instead of a concrete runtime:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import {
|
|
102
|
+
createI18nRuntime,
|
|
103
|
+
createRuntimeLocalizationPort,
|
|
104
|
+
} from '@flyingrobots/bijou-i18n';
|
|
105
|
+
|
|
106
|
+
const runtime = createI18nRuntime({
|
|
107
|
+
locale: 'fr',
|
|
108
|
+
direction: 'ltr',
|
|
109
|
+
fallbackLocale: 'en',
|
|
110
|
+
fallbackCatalogs: [englishCatalog],
|
|
111
|
+
catalogs: [frenchCatalog],
|
|
112
|
+
});
|
|
113
|
+
const localization = createRuntimeLocalizationPort(runtime);
|
|
114
|
+
|
|
115
|
+
const title = localization.resolve<string>({
|
|
116
|
+
key: { namespace: 'app', id: 'title' },
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`resolve()` returns a frozen localized object with the key, locale, direction,
|
|
121
|
+
entry kind, translated/fallback/missing status, value, issues, and facts. That
|
|
122
|
+
keeps rendering code away from catalog loading, filesystem paths, CSV data, and
|
|
123
|
+
runtime mutation details while preserving enough state for tooling and lower
|
|
124
|
+
modes.
|
|
125
|
+
|
|
126
|
+
## Resource And Data Payloads
|
|
127
|
+
|
|
128
|
+
Message entries resolve to strings. `resource` and `data` entries resolve to
|
|
129
|
+
portable structured values, and the runtime freezes those values before handing
|
|
130
|
+
them to callers.
|
|
131
|
+
|
|
132
|
+
Keep resource/data payloads JSON-shaped:
|
|
133
|
+
|
|
134
|
+
- strings, numbers, booleans, null, and undefined
|
|
135
|
+
- arrays with indexed entries only
|
|
136
|
+
- plain objects with enumerable data properties only
|
|
137
|
+
|
|
138
|
+
Do not use:
|
|
139
|
+
|
|
140
|
+
- class instances or built-ins such as `Date`
|
|
141
|
+
- symbol-keyed properties
|
|
142
|
+
- non-enumerable properties
|
|
143
|
+
- accessor properties
|
|
144
|
+
- cyclic object graphs
|
|
145
|
+
- functions, symbols, or bigint values
|
|
146
|
+
|
|
147
|
+
Unsupported shapes are rejected at the localization boundary rather than being
|
|
148
|
+
silently normalized. This keeps generated catalogs, runtime loader adapters, and
|
|
149
|
+
view code honest: adapters must produce portable data, and consumers can trust
|
|
150
|
+
that localized resource/data values are immutable snapshots rather than mutable
|
|
151
|
+
runtime handles.
|
|
152
|
+
|
|
153
|
+
Adapters can check payloads before building catalogs:
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
import { isJsonShapedLocalizedValue } from '@flyingrobots/bijou-i18n';
|
|
157
|
+
|
|
158
|
+
if (!isJsonShapedLocalizedValue(payload)) {
|
|
159
|
+
throw new Error('i18n resource/data payload must be JSON-shaped');
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Valid resource/data payloads are dense, plain data:
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
const validResource = {
|
|
167
|
+
label: 'Counter',
|
|
168
|
+
range: { min: 0, max: 10 },
|
|
169
|
+
marks: ['empty', 'half', 'full'],
|
|
170
|
+
};
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Invalid payloads are rejected instead of being silently normalized:
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
class CounterResource {
|
|
177
|
+
readonly label = 'Counter';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const sparse = new Array<string>(2);
|
|
181
|
+
sparse[1] = 'full';
|
|
182
|
+
|
|
183
|
+
const accessor = Object.defineProperty({}, 'label', {
|
|
184
|
+
enumerable: true,
|
|
185
|
+
get() {
|
|
186
|
+
return 'Counter';
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
isJsonShapedLocalizedValue(new CounterResource()); // false
|
|
191
|
+
isJsonShapedLocalizedValue(sparse); // false
|
|
192
|
+
isJsonShapedLocalizedValue(accessor); // false
|
|
193
|
+
```
|
|
194
|
+
|
|
60
195
|
## Documentation
|
|
61
196
|
|
|
62
197
|
See the [Bijou repo](https://github.com/flyingrobots/bijou) for the full documentation map, architecture guide, and design system.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { createI18nRuntimeAsync, createI18nRuntime, ref, type I18nCatalogLoader, type I18nCatalog, type I18nCatalogEntry, type I18nCatalogKey, type I18nDirection, type I18nEntryKind, type I18nFormatterPort, type I18nReference, type I18nRuntime, type I18nRuntimeOptions, } from './runtime.js';
|
|
1
|
+
export { createI18nRuntimeAsync, createI18nRuntime, ref, type I18nCatalogLoader, type I18nCatalog, type I18nCatalogEntry, type I18nCatalogKey, type I18nDirection, type I18nEntryKind, type I18nFormatterPort, type I18nMissingMessageContext, type I18nMissingMessageFormatter, type I18nMissingReason, type I18nReference, type I18nRuntime, type I18nRuntimeOptions, } from './runtime.js';
|
|
2
|
+
export { createRuntimeLocalizationPort, freezeLocalizedObject, freezeLocalizedValue, isJsonShapedLocalizedValue, type LocalizedObject, type LocalizationFact, type LocalizationFactKind, type LocalizationIssue, type LocalizationIssueCode, type LocalizationPort, type LocalizationRequest, type LocalizationStatus, type RuntimeLocalizationPortSource, } from './localization.js';
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,EACH,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,EACH,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,GACnC,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,GAcJ,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,GAU3B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { I18nCatalogKey, I18nDirection, I18nEntryKind } from './runtime.js';
|
|
2
|
+
export type LocalizationStatus = 'translated' | 'fallback' | 'missing';
|
|
3
|
+
export interface LocalizationRequest {
|
|
4
|
+
readonly key: I18nCatalogKey;
|
|
5
|
+
readonly kind?: I18nEntryKind;
|
|
6
|
+
readonly values?: Readonly<Record<string, unknown>>;
|
|
7
|
+
}
|
|
8
|
+
export type LocalizationIssueCode = 'missing-key' | 'missing-locale' | 'kind-mismatch' | 'invalid-message-value';
|
|
9
|
+
export interface LocalizationIssue {
|
|
10
|
+
readonly code: LocalizationIssueCode;
|
|
11
|
+
readonly key: I18nCatalogKey;
|
|
12
|
+
readonly locale: string;
|
|
13
|
+
readonly fallbackLocale: string;
|
|
14
|
+
readonly message: string;
|
|
15
|
+
}
|
|
16
|
+
export type LocalizationFactKind = 'locale' | 'direction' | 'localization-status' | 'entry-kind';
|
|
17
|
+
export interface LocalizationFact {
|
|
18
|
+
readonly kind: LocalizationFactKind;
|
|
19
|
+
readonly key: string;
|
|
20
|
+
readonly value: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Structured localization result returned by a {@link LocalizationPort}.
|
|
24
|
+
*
|
|
25
|
+
* Values are expected to be JSON-shaped boundary payloads: plain objects,
|
|
26
|
+
* arrays, scalars, or nullish values. Symbol-keyed properties, non-enumerable
|
|
27
|
+
* properties, cyclic graphs, class instances, and accessors are outside the
|
|
28
|
+
* portable catalog contract; accessors are rejected when plain objects cross
|
|
29
|
+
* the freeze boundary.
|
|
30
|
+
*/
|
|
31
|
+
export interface LocalizedObject<Value = unknown> {
|
|
32
|
+
readonly key: I18nCatalogKey;
|
|
33
|
+
readonly locale: string;
|
|
34
|
+
readonly fallbackLocale: string;
|
|
35
|
+
readonly sourceLocale?: string;
|
|
36
|
+
readonly direction: I18nDirection;
|
|
37
|
+
readonly kind: I18nEntryKind;
|
|
38
|
+
readonly status: LocalizationStatus;
|
|
39
|
+
readonly value?: Value;
|
|
40
|
+
readonly issues: readonly LocalizationIssue[];
|
|
41
|
+
readonly facts: readonly LocalizationFact[];
|
|
42
|
+
}
|
|
43
|
+
export interface LocalizationPort {
|
|
44
|
+
readonly locale: string;
|
|
45
|
+
readonly direction: I18nDirection;
|
|
46
|
+
resolve<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
|
|
47
|
+
formatNumber(value: number): string;
|
|
48
|
+
formatDate(value: Date): string;
|
|
49
|
+
formatTime(value: Date): string;
|
|
50
|
+
formatList(values: readonly string[]): string;
|
|
51
|
+
}
|
|
52
|
+
export interface RuntimeLocalizationPortSource {
|
|
53
|
+
readonly locale: string;
|
|
54
|
+
readonly direction: I18nDirection;
|
|
55
|
+
localize<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
|
|
56
|
+
formatNumber(value: number, locale: string): string;
|
|
57
|
+
formatDate(value: Date, locale: string): string;
|
|
58
|
+
formatTime(value: Date, locale: string): string;
|
|
59
|
+
formatList(values: readonly string[], locale: string): string;
|
|
60
|
+
}
|
|
61
|
+
export declare function createRuntimeLocalizationPort(runtime: RuntimeLocalizationPortSource): LocalizationPort;
|
|
62
|
+
export declare function freezeLocalizedObject<Value>(object: LocalizedObject<Value>): LocalizedObject<Value>;
|
|
63
|
+
/**
|
|
64
|
+
* Deep-freeze a JSON-shaped localized value.
|
|
65
|
+
*
|
|
66
|
+
* This helper intentionally preserves the portable catalog contract rather
|
|
67
|
+
* than arbitrary JavaScript object identity. Plain objects must expose data
|
|
68
|
+
* properties only; accessor-backed plain objects are rejected.
|
|
69
|
+
*/
|
|
70
|
+
export declare function freezeLocalizedValue<Value>(value: Value): Value;
|
|
71
|
+
/**
|
|
72
|
+
* Check whether a value can cross the localization resource/data boundary.
|
|
73
|
+
*
|
|
74
|
+
* This performs the same validation as {@link freezeLocalizedValue} without
|
|
75
|
+
* exposing the frozen clone. Adapter code can use it to reject non-portable
|
|
76
|
+
* payloads before constructing catalogs.
|
|
77
|
+
*/
|
|
78
|
+
export declare function isJsonShapedLocalizedValue(value: unknown): boolean;
|
|
79
|
+
//# sourceMappingURL=localization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localization.d.ts","sourceRoot":"","sources":["../src/localization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
export function createRuntimeLocalizationPort(runtime) {
|
|
2
|
+
return Object.freeze({
|
|
3
|
+
get locale() {
|
|
4
|
+
return runtime.locale;
|
|
5
|
+
},
|
|
6
|
+
get direction() {
|
|
7
|
+
return runtime.direction;
|
|
8
|
+
},
|
|
9
|
+
resolve(request) {
|
|
10
|
+
return runtime.localize(request);
|
|
11
|
+
},
|
|
12
|
+
formatNumber(value) {
|
|
13
|
+
return runtime.formatNumber(value, runtime.locale);
|
|
14
|
+
},
|
|
15
|
+
formatDate(value) {
|
|
16
|
+
return runtime.formatDate(value, runtime.locale);
|
|
17
|
+
},
|
|
18
|
+
formatTime(value) {
|
|
19
|
+
return runtime.formatTime(value, runtime.locale);
|
|
20
|
+
},
|
|
21
|
+
formatList(values) {
|
|
22
|
+
return runtime.formatList(values, runtime.locale);
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function freezeLocalizedObject(object) {
|
|
27
|
+
return Object.freeze({
|
|
28
|
+
...object,
|
|
29
|
+
key: Object.freeze({ ...object.key }),
|
|
30
|
+
value: freezeLocalizedValue(object.value),
|
|
31
|
+
issues: Object.freeze(object.issues.map((issue) => Object.freeze({
|
|
32
|
+
...issue,
|
|
33
|
+
key: Object.freeze({ ...issue.key }),
|
|
34
|
+
}))),
|
|
35
|
+
facts: Object.freeze(object.facts.map((fact) => Object.freeze({ ...fact }))),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Deep-freeze a JSON-shaped localized value.
|
|
40
|
+
*
|
|
41
|
+
* This helper intentionally preserves the portable catalog contract rather
|
|
42
|
+
* than arbitrary JavaScript object identity. Plain objects must expose data
|
|
43
|
+
* properties only; accessor-backed plain objects are rejected.
|
|
44
|
+
*/
|
|
45
|
+
export function freezeLocalizedValue(value) {
|
|
46
|
+
return cloneLocalizedValue(value, 'value', new WeakSet());
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check whether a value can cross the localization resource/data boundary.
|
|
50
|
+
*
|
|
51
|
+
* This performs the same validation as {@link freezeLocalizedValue} without
|
|
52
|
+
* exposing the frozen clone. Adapter code can use it to reject non-portable
|
|
53
|
+
* payloads before constructing catalogs.
|
|
54
|
+
*/
|
|
55
|
+
export function isJsonShapedLocalizedValue(value) {
|
|
56
|
+
try {
|
|
57
|
+
freezeLocalizedValue(value);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function cloneLocalizedValue(value, path, seen) {
|
|
65
|
+
if (value == null || typeof value !== 'object') {
|
|
66
|
+
if (typeof value === 'bigint' || typeof value === 'symbol' || typeof value === 'function') {
|
|
67
|
+
throw new Error(`Localized value contains unsupported ${typeof value} at ${path}`);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
const objectValue = value;
|
|
72
|
+
if (seen.has(objectValue)) {
|
|
73
|
+
throw new Error(`Localized value contains circular reference at ${path}`);
|
|
74
|
+
}
|
|
75
|
+
seen.add(objectValue);
|
|
76
|
+
try {
|
|
77
|
+
return cloneLocalizedObjectValue(value, path, seen);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
seen.delete(objectValue);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function cloneLocalizedObjectValue(value, path, seen) {
|
|
84
|
+
if (Array.isArray(value)) {
|
|
85
|
+
validateLocalizedArray(value, path);
|
|
86
|
+
return Object.freeze(value.map((item, index) => cloneLocalizedValue(item, `${path}[${index}]`, seen)));
|
|
87
|
+
}
|
|
88
|
+
const prototype = Object.getPrototypeOf(value);
|
|
89
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
90
|
+
throw new Error(`Localized value contains unsupported ${objectKind(value)} at ${path}`);
|
|
91
|
+
}
|
|
92
|
+
const output = {};
|
|
93
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
94
|
+
for (const key of Reflect.ownKeys(descriptors)) {
|
|
95
|
+
if (typeof key === 'symbol') {
|
|
96
|
+
throw new Error(`Localized value contains unsupported symbol property at ${path}`);
|
|
97
|
+
}
|
|
98
|
+
const descriptor = descriptors[key];
|
|
99
|
+
if (descriptor === undefined) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const propertyPath = `${path}.${key}`;
|
|
103
|
+
if (!descriptor.enumerable) {
|
|
104
|
+
throw new Error(`Localized value contains unsupported non-enumerable property: ${propertyPath}`);
|
|
105
|
+
}
|
|
106
|
+
if (!('value' in descriptor)) {
|
|
107
|
+
throw new Error(`Localized value contains unsupported accessor property: ${propertyPath}`);
|
|
108
|
+
}
|
|
109
|
+
output[key] = cloneLocalizedValue(descriptor.value, propertyPath, seen);
|
|
110
|
+
}
|
|
111
|
+
return Object.freeze(output);
|
|
112
|
+
}
|
|
113
|
+
function validateLocalizedArray(value, path) {
|
|
114
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
115
|
+
let indexedPropertyCount = 0;
|
|
116
|
+
for (const key of Reflect.ownKeys(descriptors)) {
|
|
117
|
+
if (typeof key === 'symbol') {
|
|
118
|
+
throw new Error(`Localized value contains unsupported symbol property at ${path}`);
|
|
119
|
+
}
|
|
120
|
+
if (key === 'length') {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const descriptor = descriptors[key];
|
|
124
|
+
if (descriptor === undefined) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const propertyPath = arrayPropertyPath(path, key);
|
|
128
|
+
if (!descriptor.enumerable) {
|
|
129
|
+
throw new Error(`Localized value contains unsupported non-enumerable property: ${propertyPath}`);
|
|
130
|
+
}
|
|
131
|
+
if (!('value' in descriptor)) {
|
|
132
|
+
throw new Error(`Localized value contains unsupported accessor property: ${propertyPath}`);
|
|
133
|
+
}
|
|
134
|
+
if (!isArrayIndexKey(key)) {
|
|
135
|
+
throw new Error(`Localized value contains unsupported array property: ${propertyPath}`);
|
|
136
|
+
}
|
|
137
|
+
indexedPropertyCount += 1;
|
|
138
|
+
}
|
|
139
|
+
if (indexedPropertyCount !== value.length) {
|
|
140
|
+
throw new Error(`Localized value contains unsupported sparse array at ${path}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function arrayPropertyPath(path, key) {
|
|
144
|
+
return isArrayIndexKey(key) ? `${path}[${key}]` : `${path}.${key}`;
|
|
145
|
+
}
|
|
146
|
+
function isArrayIndexKey(key) {
|
|
147
|
+
if (key === '') {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const index = Number(key);
|
|
151
|
+
return Number.isInteger(index)
|
|
152
|
+
&& index >= 0
|
|
153
|
+
&& index < 2 ** 32 - 1
|
|
154
|
+
&& String(index) === key;
|
|
155
|
+
}
|
|
156
|
+
function objectKind(value) {
|
|
157
|
+
return Object.prototype.toString.call(value).slice(8, -1);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=localization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localization.js","sourceRoot":"","sources":["../src/localization.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type LocalizedObject, type LocalizationRequest } from './localization.js';
|
|
1
2
|
export type I18nDirection = 'ltr' | 'rtl' | 'auto';
|
|
2
3
|
export interface I18nCatalogKey {
|
|
3
4
|
readonly namespace: string;
|
|
@@ -25,13 +26,24 @@ export interface I18nFormatterPort {
|
|
|
25
26
|
formatList(values: readonly string[], locale: string): string;
|
|
26
27
|
}
|
|
27
28
|
export type I18nCatalogLoader = (locale: string) => Promise<readonly I18nCatalog[]>;
|
|
29
|
+
export type I18nMissingReason = 'missing-key' | 'missing-locale';
|
|
30
|
+
export interface I18nMissingMessageContext {
|
|
31
|
+
readonly key: I18nCatalogKey;
|
|
32
|
+
readonly locale: string;
|
|
33
|
+
readonly fallbackLocale: string;
|
|
34
|
+
readonly sourceLocale?: string;
|
|
35
|
+
readonly reason: I18nMissingReason;
|
|
36
|
+
}
|
|
37
|
+
export type I18nMissingMessageFormatter = (context: I18nMissingMessageContext) => string;
|
|
28
38
|
export interface I18nRuntimeOptions {
|
|
29
39
|
readonly locale: string;
|
|
30
40
|
readonly direction: I18nDirection;
|
|
31
41
|
readonly fallbackLocale?: string;
|
|
32
42
|
readonly formatter?: Partial<I18nFormatterPort>;
|
|
43
|
+
readonly fallbackCatalogs?: readonly I18nCatalog[];
|
|
33
44
|
readonly catalogs?: readonly I18nCatalog[];
|
|
34
45
|
readonly loader?: I18nCatalogLoader;
|
|
46
|
+
readonly missingMessage?: I18nMissingMessageFormatter;
|
|
35
47
|
}
|
|
36
48
|
export interface I18nRuntime extends I18nFormatterPort {
|
|
37
49
|
readonly locale: string;
|
|
@@ -41,6 +53,7 @@ export interface I18nRuntime extends I18nFormatterPort {
|
|
|
41
53
|
unloadCatalog(namespace: string): void;
|
|
42
54
|
preloadLocale(locale: string): Promise<void>;
|
|
43
55
|
setLocale(locale: string, direction?: I18nDirection): Promise<void>;
|
|
56
|
+
localize<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
|
|
44
57
|
t(key: I18nCatalogKey, values?: Readonly<Record<string, unknown>>): string;
|
|
45
58
|
resource<T = unknown>(key: I18nCatalogKey): T | undefined;
|
|
46
59
|
}
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/D;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;AAEpF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { freezeLocalizedObject, freezeLocalizedValue, } from './localization.js';
|
|
1
2
|
const DEFAULT_FORMATTER = {
|
|
2
3
|
formatNumber(value, locale) {
|
|
3
4
|
return new Intl.NumberFormat(locale).format(value);
|
|
@@ -33,7 +34,7 @@ export function ref(key) {
|
|
|
33
34
|
}
|
|
34
35
|
export function createI18nRuntime(options) {
|
|
35
36
|
const entries = new Map();
|
|
36
|
-
const
|
|
37
|
+
const fallbackCatalogs = new Map();
|
|
37
38
|
const manualCatalogs = new Map();
|
|
38
39
|
const loaderCatalogs = new Map();
|
|
39
40
|
const loaderCache = new Map();
|
|
@@ -44,33 +45,63 @@ export function createI18nRuntime(options) {
|
|
|
44
45
|
function rememberCatalog(target, catalog) {
|
|
45
46
|
target.set(catalog.namespace, catalog);
|
|
46
47
|
}
|
|
47
|
-
function
|
|
48
|
+
function applyCatalogsTo(targetEntries, source) {
|
|
48
49
|
for (const catalog of source.values()) {
|
|
49
|
-
const scoped = [];
|
|
50
50
|
for (const entry of catalog.entries) {
|
|
51
51
|
const key = keyToString(entry.key);
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
const existing = targetEntries.get(key);
|
|
53
|
+
targetEntries.set(key, existing === undefined ? entry : mergeCatalogEntry(existing, entry));
|
|
54
54
|
}
|
|
55
|
-
namespaces.set(catalog.namespace, scoped);
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
function buildCatalogState(stagedLoaderCatalogs = loaderCatalogs) {
|
|
58
|
+
const nextEntries = new Map();
|
|
59
|
+
applyCatalogsTo(nextEntries, fallbackCatalogs);
|
|
60
|
+
applyCatalogsTo(nextEntries, manualCatalogs);
|
|
61
|
+
applyCatalogsTo(nextEntries, stagedLoaderCatalogs);
|
|
62
|
+
return nextEntries;
|
|
63
63
|
}
|
|
64
|
-
function
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
function commitCatalogState(nextEntries) {
|
|
65
|
+
entries.clear();
|
|
66
|
+
for (const [key, entry] of nextEntries) {
|
|
67
|
+
entries.set(key, entry);
|
|
68
68
|
}
|
|
69
|
-
return entry;
|
|
70
69
|
}
|
|
71
|
-
function
|
|
70
|
+
function rebuildCatalogState() {
|
|
71
|
+
commitCatalogState(buildCatalogState());
|
|
72
|
+
}
|
|
73
|
+
function localizationIssue(code, key, message) {
|
|
74
|
+
return {
|
|
75
|
+
code,
|
|
76
|
+
key,
|
|
77
|
+
locale: currentLocale,
|
|
78
|
+
fallbackLocale,
|
|
79
|
+
message,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function resolveLocalizedValueResult(entry, seen, options = {}) {
|
|
83
|
+
const localized = entry.values[currentLocale];
|
|
84
|
+
if (localized !== undefined) {
|
|
85
|
+
return resolveCandidateResult(localized, seen, options, 'translated');
|
|
86
|
+
}
|
|
87
|
+
if (options.missingMessage !== undefined
|
|
88
|
+
&& currentLocale !== entry.sourceLocale
|
|
89
|
+
&& currentLocale !== fallbackLocale) {
|
|
90
|
+
return {
|
|
91
|
+
status: 'missing',
|
|
92
|
+
value: options.missingMessage({
|
|
93
|
+
key: entry.key,
|
|
94
|
+
locale: currentLocale,
|
|
95
|
+
fallbackLocale,
|
|
96
|
+
sourceLocale: entry.sourceLocale,
|
|
97
|
+
reason: 'missing-locale',
|
|
98
|
+
}),
|
|
99
|
+
issues: [
|
|
100
|
+
localizationIssue('missing-locale', entry.key, `Missing selected-locale value for ${keyToString(entry.key)}`),
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
72
104
|
const candidates = [
|
|
73
|
-
entry.values[currentLocale],
|
|
74
105
|
entry.values[entry.sourceLocale],
|
|
75
106
|
entry.values[fallbackLocale],
|
|
76
107
|
entry.fallbackValue,
|
|
@@ -79,43 +110,80 @@ export function createI18nRuntime(options) {
|
|
|
79
110
|
if (candidate === undefined) {
|
|
80
111
|
continue;
|
|
81
112
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
113
|
+
return resolveCandidateResult(candidate, seen, options, 'fallback');
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
status: 'missing',
|
|
117
|
+
issues: [
|
|
118
|
+
localizationIssue('missing-locale', entry.key, `Missing localized value for ${keyToString(entry.key)}`),
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function resolveLocalizedValue(entry, seen, options = {}) {
|
|
123
|
+
return resolveLocalizedValueResult(entry, seen, options).value;
|
|
124
|
+
}
|
|
125
|
+
function mergeResolutionStatus(candidateStatus, referencedStatus) {
|
|
126
|
+
if (candidateStatus === 'missing' || referencedStatus === 'missing') {
|
|
127
|
+
return 'missing';
|
|
128
|
+
}
|
|
129
|
+
if (candidateStatus === 'fallback' || referencedStatus === 'fallback') {
|
|
130
|
+
return 'fallback';
|
|
131
|
+
}
|
|
132
|
+
return 'translated';
|
|
133
|
+
}
|
|
134
|
+
function resolveCandidateResult(candidate, seen, options = {}, candidateStatus) {
|
|
135
|
+
if (isReference(candidate)) {
|
|
136
|
+
const refKey = keyToString(candidate.$ref);
|
|
137
|
+
if (seen.has(refKey)) {
|
|
138
|
+
throw new Error(`Cyclic i18n reference: ${refKey}`);
|
|
139
|
+
}
|
|
140
|
+
seen.add(refKey);
|
|
141
|
+
const referencedEntry = entries.get(refKey);
|
|
142
|
+
if (referencedEntry === undefined) {
|
|
97
143
|
throw new Error(`Missing i18n reference: ${refKey}`);
|
|
98
144
|
}
|
|
99
|
-
|
|
145
|
+
const resolved = resolveLocalizedValueResult(referencedEntry, seen, options);
|
|
146
|
+
seen.delete(refKey);
|
|
147
|
+
if (resolved.value !== undefined) {
|
|
148
|
+
return {
|
|
149
|
+
status: mergeResolutionStatus(candidateStatus, resolved.status),
|
|
150
|
+
value: resolved.value,
|
|
151
|
+
issues: resolved.issues,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
throw new Error(`Missing i18n reference: ${refKey}`);
|
|
100
155
|
}
|
|
101
|
-
return
|
|
156
|
+
return {
|
|
157
|
+
status: candidateStatus,
|
|
158
|
+
value: candidate,
|
|
159
|
+
issues: [],
|
|
160
|
+
};
|
|
102
161
|
}
|
|
103
162
|
async function preloadLocale(locale) {
|
|
104
163
|
if (options.loader === undefined || loaderCache.has(locale)) {
|
|
105
164
|
return;
|
|
106
165
|
}
|
|
107
|
-
|
|
166
|
+
const catalogs = await options.loader(locale);
|
|
167
|
+
loaderCache.set(locale, catalogs);
|
|
108
168
|
}
|
|
109
|
-
async function
|
|
169
|
+
async function loadLocaleCatalogs(locale) {
|
|
110
170
|
if (options.loader === undefined) {
|
|
111
|
-
return;
|
|
171
|
+
return undefined;
|
|
112
172
|
}
|
|
113
173
|
await preloadLocale(locale);
|
|
174
|
+
return loaderCache.get(locale) ?? [];
|
|
175
|
+
}
|
|
176
|
+
function activateLoaderCatalogs(catalogs) {
|
|
177
|
+
const stagedLoaderCatalogs = new Map();
|
|
178
|
+
for (const catalog of catalogs) {
|
|
179
|
+
rememberCatalog(stagedLoaderCatalogs, catalog);
|
|
180
|
+
}
|
|
181
|
+
const nextEntries = buildCatalogState(stagedLoaderCatalogs);
|
|
114
182
|
loaderCatalogs.clear();
|
|
115
|
-
for (const catalog of
|
|
116
|
-
|
|
183
|
+
for (const [namespace, catalog] of stagedLoaderCatalogs) {
|
|
184
|
+
loaderCatalogs.set(namespace, catalog);
|
|
117
185
|
}
|
|
118
|
-
|
|
186
|
+
commitCatalogState(nextEntries);
|
|
119
187
|
}
|
|
120
188
|
if (options.catalogs !== undefined) {
|
|
121
189
|
for (const catalog of options.catalogs) {
|
|
@@ -123,6 +191,97 @@ export function createI18nRuntime(options) {
|
|
|
123
191
|
}
|
|
124
192
|
rebuildCatalogState();
|
|
125
193
|
}
|
|
194
|
+
if (options.fallbackCatalogs !== undefined) {
|
|
195
|
+
for (const catalog of options.fallbackCatalogs) {
|
|
196
|
+
rememberCatalog(fallbackCatalogs, catalog);
|
|
197
|
+
}
|
|
198
|
+
rebuildCatalogState();
|
|
199
|
+
}
|
|
200
|
+
function localizeRequest(request) {
|
|
201
|
+
const entry = entries.get(keyToString(request.key));
|
|
202
|
+
const kind = request.kind ?? entry?.kind ?? 'message';
|
|
203
|
+
const facts = [
|
|
204
|
+
{ kind: 'locale', key: 'locale', value: currentLocale },
|
|
205
|
+
{ kind: 'direction', key: 'direction', value: currentDirection },
|
|
206
|
+
];
|
|
207
|
+
if (entry === undefined) {
|
|
208
|
+
const issue = localizationIssue('missing-key', request.key, `Missing i18n key: ${keyToString(request.key)}`);
|
|
209
|
+
const value = kind === 'message' && options.missingMessage !== undefined
|
|
210
|
+
? interpolate(options.missingMessage({
|
|
211
|
+
key: request.key,
|
|
212
|
+
locale: currentLocale,
|
|
213
|
+
fallbackLocale,
|
|
214
|
+
reason: 'missing-key',
|
|
215
|
+
}), request.values ?? {})
|
|
216
|
+
: undefined;
|
|
217
|
+
return freezeLocalizedObject({
|
|
218
|
+
key: request.key,
|
|
219
|
+
locale: currentLocale,
|
|
220
|
+
fallbackLocale,
|
|
221
|
+
direction: currentDirection,
|
|
222
|
+
kind,
|
|
223
|
+
status: 'missing',
|
|
224
|
+
value,
|
|
225
|
+
issues: [issue],
|
|
226
|
+
facts: [
|
|
227
|
+
...facts,
|
|
228
|
+
{ kind: 'localization-status', key: 'status', value: 'missing' },
|
|
229
|
+
{ kind: 'entry-kind', key: 'kind', value: kind },
|
|
230
|
+
],
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
if (request.kind !== undefined && entry.kind !== request.kind) {
|
|
234
|
+
const issue = localizationIssue('kind-mismatch', request.key, `Expected ${request.kind} entry for ${keyToString(request.key)} but found ${entry.kind}`);
|
|
235
|
+
return freezeLocalizedObject({
|
|
236
|
+
key: request.key,
|
|
237
|
+
locale: currentLocale,
|
|
238
|
+
fallbackLocale,
|
|
239
|
+
sourceLocale: entry.sourceLocale,
|
|
240
|
+
direction: currentDirection,
|
|
241
|
+
kind: entry.kind,
|
|
242
|
+
status: 'missing',
|
|
243
|
+
issues: [issue],
|
|
244
|
+
facts: [
|
|
245
|
+
...facts,
|
|
246
|
+
{ kind: 'localization-status', key: 'status', value: 'missing' },
|
|
247
|
+
{ kind: 'entry-kind', key: 'kind', value: entry.kind },
|
|
248
|
+
],
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const resolved = resolveLocalizedValueResult(entry, new Set(), {
|
|
252
|
+
missingMessage: entry.kind === 'message' ? options.missingMessage : undefined,
|
|
253
|
+
});
|
|
254
|
+
let value = resolved.value;
|
|
255
|
+
const issues = [...resolved.issues];
|
|
256
|
+
if (entry.kind === 'message' && value !== undefined) {
|
|
257
|
+
if (typeof value !== 'string') {
|
|
258
|
+
issues.push(localizationIssue('invalid-message-value', request.key, `Resolved message for ${keyToString(request.key)} was not a string`));
|
|
259
|
+
value = undefined;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
value = interpolate(value, request.values ?? {});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const status = issues.some((issue) => issue.code === 'invalid-message-value')
|
|
266
|
+
? 'missing'
|
|
267
|
+
: resolved.status;
|
|
268
|
+
return freezeLocalizedObject({
|
|
269
|
+
key: request.key,
|
|
270
|
+
locale: currentLocale,
|
|
271
|
+
fallbackLocale,
|
|
272
|
+
sourceLocale: entry.sourceLocale,
|
|
273
|
+
direction: currentDirection,
|
|
274
|
+
kind: entry.kind,
|
|
275
|
+
status,
|
|
276
|
+
value,
|
|
277
|
+
issues,
|
|
278
|
+
facts: [
|
|
279
|
+
...facts,
|
|
280
|
+
{ kind: 'localization-status', key: 'status', value: status },
|
|
281
|
+
{ kind: 'entry-kind', key: 'kind', value: entry.kind },
|
|
282
|
+
],
|
|
283
|
+
});
|
|
284
|
+
}
|
|
126
285
|
return {
|
|
127
286
|
get locale() {
|
|
128
287
|
return currentLocale;
|
|
@@ -147,29 +306,46 @@ export function createI18nRuntime(options) {
|
|
|
147
306
|
},
|
|
148
307
|
preloadLocale,
|
|
149
308
|
async setLocale(locale, direction) {
|
|
309
|
+
if (options.loader === undefined) {
|
|
310
|
+
currentLocale = locale;
|
|
311
|
+
if (direction !== undefined) {
|
|
312
|
+
currentDirection = direction;
|
|
313
|
+
}
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const catalogs = await loadLocaleCatalogs(locale);
|
|
317
|
+
if (catalogs !== undefined) {
|
|
318
|
+
activateLoaderCatalogs(catalogs);
|
|
319
|
+
}
|
|
150
320
|
currentLocale = locale;
|
|
151
321
|
if (direction !== undefined) {
|
|
152
322
|
currentDirection = direction;
|
|
153
323
|
}
|
|
154
|
-
|
|
324
|
+
},
|
|
325
|
+
localize(request) {
|
|
326
|
+
return localizeRequest(request);
|
|
155
327
|
},
|
|
156
328
|
t(key, values = {}) {
|
|
157
|
-
const entry =
|
|
158
|
-
if (entry.kind !== 'message') {
|
|
329
|
+
const entry = entries.get(keyToString(key));
|
|
330
|
+
if (entry !== undefined && entry.kind !== 'message') {
|
|
159
331
|
throw new Error(`Expected message entry for ${keyToString(key)} but found ${entry.kind}`);
|
|
160
332
|
}
|
|
161
|
-
const resolved =
|
|
162
|
-
if (
|
|
333
|
+
const resolved = localizeRequest({ key, kind: 'message', values });
|
|
334
|
+
if (resolved.value === undefined) {
|
|
335
|
+
throw new Error(`Missing i18n key: ${keyToString(key)}`);
|
|
336
|
+
}
|
|
337
|
+
if (typeof resolved.value !== 'string') {
|
|
163
338
|
throw new Error(`Resolved message for ${keyToString(key)} was not a string`);
|
|
164
339
|
}
|
|
165
|
-
return
|
|
340
|
+
return resolved.value;
|
|
166
341
|
},
|
|
167
342
|
resource(key) {
|
|
168
343
|
const entry = entries.get(keyToString(key));
|
|
169
344
|
if (entry === undefined) {
|
|
170
345
|
return undefined;
|
|
171
346
|
}
|
|
172
|
-
|
|
347
|
+
const resolved = resolveLocalizedValue(entry, new Set());
|
|
348
|
+
return resolved === undefined ? undefined : freezeLocalizedValue(resolved);
|
|
173
349
|
},
|
|
174
350
|
formatNumber(value, locale) {
|
|
175
351
|
return formatter.formatNumber(value, locale);
|
|
@@ -185,6 +361,21 @@ export function createI18nRuntime(options) {
|
|
|
185
361
|
},
|
|
186
362
|
};
|
|
187
363
|
}
|
|
364
|
+
function mergeCatalogEntry(left, right) {
|
|
365
|
+
if (left.kind !== right.kind || left.sourceLocale !== right.sourceLocale) {
|
|
366
|
+
throw new Error(`Conflicting i18n catalog entry metadata for ${keyToString(left.key)}`);
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
key: left.key,
|
|
370
|
+
kind: left.kind,
|
|
371
|
+
sourceLocale: left.sourceLocale,
|
|
372
|
+
values: {
|
|
373
|
+
...left.values,
|
|
374
|
+
...right.values,
|
|
375
|
+
},
|
|
376
|
+
fallbackValue: right.fallbackValue ?? left.fallbackValue,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
188
379
|
export async function createI18nRuntimeAsync(options) {
|
|
189
380
|
const runtime = createI18nRuntime(options);
|
|
190
381
|
if (options.loader !== undefined) {
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flyingrobots/bijou-i18n",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "In-memory localization runtime for Bijou — catalogs, locale direction, and runtime-safe lookups.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^22.0.0",
|
|
28
28
|
"typescript": "^5.9.3",
|
|
29
|
-
"vitest": "^4.
|
|
29
|
+
"vitest": "^4.1.8"
|
|
30
30
|
},
|
|
31
31
|
"keywords": [
|
|
32
32
|
"i18n",
|