@_linked/translation 0.2.2
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 +102 -0
- package/lib/cjs/data/translation.json +8 -0
- package/lib/esm/archive.d.ts +133 -0
- package/lib/esm/archive.js +567 -0
- package/lib/esm/archive.js.map +1 -0
- package/lib/esm/authorization.d.ts +12 -0
- package/lib/esm/authorization.js +10 -0
- package/lib/esm/authorization.js.map +1 -0
- package/lib/esm/backend.d.ts +1 -0
- package/lib/esm/backend.js +3 -0
- package/lib/esm/backend.js.map +1 -0
- package/lib/esm/cdn-loader.d.ts +40 -0
- package/lib/esm/cdn-loader.js +200 -0
- package/lib/esm/cdn-loader.js.map +1 -0
- package/lib/esm/checks.d.ts +56 -0
- package/lib/esm/checks.js +288 -0
- package/lib/esm/checks.js.map +1 -0
- package/lib/esm/compile.d.ts +64 -0
- package/lib/esm/compile.js +99 -0
- package/lib/esm/compile.js.map +1 -0
- package/lib/esm/core/messages.d.ts +25 -0
- package/lib/esm/core/messages.js +76 -0
- package/lib/esm/core/messages.js.map +1 -0
- package/lib/esm/data/translation.json +8 -0
- package/lib/esm/discovery.d.ts +97 -0
- package/lib/esm/discovery.js +365 -0
- package/lib/esm/discovery.js.map +1 -0
- package/lib/esm/exchange.d.ts +100 -0
- package/lib/esm/exchange.js +223 -0
- package/lib/esm/exchange.js.map +1 -0
- package/lib/esm/export.d.ts +28 -0
- package/lib/esm/export.js +92 -0
- package/lib/esm/export.js.map +1 -0
- package/lib/esm/formats/csv.d.ts +8 -0
- package/lib/esm/formats/csv.js +397 -0
- package/lib/esm/formats/csv.js.map +1 -0
- package/lib/esm/formats/json.d.ts +30 -0
- package/lib/esm/formats/json.js +459 -0
- package/lib/esm/formats/json.js.map +1 -0
- package/lib/esm/formats/xliff.d.ts +12 -0
- package/lib/esm/formats/xliff.js +577 -0
- package/lib/esm/formats/xliff.js.map +1 -0
- package/lib/esm/import.d.ts +197 -0
- package/lib/esm/import.js +391 -0
- package/lib/esm/import.js.map +1 -0
- package/lib/esm/index.d.ts +42 -0
- package/lib/esm/index.js +34 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/key-sync-node.d.ts +29 -0
- package/lib/esm/key-sync-node.js +174 -0
- package/lib/esm/key-sync-node.js.map +1 -0
- package/lib/esm/key-sync.d.ts +46 -0
- package/lib/esm/key-sync.js +114 -0
- package/lib/esm/key-sync.js.map +1 -0
- package/lib/esm/key-version.d.ts +50 -0
- package/lib/esm/key-version.js +134 -0
- package/lib/esm/key-version.js.map +1 -0
- package/lib/esm/languages.d.ts +18 -0
- package/lib/esm/languages.js +74 -0
- package/lib/esm/languages.js.map +1 -0
- package/lib/esm/linked-discovery.d.ts +44 -0
- package/lib/esm/linked-discovery.js +267 -0
- package/lib/esm/linked-discovery.js.map +1 -0
- package/lib/esm/message-format.d.ts +41 -0
- package/lib/esm/message-format.js +133 -0
- package/lib/esm/message-format.js.map +1 -0
- package/lib/esm/mt.d.ts +111 -0
- package/lib/esm/mt.js +142 -0
- package/lib/esm/mt.js.map +1 -0
- package/lib/esm/ontologies/translation.d.ts +203 -0
- package/lib/esm/ontologies/translation.js +219 -0
- package/lib/esm/ontologies/translation.js.map +1 -0
- package/lib/esm/package.d.ts +4 -0
- package/lib/esm/package.js +11 -0
- package/lib/esm/package.js.map +1 -0
- package/lib/esm/react.d.ts +55 -0
- package/lib/esm/react.js +127 -0
- package/lib/esm/react.js.map +1 -0
- package/lib/esm/records.d.ts +151 -0
- package/lib/esm/records.js +2 -0
- package/lib/esm/records.js.map +1 -0
- package/lib/esm/release.d.ts +198 -0
- package/lib/esm/release.js +435 -0
- package/lib/esm/release.js.map +1 -0
- package/lib/esm/shape-catalog.d.ts +79 -0
- package/lib/esm/shape-catalog.js +118 -0
- package/lib/esm/shape-catalog.js.map +1 -0
- package/lib/esm/shapes/GlossaryTerm.d.ts +28 -0
- package/lib/esm/shapes/GlossaryTerm.js +94 -0
- package/lib/esm/shapes/GlossaryTerm.js.map +1 -0
- package/lib/esm/shapes/TranslationInventoryOrigin.d.ts +33 -0
- package/lib/esm/shapes/TranslationInventoryOrigin.js +209 -0
- package/lib/esm/shapes/TranslationInventoryOrigin.js.map +1 -0
- package/lib/esm/shapes/TranslationKey.d.ts +92 -0
- package/lib/esm/shapes/TranslationKey.js +194 -0
- package/lib/esm/shapes/TranslationKey.js.map +1 -0
- package/lib/esm/shapes/TranslationKeyVersion.d.ts +19 -0
- package/lib/esm/shapes/TranslationKeyVersion.js +125 -0
- package/lib/esm/shapes/TranslationKeyVersion.js.map +1 -0
- package/lib/esm/shapes/TranslationLanguage.d.ts +15 -0
- package/lib/esm/shapes/TranslationLanguage.js +102 -0
- package/lib/esm/shapes/TranslationLanguage.js.map +1 -0
- package/lib/esm/shapes/TranslationProvider.d.ts +409 -0
- package/lib/esm/shapes/TranslationProvider.js +1376 -0
- package/lib/esm/shapes/TranslationProvider.js.map +1 -0
- package/lib/esm/shapes/TranslationRelease.d.ts +36 -0
- package/lib/esm/shapes/TranslationRelease.js +149 -0
- package/lib/esm/shapes/TranslationRelease.js.map +1 -0
- package/lib/esm/shapes/TranslationRevision.d.ts +39 -0
- package/lib/esm/shapes/TranslationRevision.js +159 -0
- package/lib/esm/shapes/TranslationRevision.js.map +1 -0
- package/lib/esm/shapes/TranslationUnit.d.ts +26 -0
- package/lib/esm/shapes/TranslationUnit.js +111 -0
- package/lib/esm/shapes/TranslationUnit.js.map +1 -0
- package/package.json +134 -0
- package/src/archive.ts +894 -0
- package/src/authorization.ts +33 -0
- package/src/backend.ts +2 -0
- package/src/cdn-loader.ts +264 -0
- package/src/checks.ts +413 -0
- package/src/compile.ts +168 -0
- package/src/core/messages.ts +106 -0
- package/src/data/translation.json +8 -0
- package/src/discovery.ts +594 -0
- package/src/exchange.ts +428 -0
- package/src/export.ts +135 -0
- package/src/formats/csv.ts +459 -0
- package/src/formats/json.ts +587 -0
- package/src/formats/xliff.ts +708 -0
- package/src/import.ts +648 -0
- package/src/index.ts +207 -0
- package/src/key-sync-node.ts +269 -0
- package/src/key-sync.ts +168 -0
- package/src/key-version.ts +206 -0
- package/src/languages.ts +102 -0
- package/src/linked-discovery.ts +385 -0
- package/src/message-format.ts +214 -0
- package/src/mt.ts +248 -0
- package/src/ontologies/translation.ts +234 -0
- package/src/package.ts +19 -0
- package/src/react.tsx +250 -0
- package/src/records.ts +180 -0
- package/src/release.ts +726 -0
- package/src/shape-catalog.ts +198 -0
- package/src/shapes/GlossaryTerm.ts +61 -0
- package/src/shapes/TranslationInventoryOrigin.ts +131 -0
- package/src/shapes/TranslationKey.ts +174 -0
- package/src/shapes/TranslationKeyVersion.ts +77 -0
- package/src/shapes/TranslationLanguage.ts +51 -0
- package/src/shapes/TranslationProvider.ts +1755 -0
- package/src/shapes/TranslationRelease.ts +114 -0
- package/src/shapes/TranslationRevision.ts +105 -0
- package/src/shapes/TranslationUnit.ts +72 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { canonicalLanguageTag } from './key-version.js';
|
|
2
|
+
const EXCHANGE_STATES = new Set([
|
|
3
|
+
'untranslated',
|
|
4
|
+
'machine',
|
|
5
|
+
'reviewed',
|
|
6
|
+
'stale',
|
|
7
|
+
]);
|
|
8
|
+
const adapters = new Map();
|
|
9
|
+
function record(value, label) {
|
|
10
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
11
|
+
throw new Error(`${label} must be an object.`);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
function requiredString(value, label) {
|
|
16
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
17
|
+
throw new Error(`${label} is required.`);
|
|
18
|
+
}
|
|
19
|
+
return value.trim();
|
|
20
|
+
}
|
|
21
|
+
function optionalString(value, label) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
25
|
+
throw new Error(`${label} must be a non-empty string when supplied.`);
|
|
26
|
+
}
|
|
27
|
+
return value.trim();
|
|
28
|
+
}
|
|
29
|
+
function messageFormat(value, label) {
|
|
30
|
+
if (value !== 'simple' && value !== 'icu') {
|
|
31
|
+
throw new Error(`${label} must be "simple" or "icu".`);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function exchangeKind(value, label) {
|
|
36
|
+
if (value !== 'ui' && value !== 'semantic') {
|
|
37
|
+
throw new Error(`${label} must be "ui" or "semantic".`);
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function canonicalLanguages(value, label) {
|
|
42
|
+
if (!Array.isArray(value))
|
|
43
|
+
throw new Error(`${label} must be an array.`);
|
|
44
|
+
const canonical = [];
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
for (const item of value) {
|
|
47
|
+
if (typeof item !== 'string') {
|
|
48
|
+
throw new Error(`${label} must contain only BCP-47 strings.`);
|
|
49
|
+
}
|
|
50
|
+
const language = canonicalLanguageTag(item);
|
|
51
|
+
if (!seen.has(language)) {
|
|
52
|
+
seen.add(language);
|
|
53
|
+
canonical.push(language);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return canonical;
|
|
57
|
+
}
|
|
58
|
+
function normalizeTranslations(value, label) {
|
|
59
|
+
const input = record(value, label);
|
|
60
|
+
const translations = {};
|
|
61
|
+
for (const [rawLanguage, rawValue] of Object.entries(input)) {
|
|
62
|
+
const language = canonicalLanguageTag(rawLanguage);
|
|
63
|
+
if (translations[language]) {
|
|
64
|
+
throw new Error(`${label} contains duplicate canonical language "${language}".`);
|
|
65
|
+
}
|
|
66
|
+
const item = record(rawValue, `${label}.${rawLanguage}`);
|
|
67
|
+
if (typeof item.text !== 'string') {
|
|
68
|
+
throw new Error(`${label}.${rawLanguage}.text must be a string.`);
|
|
69
|
+
}
|
|
70
|
+
const state = item.state;
|
|
71
|
+
if (state !== undefined && !EXCHANGE_STATES.has(state)) {
|
|
72
|
+
throw new Error(`${label}.${rawLanguage}.state is invalid.`);
|
|
73
|
+
}
|
|
74
|
+
translations[language] = {
|
|
75
|
+
text: item.text,
|
|
76
|
+
...(state ? { state: state } : {}),
|
|
77
|
+
...(item.note === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: {
|
|
80
|
+
note: requiredString(item.note, `${label}.${rawLanguage}.note`),
|
|
81
|
+
}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return translations;
|
|
85
|
+
}
|
|
86
|
+
function normalizeEntry(value, index) {
|
|
87
|
+
const item = record(value, `entries[${index}]`);
|
|
88
|
+
const key = requiredString(item.key, `entries[${index}].key`);
|
|
89
|
+
return {
|
|
90
|
+
key,
|
|
91
|
+
...(item.namespace === undefined
|
|
92
|
+
? {}
|
|
93
|
+
: {
|
|
94
|
+
namespace: requiredString(item.namespace, `entries[${index}].namespace`),
|
|
95
|
+
}),
|
|
96
|
+
kind: exchangeKind(item.kind, `entries[${index}].kind`),
|
|
97
|
+
format: messageFormat(item.format, `entries[${index}].format`),
|
|
98
|
+
...(item.sourceText === undefined
|
|
99
|
+
? {}
|
|
100
|
+
: {
|
|
101
|
+
sourceText: typeof item.sourceText === 'string'
|
|
102
|
+
? item.sourceText
|
|
103
|
+
: requiredString(item.sourceText, `entries[${index}].sourceText`),
|
|
104
|
+
}),
|
|
105
|
+
...(item.keyVersionId === undefined
|
|
106
|
+
? {}
|
|
107
|
+
: {
|
|
108
|
+
keyVersionId: requiredString(item.keyVersionId, `entries[${index}].keyVersionId`),
|
|
109
|
+
}),
|
|
110
|
+
...(item.sourceHash === undefined
|
|
111
|
+
? {}
|
|
112
|
+
: {
|
|
113
|
+
sourceHash: requiredString(item.sourceHash, `entries[${index}].sourceHash`),
|
|
114
|
+
}),
|
|
115
|
+
...(item.contractHash === undefined
|
|
116
|
+
? {}
|
|
117
|
+
: {
|
|
118
|
+
contractHash: requiredString(item.contractHash, `entries[${index}].contractHash`),
|
|
119
|
+
}),
|
|
120
|
+
...(item.argumentSignature === undefined
|
|
121
|
+
? {}
|
|
122
|
+
: {
|
|
123
|
+
argumentSignature: requiredString(item.argumentSignature, `entries[${index}].argumentSignature`),
|
|
124
|
+
}),
|
|
125
|
+
...(item.description === undefined
|
|
126
|
+
? {}
|
|
127
|
+
: {
|
|
128
|
+
description: requiredString(item.description, `entries[${index}].description`),
|
|
129
|
+
}),
|
|
130
|
+
translations: normalizeTranslations(item.translations, `entries[${index}].translations`),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Normalize adapter output without inventing evidence missing from a foreign
|
|
135
|
+
* file. Import disposition handles those entries as unverified later.
|
|
136
|
+
*/
|
|
137
|
+
export function normalizeParsedTranslationExchangeDocument(value) {
|
|
138
|
+
var _a;
|
|
139
|
+
const input = record(value, 'Translation exchange document');
|
|
140
|
+
if (input.schemaVersion !== 1) {
|
|
141
|
+
throw new Error('Translation exchange schemaVersion must be 1.');
|
|
142
|
+
}
|
|
143
|
+
const sourceLanguage = canonicalLanguageTag(requiredString(input.sourceLanguage, 'sourceLanguage'));
|
|
144
|
+
const targetLanguages = canonicalLanguages(input.targetLanguages, 'targetLanguages');
|
|
145
|
+
if (!Array.isArray(input.entries)) {
|
|
146
|
+
throw new Error('entries must be an array.');
|
|
147
|
+
}
|
|
148
|
+
const entries = input.entries.map(normalizeEntry);
|
|
149
|
+
const identities = new Set();
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
for (const language of Object.keys(entry.translations)) {
|
|
152
|
+
const identity = `${(_a = entry.namespace) !== null && _a !== void 0 ? _a : ''}\u0000${entry.key}\u0000${language}`;
|
|
153
|
+
if (identities.has(identity)) {
|
|
154
|
+
throw new Error(`Duplicate translation entry for "${entry.key}" in ${language}.`);
|
|
155
|
+
}
|
|
156
|
+
identities.add(identity);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
schemaVersion: 1,
|
|
161
|
+
...(input.appId === undefined
|
|
162
|
+
? {}
|
|
163
|
+
: { appId: requiredString(input.appId, 'appId') }),
|
|
164
|
+
...(input.branchId === undefined
|
|
165
|
+
? {}
|
|
166
|
+
: { branchId: requiredString(input.branchId, 'branchId') }),
|
|
167
|
+
sourceLanguage,
|
|
168
|
+
targetLanguages,
|
|
169
|
+
...(input.exportedAt === undefined
|
|
170
|
+
? {}
|
|
171
|
+
: { exportedAt: requiredString(input.exportedAt, 'exportedAt') }),
|
|
172
|
+
...(input.revisionWatermark === undefined
|
|
173
|
+
? {}
|
|
174
|
+
: {
|
|
175
|
+
revisionWatermark: requiredString(input.revisionWatermark, 'revisionWatermark'),
|
|
176
|
+
}),
|
|
177
|
+
...(input.contractSetHash === undefined
|
|
178
|
+
? {}
|
|
179
|
+
: {
|
|
180
|
+
contractSetHash: requiredString(input.contractSetHash, 'contractSetHash'),
|
|
181
|
+
}),
|
|
182
|
+
entries,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/** Validate the stronger, version-evidenced document required for CN exports. */
|
|
186
|
+
export function validateTranslationExchangeDocument(value) {
|
|
187
|
+
const parsed = normalizeParsedTranslationExchangeDocument(value);
|
|
188
|
+
const entries = parsed.entries.map((entry, index) => {
|
|
189
|
+
var _a, _b, _c, _d, _e;
|
|
190
|
+
return ({
|
|
191
|
+
...entry,
|
|
192
|
+
sourceText: (_a = entry.sourceText) !== null && _a !== void 0 ? _a : requiredString(undefined, `entries[${index}].sourceText`),
|
|
193
|
+
keyVersionId: (_b = entry.keyVersionId) !== null && _b !== void 0 ? _b : requiredString(undefined, `entries[${index}].keyVersionId`),
|
|
194
|
+
sourceHash: (_c = entry.sourceHash) !== null && _c !== void 0 ? _c : requiredString(undefined, `entries[${index}].sourceHash`),
|
|
195
|
+
contractHash: (_d = entry.contractHash) !== null && _d !== void 0 ? _d : requiredString(undefined, `entries[${index}].contractHash`),
|
|
196
|
+
argumentSignature: (_e = entry.argumentSignature) !== null && _e !== void 0 ? _e : requiredString(undefined, `entries[${index}].argumentSignature`),
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
return { ...parsed, entries };
|
|
200
|
+
}
|
|
201
|
+
export function isConfirmedBuildDeclaration(declaration) {
|
|
202
|
+
var _a, _b;
|
|
203
|
+
return (((_a = declaration.kind) !== null && _a !== void 0 ? _a : 'ui') !== 'content' &&
|
|
204
|
+
((_b = declaration.status) !== null && _b !== void 0 ? _b : 'confirmed') === 'confirmed' &&
|
|
205
|
+
declaration.authoritative !== false);
|
|
206
|
+
}
|
|
207
|
+
export function registerTranslationFormatAdapter(adapter) {
|
|
208
|
+
if (adapters.has(adapter.format)) {
|
|
209
|
+
throw new Error(`Translation format adapter "${adapter.format}" is already registered.`);
|
|
210
|
+
}
|
|
211
|
+
adapters.set(adapter.format, adapter);
|
|
212
|
+
}
|
|
213
|
+
export function getTranslationFormatAdapter(format) {
|
|
214
|
+
return adapters.get(format);
|
|
215
|
+
}
|
|
216
|
+
export function listTranslationFormatAdapters() {
|
|
217
|
+
return [...adapters.values()].sort((left, right) => left.format.localeCompare(right.format));
|
|
218
|
+
}
|
|
219
|
+
/** Test/host reset hook; adapters are registered explicitly by the host. */
|
|
220
|
+
export function clearTranslationFormatAdapters() {
|
|
221
|
+
adapters.clear();
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type TranslationExchangeDocument } from './exchange.js';
|
|
2
|
+
import type { TranslationEntryRecord, TranslationState } from './records.js';
|
|
3
|
+
export interface TranslationExportOptions {
|
|
4
|
+
appId?: string;
|
|
5
|
+
branchId?: string;
|
|
6
|
+
sourceLanguage: string;
|
|
7
|
+
revisionWatermark: string;
|
|
8
|
+
exportedAt?: string;
|
|
9
|
+
languages?: readonly string[];
|
|
10
|
+
namespaces?: readonly string[];
|
|
11
|
+
keys?: readonly string[];
|
|
12
|
+
states?: readonly TranslationState[];
|
|
13
|
+
}
|
|
14
|
+
export interface TranslationExportFinding {
|
|
15
|
+
key: string;
|
|
16
|
+
code: 'content-key-unsupported' | 'missing-current-version';
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TranslationExportResult {
|
|
20
|
+
document: TranslationExchangeDocument;
|
|
21
|
+
documentHash: string;
|
|
22
|
+
findings: TranslationExportFinding[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build one deterministic, version-evidenced exchange snapshot. Content keys
|
|
26
|
+
* and versionless keys are reported rather than silently losing metadata.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createTranslationExchangeDocument(entries: readonly TranslationEntryRecord[], options: TranslationExportOptions): Promise<TranslationExportResult>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { validateTranslationExchangeDocument, } from './exchange.js';
|
|
2
|
+
import { canonicalLanguageTag, sha256Hex } from './key-version.js';
|
|
3
|
+
import { canonicalJson, translationContractSetHash } from './release.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build one deterministic, version-evidenced exchange snapshot. Content keys
|
|
6
|
+
* and versionless keys are reported rather than silently losing metadata.
|
|
7
|
+
*/
|
|
8
|
+
export async function createTranslationExchangeDocument(entries, options) {
|
|
9
|
+
const sourceLanguage = canonicalLanguageTag(options.sourceLanguage);
|
|
10
|
+
const languageFilter = options.languages
|
|
11
|
+
? new Set(options.languages.map(canonicalLanguageTag))
|
|
12
|
+
: undefined;
|
|
13
|
+
const namespaceFilter = options.namespaces
|
|
14
|
+
? new Set(options.namespaces)
|
|
15
|
+
: undefined;
|
|
16
|
+
const keyFilter = options.keys ? new Set(options.keys) : undefined;
|
|
17
|
+
const stateFilter = options.states ? new Set(options.states) : undefined;
|
|
18
|
+
const findings = [];
|
|
19
|
+
const exportEntries = [];
|
|
20
|
+
for (const entry of [...entries].sort((left, right) => `${left.namespace}\u0000${left.key}`.localeCompare(`${right.namespace}\u0000${right.key}`))) {
|
|
21
|
+
if (namespaceFilter && !namespaceFilter.has(entry.namespace))
|
|
22
|
+
continue;
|
|
23
|
+
if (keyFilter && !keyFilter.has(entry.key))
|
|
24
|
+
continue;
|
|
25
|
+
if (entry.kind === 'content') {
|
|
26
|
+
findings.push({
|
|
27
|
+
key: entry.key,
|
|
28
|
+
code: 'content-key-unsupported',
|
|
29
|
+
message: 'Content translations are not part of the UI exchange format.',
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const version = entry.currentVersion;
|
|
34
|
+
if (!version) {
|
|
35
|
+
findings.push({
|
|
36
|
+
key: entry.key,
|
|
37
|
+
code: 'missing-current-version',
|
|
38
|
+
message: 'The key has no current immutable version.',
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const translations = {};
|
|
43
|
+
for (const [rawLanguage, unit] of Object.entries(entry.units).sort(([left], [right]) => left.localeCompare(right))) {
|
|
44
|
+
const language = canonicalLanguageTag(rawLanguage);
|
|
45
|
+
if (language === sourceLanguage)
|
|
46
|
+
continue;
|
|
47
|
+
if (languageFilter && !languageFilter.has(language))
|
|
48
|
+
continue;
|
|
49
|
+
if (stateFilter && !stateFilter.has(unit.state))
|
|
50
|
+
continue;
|
|
51
|
+
translations[language] = {
|
|
52
|
+
text: unit.text,
|
|
53
|
+
state: unit.state,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
exportEntries.push({
|
|
57
|
+
key: entry.key,
|
|
58
|
+
namespace: entry.namespace,
|
|
59
|
+
kind: entry.ofShape || entry.ofProperty || entry.fromPackage
|
|
60
|
+
? 'semantic'
|
|
61
|
+
: 'ui',
|
|
62
|
+
sourceText: version.sourceText,
|
|
63
|
+
keyVersionId: version.id,
|
|
64
|
+
sourceHash: version.sourceHash,
|
|
65
|
+
contractHash: version.contractHash,
|
|
66
|
+
argumentSignature: version.argumentSignature,
|
|
67
|
+
description: entry.description,
|
|
68
|
+
format: version.format,
|
|
69
|
+
translations,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const targetLanguages = [
|
|
73
|
+
...new Set(exportEntries.flatMap((entry) => Object.keys(entry.translations))),
|
|
74
|
+
].sort();
|
|
75
|
+
const document = validateTranslationExchangeDocument({
|
|
76
|
+
schemaVersion: 1,
|
|
77
|
+
appId: options.appId,
|
|
78
|
+
branchId: options.branchId,
|
|
79
|
+
sourceLanguage,
|
|
80
|
+
targetLanguages,
|
|
81
|
+
exportedAt: options.exportedAt,
|
|
82
|
+
revisionWatermark: options.revisionWatermark,
|
|
83
|
+
contractSetHash: await translationContractSetHash(entries.filter((entry) => entry.kind === 'ui')),
|
|
84
|
+
entries: exportEntries,
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
document,
|
|
88
|
+
documentHash: await sha256Hex(canonicalJson(document)),
|
|
89
|
+
findings,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TranslationFormatAdapter } from '../exchange.js';
|
|
2
|
+
/**
|
|
3
|
+
* One row represents one key/language pair. Document and key-version metadata
|
|
4
|
+
* are repeated deliberately so a CSV remains useful after spreadsheet tools
|
|
5
|
+
* reorder or filter its rows.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TRANSLATION_CSV_COLUMNS: readonly ["schemaVersion", "appId", "branchId", "sourceLanguage", "targetLanguage", "key", "namespace", "kind", "sourceText", "targetText", "state", "note", "description", "format", "keyVersionId", "sourceHash", "contractHash", "argumentSignature", "exportedAt", "revisionWatermark", "contractSetHash", "createNowEscaping"];
|
|
8
|
+
export declare const translationCsvAdapter: TranslationFormatAdapter;
|