@flyingrobots/bijou-i18n-tools 5.0.0 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/adapters.d.ts +10 -0
- package/dist/adapters.d.ts.map +1 -1
- package/dist/adapters.js +25 -11
- package/dist/adapters.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/string-table.d.ts +28 -0
- package/dist/string-table.d.ts.map +1 -0
- package/dist/string-table.js +216 -0
- package/dist/string-table.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -9,6 +9,8 @@ Workflow and authoring tooling for Bijou localization.
|
|
|
9
9
|
- provider-neutral tabular export/import rows
|
|
10
10
|
- spreadsheet-friendly workbook export/import
|
|
11
11
|
- CSV/TSV sheet serialization and parsing
|
|
12
|
+
- source string-table CSV/TSV import/export
|
|
13
|
+
- per-locale runtime catalog generation from string tables
|
|
12
14
|
- serializable catalog-bundle export/import
|
|
13
15
|
- JSON bundle serialization and parsing
|
|
14
16
|
- provider-neutral async service adapter ports for workbook and bundle exchange
|
|
@@ -19,6 +21,26 @@ Workflow and authoring tooling for Bijou localization.
|
|
|
19
21
|
|
|
20
22
|
This package is intentionally provider-neutral. Filesystem, XLSX, or service-backed adapters can sit on top of it without polluting the core tooling API.
|
|
21
23
|
|
|
24
|
+
## String Table Workflow
|
|
25
|
+
|
|
26
|
+
Use the string-table helpers when one committed CSV/TSV file should be the
|
|
27
|
+
translation source and runtime should load one selected locale at a time:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import {
|
|
31
|
+
parseStringTable,
|
|
32
|
+
runtimeCatalogsForLocaleFromStringTable,
|
|
33
|
+
} from '@flyingrobots/bijou-i18n-tools';
|
|
34
|
+
|
|
35
|
+
const table = parseStringTable(csv, 'csv');
|
|
36
|
+
const catalogs = runtimeCatalogsForLocaleFromStringTable(table, 'fr');
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The generated runtime catalogs include only the selected locale's values. Source
|
|
40
|
+
strings remain in the string table and the generated source-locale catalog.
|
|
41
|
+
Other locale translations stay in the source table and do not ride along in the
|
|
42
|
+
runtime payload.
|
|
43
|
+
|
|
22
44
|
Service-backed workflows can use the built-in async adapter ports without
|
|
23
45
|
pulling remote service details into the tooling core:
|
|
24
46
|
|
package/dist/adapters.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import type { CatalogBundle, ExchangeSheet } from './exchange.js';
|
|
2
2
|
export type DelimitedFormat = 'csv' | 'tsv';
|
|
3
|
+
export interface DelimitedSheet {
|
|
4
|
+
readonly columns: readonly string[];
|
|
5
|
+
readonly rows: readonly Readonly<Record<string, string>>[];
|
|
6
|
+
}
|
|
7
|
+
export interface DelimitedSheetInput {
|
|
8
|
+
readonly columns: readonly string[];
|
|
9
|
+
readonly rows: readonly object[];
|
|
10
|
+
}
|
|
11
|
+
export declare function serializeDelimitedSheet(sheet: DelimitedSheetInput, format: DelimitedFormat): string;
|
|
12
|
+
export declare function parseDelimitedSheet(input: string, format: DelimitedFormat): DelimitedSheet;
|
|
3
13
|
export declare function serializeExchangeSheet(sheet: ExchangeSheet, format: DelimitedFormat): string;
|
|
4
14
|
export declare function parseExchangeSheet(name: string, input: string, format: DelimitedFormat): ExchangeSheet;
|
|
5
15
|
export declare function serializeCatalogBundleJson(bundle: CatalogBundle): string;
|
package/dist/adapters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAA0B,MAAM,eAAe,CAAC;AAG1F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAA0B,MAAM,eAAe,CAAC;AAG1F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAiHD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAUnG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,cAAc,CA0B1F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAE5F;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,aAAa,CAYf;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAExE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAcnE"}
|
package/dist/adapters.js
CHANGED
|
@@ -88,38 +88,52 @@ function assertWorkbookRow(row, context) {
|
|
|
88
88
|
}
|
|
89
89
|
return row;
|
|
90
90
|
}
|
|
91
|
-
|
|
91
|
+
function serializedCell(row, column) {
|
|
92
|
+
const value = row[column];
|
|
93
|
+
return typeof value === 'string' ? value : '';
|
|
94
|
+
}
|
|
95
|
+
export function serializeDelimitedSheet(sheet, format) {
|
|
92
96
|
const delimiter = delimiterFor(format);
|
|
93
97
|
const lines = [
|
|
94
98
|
serializeDelimitedRow(sheet.columns, delimiter),
|
|
95
|
-
...sheet.rows.map((row) => serializeDelimitedRow(sheet.columns.map((column) =>
|
|
96
|
-
const value = row[column];
|
|
97
|
-
return typeof value === 'string' ? value : '';
|
|
98
|
-
}), delimiter)),
|
|
99
|
+
...sheet.rows.map((row) => serializeDelimitedRow(sheet.columns.map((column) => serializedCell(row, column)), delimiter)),
|
|
99
100
|
];
|
|
100
101
|
return lines.join('\n');
|
|
101
102
|
}
|
|
102
|
-
export function
|
|
103
|
+
export function parseDelimitedSheet(input, format) {
|
|
103
104
|
const delimiter = delimiterFor(format);
|
|
104
105
|
const rows = parseDelimited(input, delimiter);
|
|
105
106
|
if (rows.length === 0) {
|
|
106
|
-
throw new Error(
|
|
107
|
+
throw new Error('Invalid delimited sheet: empty input');
|
|
107
108
|
}
|
|
108
109
|
const [header, ...body] = rows;
|
|
109
110
|
if (header === undefined) {
|
|
110
|
-
throw new Error(
|
|
111
|
+
throw new Error('Invalid delimited sheet: missing header');
|
|
111
112
|
}
|
|
112
113
|
const columns = [...header];
|
|
113
114
|
const parsedRows = body.map((cells, rowIndex) => {
|
|
114
115
|
if (cells.length !== columns.length) {
|
|
115
|
-
throw new Error(`Invalid delimited sheet: ragged row ${rowIndex + 2}
|
|
116
|
+
throw new Error(`Invalid delimited sheet: ragged row ${rowIndex + 2}`);
|
|
116
117
|
}
|
|
117
|
-
|
|
118
|
+
return Object.freeze(Object.fromEntries(columns.map((column, index) => [column, cells[index] ?? ''])));
|
|
119
|
+
});
|
|
120
|
+
return Object.freeze({
|
|
121
|
+
columns: Object.freeze(columns),
|
|
122
|
+
rows: Object.freeze(parsedRows),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function serializeExchangeSheet(sheet, format) {
|
|
126
|
+
return serializeDelimitedSheet(sheet, format);
|
|
127
|
+
}
|
|
128
|
+
export function parseExchangeSheet(name, input, format) {
|
|
129
|
+
const sheet = parseDelimitedSheet(input, format);
|
|
130
|
+
const parsedRows = sheet.rows.map((row, rowIndex) => {
|
|
131
|
+
const record = { ...row };
|
|
118
132
|
return assertWorkbookRow(record, `${name}:${rowIndex + 2}`);
|
|
119
133
|
});
|
|
120
134
|
return {
|
|
121
135
|
name,
|
|
122
|
-
columns,
|
|
136
|
+
columns: sheet.columns,
|
|
123
137
|
rows: parsedRows,
|
|
124
138
|
};
|
|
125
139
|
}
|
package/dist/adapters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeExchangeSheet, type DelimitedFormat, } from './adapters.js';
|
|
1
|
+
export { parseDelimitedSheet, parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeDelimitedSheet, serializeExchangeSheet, type DelimitedFormat, type DelimitedSheet, type DelimitedSheetInput, } from './adapters.js';
|
|
2
2
|
export { decodeExchangeValue, encodeExchangeValue, exportCatalogBundle, exportTranslationWorkbook, importCatalogBundle, importTranslationWorkbook, type CatalogBundle, type EncodedExchangeValue, type ExchangeSheet, type ExchangeValueKind, type ExchangeWorkbook, type SerializedAuthoringCatalog, type SerializedAuthoringCatalogEntry, type SerializedAuthoringTranslation, type TranslationWorkbookRow, } from './exchange.js';
|
|
3
3
|
export { compileCatalogs, exportTranslationRows, hashSourceValue, importTranslationRows, markStaleTranslations, pseudoLocalize, ref, type AuthoringCatalog, type AuthoringCatalogEntry, type AuthoringTranslation, type AuthoringTranslationStatus, type TranslationRow, } from './tools.js';
|
|
4
4
|
export { pullCatalogBundleFromService, pullTranslationWorkbookFromService, pushCatalogBundleToService, pushTranslationWorkbookToService, type CatalogBundleServiceAdapter, type CatalogBundleServicePullResult, type ExchangeWorkbookServiceAdapter, type ServiceExchangeAdapter, type ServiceExchangeSnapshot, type TranslationWorkbookServicePullResult, } from './service.js';
|
|
5
|
+
export { authoringCatalogsFromStringTable, exportStringTable, parseStringTable, runtimeCatalogsByLocaleFromStringTable, runtimeCatalogsForLocaleFromStringTable, serializeStringTable, stringTableFromDelimitedSheet, type StringTable, type StringTableRow, } from './string-table.js';
|
|
5
6
|
//# 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,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,GAAG,EACH,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,EAC1B,gCAAgC,EAChC,KAAK,2BAA2B,EAChC,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oCAAoC,GAC1C,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gCAAgC,EAChC,iBAAiB,EACjB,gBAAgB,EAChB,sCAAsC,EACtC,uCAAuC,EACvC,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeExchangeSheet, } from './adapters.js';
|
|
1
|
+
export { parseDelimitedSheet, parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeDelimitedSheet, serializeExchangeSheet, } from './adapters.js';
|
|
2
2
|
export { decodeExchangeValue, encodeExchangeValue, exportCatalogBundle, exportTranslationWorkbook, importCatalogBundle, importTranslationWorkbook, } from './exchange.js';
|
|
3
3
|
export { compileCatalogs, exportTranslationRows, hashSourceValue, importTranslationRows, markStaleTranslations, pseudoLocalize, ref, } from './tools.js';
|
|
4
4
|
export { pullCatalogBundleFromService, pullTranslationWorkbookFromService, pushCatalogBundleToService, pushTranslationWorkbookToService, } from './service.js';
|
|
5
|
+
export { authoringCatalogsFromStringTable, exportStringTable, parseStringTable, runtimeCatalogsByLocaleFromStringTable, runtimeCatalogsForLocaleFromStringTable, serializeStringTable, stringTableFromDelimitedSheet, } from './string-table.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
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,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,GAIvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,GAU1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,GAAG,GAMJ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,EAC1B,gCAAgC,GAOjC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gCAAgC,EAChC,iBAAiB,EACjB,gBAAgB,EAChB,sCAAsC,EACtC,uCAAuC,EACvC,oBAAoB,EACpB,6BAA6B,GAG9B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { I18nCatalog } from '@flyingrobots/bijou-i18n';
|
|
2
|
+
import { type DelimitedFormat, type DelimitedSheet } from './adapters.js';
|
|
3
|
+
import { type AuthoringCatalog } from './tools.js';
|
|
4
|
+
export interface StringTableRow {
|
|
5
|
+
readonly namespace: string;
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly kind: string;
|
|
8
|
+
readonly sourceLocale: string;
|
|
9
|
+
readonly sourceValueKind: string;
|
|
10
|
+
readonly sourceValue: string;
|
|
11
|
+
readonly locale: string;
|
|
12
|
+
readonly valueKind: string;
|
|
13
|
+
readonly value: string;
|
|
14
|
+
readonly status: string;
|
|
15
|
+
readonly description: string;
|
|
16
|
+
}
|
|
17
|
+
export interface StringTable {
|
|
18
|
+
readonly columns: readonly string[];
|
|
19
|
+
readonly rows: readonly StringTableRow[];
|
|
20
|
+
}
|
|
21
|
+
export declare function exportStringTable(catalogs: readonly AuthoringCatalog[], locales: readonly string[]): StringTable;
|
|
22
|
+
export declare function parseStringTable(input: string, format: DelimitedFormat): StringTable;
|
|
23
|
+
export declare function serializeStringTable(table: StringTable, format: DelimitedFormat): string;
|
|
24
|
+
export declare function stringTableFromDelimitedSheet(sheet: DelimitedSheet): StringTable;
|
|
25
|
+
export declare function authoringCatalogsFromStringTable(table: StringTable): readonly AuthoringCatalog[];
|
|
26
|
+
export declare function runtimeCatalogsForLocaleFromStringTable(table: StringTable, locale: string): readonly I18nCatalog[];
|
|
27
|
+
export declare function runtimeCatalogsByLocaleFromStringTable(table: StringTable): Readonly<Record<string, readonly I18nCatalog[]>>;
|
|
28
|
+
//# sourceMappingURL=string-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-table.d.ts","sourceRoot":"","sources":["../src/string-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAEL,KAAK,gBAAgB,EAItB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CAC1C;AAsFD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,WAAW,CAoCb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAGpF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAKxF;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,cAAc,GAAG,WAAW,CAQhF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,gBAAgB,EAAE,CAoDhG;AAED,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,SAAS,WAAW,EAAE,CAMxB;AAED,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,WAAW,GACjB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAAC,CAKlD"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { parseDelimitedSheet, serializeDelimitedSheet, } from './adapters.js';
|
|
2
|
+
import { decodeExchangeValue, encodeExchangeValue, } from './exchange.js';
|
|
3
|
+
import { hashSourceValue, } from './tools.js';
|
|
4
|
+
const STRING_TABLE_COLUMNS = [
|
|
5
|
+
'namespace',
|
|
6
|
+
'id',
|
|
7
|
+
'kind',
|
|
8
|
+
'sourceLocale',
|
|
9
|
+
'sourceValueKind',
|
|
10
|
+
'sourceValue',
|
|
11
|
+
'locale',
|
|
12
|
+
'valueKind',
|
|
13
|
+
'value',
|
|
14
|
+
'status',
|
|
15
|
+
'description',
|
|
16
|
+
];
|
|
17
|
+
function isEntryKind(value) {
|
|
18
|
+
return value === 'message' || value === 'resource' || value === 'data';
|
|
19
|
+
}
|
|
20
|
+
function isTranslationStatus(value) {
|
|
21
|
+
return value === 'current' || value === 'stale' || value === 'missing';
|
|
22
|
+
}
|
|
23
|
+
function assertStringTableRow(row, context) {
|
|
24
|
+
const namespace = requiredCell(row, 'namespace', context);
|
|
25
|
+
const id = requiredCell(row, 'id', context);
|
|
26
|
+
const kind = requiredCell(row, 'kind', context);
|
|
27
|
+
const sourceLocale = requiredCell(row, 'sourceLocale', context);
|
|
28
|
+
const sourceValueKind = requiredCell(row, 'sourceValueKind', context);
|
|
29
|
+
const sourceValue = requiredCell(row, 'sourceValue', context);
|
|
30
|
+
const locale = requiredCell(row, 'locale', context);
|
|
31
|
+
const valueKind = requiredCell(row, 'valueKind', context);
|
|
32
|
+
const value = requiredCell(row, 'value', context);
|
|
33
|
+
const status = requiredCell(row, 'status', context);
|
|
34
|
+
const description = requiredCell(row, 'description', context);
|
|
35
|
+
if (!isEntryKind(kind)) {
|
|
36
|
+
throw new Error(`Invalid string table: unknown entry kind ${kind} in ${context}`);
|
|
37
|
+
}
|
|
38
|
+
if (!isTranslationStatus(status)) {
|
|
39
|
+
throw new Error(`Invalid string table: unknown status ${status} in ${context}`);
|
|
40
|
+
}
|
|
41
|
+
if (valueKind === '' && value !== '' && status !== 'missing') {
|
|
42
|
+
throw new Error(`Invalid string table: missing valueKind in ${context}`);
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
namespace,
|
|
46
|
+
id,
|
|
47
|
+
kind,
|
|
48
|
+
sourceLocale,
|
|
49
|
+
sourceValueKind,
|
|
50
|
+
sourceValue,
|
|
51
|
+
locale,
|
|
52
|
+
valueKind,
|
|
53
|
+
value,
|
|
54
|
+
status,
|
|
55
|
+
description,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function requiredCell(row, column, context) {
|
|
59
|
+
const value = row[column];
|
|
60
|
+
if (typeof value !== 'string') {
|
|
61
|
+
throw new Error(`Invalid string table: missing ${column} in ${context}`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
function decode(kind, payload, context) {
|
|
66
|
+
try {
|
|
67
|
+
return decodeExchangeValue({ kind: kind, payload });
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const message = error instanceof Error ? error.message : 'unknown error';
|
|
71
|
+
throw new Error(`Invalid string table value in ${context}: ${message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function rowKey(row) {
|
|
75
|
+
return `${row.namespace}:${row.id}`;
|
|
76
|
+
}
|
|
77
|
+
export function exportStringTable(catalogs, locales) {
|
|
78
|
+
const rows = [];
|
|
79
|
+
for (const catalog of catalogs) {
|
|
80
|
+
for (const entry of catalog.entries) {
|
|
81
|
+
const encodedSource = encodeExchangeValue(entry.sourceValue);
|
|
82
|
+
const sourceLocales = new Set([entry.sourceLocale, ...locales]);
|
|
83
|
+
for (const locale of sourceLocales) {
|
|
84
|
+
const translation = locale === entry.sourceLocale
|
|
85
|
+
? {
|
|
86
|
+
value: entry.sourceValue,
|
|
87
|
+
status: 'current',
|
|
88
|
+
}
|
|
89
|
+
: entry.translations[locale];
|
|
90
|
+
const encodedValue = translation?.value === undefined
|
|
91
|
+
? undefined
|
|
92
|
+
: encodeExchangeValue(translation.value);
|
|
93
|
+
rows.push(Object.freeze({
|
|
94
|
+
namespace: entry.key.namespace,
|
|
95
|
+
id: entry.key.id,
|
|
96
|
+
kind: entry.kind,
|
|
97
|
+
sourceLocale: entry.sourceLocale,
|
|
98
|
+
sourceValueKind: encodedSource.kind,
|
|
99
|
+
sourceValue: encodedSource.payload,
|
|
100
|
+
locale,
|
|
101
|
+
valueKind: encodedValue?.kind ?? '',
|
|
102
|
+
value: encodedValue?.payload ?? '',
|
|
103
|
+
status: translation?.status ?? 'missing',
|
|
104
|
+
description: entry.description ?? '',
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
columns: STRING_TABLE_COLUMNS,
|
|
111
|
+
rows: Object.freeze(rows.sort(compareRows)),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export function parseStringTable(input, format) {
|
|
115
|
+
const sheet = parseDelimitedSheet(input, format);
|
|
116
|
+
return stringTableFromDelimitedSheet(sheet);
|
|
117
|
+
}
|
|
118
|
+
export function serializeStringTable(table, format) {
|
|
119
|
+
return serializeDelimitedSheet({
|
|
120
|
+
columns: STRING_TABLE_COLUMNS,
|
|
121
|
+
rows: table.rows,
|
|
122
|
+
}, format);
|
|
123
|
+
}
|
|
124
|
+
export function stringTableFromDelimitedSheet(sheet) {
|
|
125
|
+
if (!STRING_TABLE_COLUMNS.every((column) => sheet.columns.includes(column))) {
|
|
126
|
+
throw new Error('Invalid string table: missing required columns');
|
|
127
|
+
}
|
|
128
|
+
return Object.freeze({
|
|
129
|
+
columns: STRING_TABLE_COLUMNS,
|
|
130
|
+
rows: Object.freeze(sheet.rows.map((row, index) => assertStringTableRow(row, `row ${index + 2}`))),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
export function authoringCatalogsFromStringTable(table) {
|
|
134
|
+
const entriesByKey = new Map();
|
|
135
|
+
for (const row of table.rows) {
|
|
136
|
+
const key = rowKey(row);
|
|
137
|
+
const sourceValue = decode(row.sourceValueKind, row.sourceValue, key);
|
|
138
|
+
const existing = entriesByKey.get(key);
|
|
139
|
+
const entry = existing ?? {
|
|
140
|
+
key: { namespace: row.namespace, id: row.id },
|
|
141
|
+
kind: row.kind,
|
|
142
|
+
sourceLocale: row.sourceLocale,
|
|
143
|
+
sourceValue,
|
|
144
|
+
translations: {},
|
|
145
|
+
...(row.description === '' ? {} : { description: row.description }),
|
|
146
|
+
};
|
|
147
|
+
if (existing !== undefined) {
|
|
148
|
+
if (existing.kind !== row.kind || existing.sourceLocale !== row.sourceLocale) {
|
|
149
|
+
throw new Error(`Invalid string table: conflicting entry metadata for ${key}`);
|
|
150
|
+
}
|
|
151
|
+
if (JSON.stringify(existing.sourceValue) !== JSON.stringify(sourceValue)) {
|
|
152
|
+
throw new Error(`Invalid string table: conflicting source value for ${key}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (row.locale !== row.sourceLocale && row.status !== 'missing' && row.valueKind !== '') {
|
|
156
|
+
const translations = { ...entry.translations };
|
|
157
|
+
translations[row.locale] = {
|
|
158
|
+
value: decode(row.valueKind, row.value, `${key}:${row.locale}`),
|
|
159
|
+
sourceHash: hashSourceValue(sourceValue),
|
|
160
|
+
status: row.status,
|
|
161
|
+
};
|
|
162
|
+
entriesByKey.set(key, {
|
|
163
|
+
...entry,
|
|
164
|
+
translations,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else if (existing === undefined) {
|
|
168
|
+
entriesByKey.set(key, entry);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const catalogs = new Map();
|
|
172
|
+
for (const entry of entriesByKey.values()) {
|
|
173
|
+
const catalogEntries = catalogs.get(entry.key.namespace) ?? [];
|
|
174
|
+
catalogEntries.push(entry);
|
|
175
|
+
catalogs.set(entry.key.namespace, catalogEntries);
|
|
176
|
+
}
|
|
177
|
+
return Object.freeze([...catalogs.entries()]
|
|
178
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
179
|
+
.map(([namespace, entries]) => Object.freeze({
|
|
180
|
+
namespace,
|
|
181
|
+
entries: Object.freeze(entries.sort((left, right) => left.key.id.localeCompare(right.key.id))),
|
|
182
|
+
})));
|
|
183
|
+
}
|
|
184
|
+
export function runtimeCatalogsForLocaleFromStringTable(table, locale) {
|
|
185
|
+
const catalogs = authoringCatalogsFromStringTable(table);
|
|
186
|
+
return Object.freeze(catalogs.map((catalog) => Object.freeze({
|
|
187
|
+
namespace: catalog.namespace,
|
|
188
|
+
entries: Object.freeze(catalog.entries.map((entry) => runtimeEntryForLocale(entry, locale))),
|
|
189
|
+
})));
|
|
190
|
+
}
|
|
191
|
+
export function runtimeCatalogsByLocaleFromStringTable(table) {
|
|
192
|
+
const locales = [...new Set(table.rows.map((row) => row.locale))].sort((left, right) => left.localeCompare(right));
|
|
193
|
+
return Object.freeze(Object.fromEntries(locales.map((locale) => [locale, runtimeCatalogsForLocaleFromStringTable(table, locale)])));
|
|
194
|
+
}
|
|
195
|
+
function runtimeEntryForLocale(entry, locale) {
|
|
196
|
+
const values = {};
|
|
197
|
+
const translation = entry.translations[locale];
|
|
198
|
+
if (locale === entry.sourceLocale) {
|
|
199
|
+
values[entry.sourceLocale] = entry.sourceValue;
|
|
200
|
+
}
|
|
201
|
+
else if (translation?.status === 'current') {
|
|
202
|
+
values[locale] = translation.value;
|
|
203
|
+
}
|
|
204
|
+
return Object.freeze({
|
|
205
|
+
key: entry.key,
|
|
206
|
+
kind: entry.kind,
|
|
207
|
+
sourceLocale: entry.sourceLocale,
|
|
208
|
+
values: Object.freeze(values),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function compareRows(left, right) {
|
|
212
|
+
return left.namespace.localeCompare(right.namespace)
|
|
213
|
+
|| left.id.localeCompare(right.id)
|
|
214
|
+
|| left.locale.localeCompare(right.locale);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=string-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-table.js","sourceRoot":"","sources":["../src/string-table.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flyingrobots/bijou-i18n-tools",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.1.0",
|
|
4
4
|
"description": "Localization workflow tooling for Bijou — authoring catalogs, stale detection, tabular export/import, and runtime compilation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
"lint": "tsc --noEmit"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@flyingrobots/bijou-i18n": "
|
|
27
|
+
"@flyingrobots/bijou-i18n": "7.1.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "^22.0.0",
|
|
31
31
|
"typescript": "^5.9.3",
|
|
32
|
-
"vitest": "^4.
|
|
32
|
+
"vitest": "^4.1.8"
|
|
33
33
|
},
|
|
34
34
|
"keywords": [
|
|
35
35
|
"i18n",
|