@_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,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translation import framework (Plan 014 AD-M / Plan 016 P2.1) — the minimal,
|
|
3
|
+
* pluggable core that migrates existing translations INTO the graph. A
|
|
4
|
+
* `TranslationImportSource` yields `(language, key, text)` triples; the shared
|
|
5
|
+
* `runImport` pipeline maps them onto existing `TranslationKey`s and writes
|
|
6
|
+
* `TranslationUnit`s via an injected target — no I/O of its own, so it is pure
|
|
7
|
+
* and unit-testable, and P3 can add XLIFF/CSV/JSON sources behind the same
|
|
8
|
+
* `TranslationImportSource` interface. The Tolgee CDN adapter is v1 (Plan 016
|
|
9
|
+
* D3, Option A: pull the public per-language files, no auth).
|
|
10
|
+
*
|
|
11
|
+
* Design mirrors `key-sync.ts`: transport is injected, the sync is a pure diff.
|
|
12
|
+
*/
|
|
13
|
+
import { type TranslationImportDisposition } from './exchange.js';
|
|
14
|
+
import type { TranslationEntryRecord, TranslationState, TranslationUnitRecord } from './records.js';
|
|
15
|
+
/** How an incoming unit resolves against an existing app unit. */
|
|
16
|
+
export type ImportMergePolicy = 'skip-existing' | 'overwrite' | 'import-as-stale';
|
|
17
|
+
/** One incoming translation from a source, pre-mapping. */
|
|
18
|
+
export interface ParsedUnit {
|
|
19
|
+
language: string;
|
|
20
|
+
key: string;
|
|
21
|
+
text: string;
|
|
22
|
+
}
|
|
23
|
+
/** A migration source (Tolgee CDN now; XLIFF/CSV/JSON later — AD-M). */
|
|
24
|
+
export interface TranslationImportSource {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
/** Fetch + parse every `(language, key, text)` the source carries. */
|
|
27
|
+
load(): Promise<ParsedUnit[]>;
|
|
28
|
+
}
|
|
29
|
+
export interface ImportOptions {
|
|
30
|
+
/** Default `skip-existing` — never clobber an app-authored unit (Plan 016 D4). */
|
|
31
|
+
mergePolicy?: ImportMergePolicy;
|
|
32
|
+
/** The source/canonical language, NOT imported as units (it is `sourceText`). Default `en`. */
|
|
33
|
+
sourceLanguage?: string;
|
|
34
|
+
/** State written for imported units. Default `reviewed` (Plan 016 D3, Option A). */
|
|
35
|
+
importState?: TranslationState;
|
|
36
|
+
/** Report only; write nothing. */
|
|
37
|
+
dryRun?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** Injected persistence — the pipeline stays free of any store/RPC (AD-G). */
|
|
40
|
+
export interface ImportTarget {
|
|
41
|
+
/** Existing keys (with source text + format) this app owns. */
|
|
42
|
+
listKeys(): Promise<Array<{
|
|
43
|
+
key: string;
|
|
44
|
+
sourceText: string;
|
|
45
|
+
format?: string;
|
|
46
|
+
}>>;
|
|
47
|
+
/** Existing `(key, language)` units, for the merge policy. */
|
|
48
|
+
listUnits(): Promise<Array<{
|
|
49
|
+
key: string;
|
|
50
|
+
language: string;
|
|
51
|
+
}>>;
|
|
52
|
+
/** Create/replace one unit. Not called on a dry run. */
|
|
53
|
+
upsertUnit(data: {
|
|
54
|
+
key: string;
|
|
55
|
+
language: string;
|
|
56
|
+
text: string;
|
|
57
|
+
state: TranslationState;
|
|
58
|
+
}): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export interface ImportReport {
|
|
61
|
+
source: string;
|
|
62
|
+
dryRun: boolean;
|
|
63
|
+
languages: string[];
|
|
64
|
+
/** Units created (new). */
|
|
65
|
+
created: number;
|
|
66
|
+
/** Units overwritten (merge policy `overwrite`/`import-as-stale`). */
|
|
67
|
+
updated: number;
|
|
68
|
+
/** Units left alone under `skip-existing`. */
|
|
69
|
+
skippedExisting: number;
|
|
70
|
+
/** Source keys with no matching `TranslationKey` (reported, never created). */
|
|
71
|
+
orphanKeys: string[];
|
|
72
|
+
/** App keys the source has no translation for in any language (→ English fallback). */
|
|
73
|
+
uncoveredKeys: string[];
|
|
74
|
+
/** Source-language values that differ from the app's `sourceText` (drift). */
|
|
75
|
+
sourceMismatches: Array<{
|
|
76
|
+
key: string;
|
|
77
|
+
appSource: string;
|
|
78
|
+
importSource: string;
|
|
79
|
+
}>;
|
|
80
|
+
/** Simple-format keys whose imported text contains ICU plural/select syntax (AD-J/R8). */
|
|
81
|
+
icuFlags: string[];
|
|
82
|
+
perLanguage: Record<string, {
|
|
83
|
+
created: number;
|
|
84
|
+
updated: number;
|
|
85
|
+
skippedExisting: number;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
/** Detect ICU plural/select syntax that a `format:'simple'` key would render literally. */
|
|
89
|
+
export declare function hasIcuSyntax(text: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Run a source through the shared pipeline: map → merge policy → state → lint →
|
|
92
|
+
* report (and commit unless `dryRun`). Source-language values are compared to
|
|
93
|
+
* `sourceText` (drift report) but never written as units — English is the
|
|
94
|
+
* canonical inline default (AD-J/R7).
|
|
95
|
+
*/
|
|
96
|
+
export declare function runImport(target: ImportTarget, source: TranslationImportSource, options?: ImportOptions): Promise<ImportReport>;
|
|
97
|
+
/** Flatten nested JSON (Tolgee's CDN shape) into dot-joined leaf keys. */
|
|
98
|
+
export declare function flattenMessages(obj: unknown, prefix?: string, out?: Record<string, string>): Record<string, string>;
|
|
99
|
+
/**
|
|
100
|
+
* Tolgee CDN import source (Plan 016 D3, Option A). Pulls the public per-language
|
|
101
|
+
* JSON files (no auth) and flattens Tolgee's nested structure to dot-keys that
|
|
102
|
+
* match serve's `t('a.b.c')` keys. A language whose file is missing/unfetchable
|
|
103
|
+
* is skipped (it simply contributes no units). `fetchImpl` is injectable for tests.
|
|
104
|
+
*/
|
|
105
|
+
export declare function tolgeeCdnSource(config: {
|
|
106
|
+
baseUrl: string;
|
|
107
|
+
languages: string[];
|
|
108
|
+
fetchImpl?: typeof fetch;
|
|
109
|
+
}): TranslationImportSource;
|
|
110
|
+
/**
|
|
111
|
+
* Immutable, version-aware decision produced before any persistence is
|
|
112
|
+
* attempted. Hosts may render these directly in an import dry-run.
|
|
113
|
+
*/
|
|
114
|
+
export interface VersionedImportDecision {
|
|
115
|
+
readonly key: string;
|
|
116
|
+
readonly importedKey: string;
|
|
117
|
+
readonly language: string;
|
|
118
|
+
readonly text: string;
|
|
119
|
+
readonly state: TranslationState;
|
|
120
|
+
readonly disposition: TranslationImportDisposition;
|
|
121
|
+
readonly reason: 'exact-current-version' | 'compatible-source-change' | 'incompatible-contract' | 'missing-version-evidence' | 'manager-bound-unverified' | 'orphan-key' | 'source-language' | 'existing-unit';
|
|
122
|
+
readonly expectedKeyVersionId?: string;
|
|
123
|
+
readonly expectedUnitContentHash?: string;
|
|
124
|
+
readonly basedOnText?: string;
|
|
125
|
+
readonly note?: string;
|
|
126
|
+
readonly importedContentHash: string;
|
|
127
|
+
readonly idempotencyKey: string;
|
|
128
|
+
}
|
|
129
|
+
export interface VersionedImportPlan {
|
|
130
|
+
readonly sessionId: string;
|
|
131
|
+
readonly documentHash: string;
|
|
132
|
+
readonly revisionWatermark: string;
|
|
133
|
+
readonly decisions: readonly VersionedImportDecision[];
|
|
134
|
+
}
|
|
135
|
+
export interface VersionedImportPlanOptions {
|
|
136
|
+
sessionId: string;
|
|
137
|
+
revisionWatermark: string;
|
|
138
|
+
mergePolicy?: ImportMergePolicy;
|
|
139
|
+
importState?: TranslationState;
|
|
140
|
+
/**
|
|
141
|
+
* Explicit manager-approved foreign-key mapping. A mapped value remains a
|
|
142
|
+
* suggestion because the foreign file carries no trustworthy version proof.
|
|
143
|
+
*/
|
|
144
|
+
managerBindings?: Readonly<Record<string, string>>;
|
|
145
|
+
}
|
|
146
|
+
export interface VersionedImportCurrentState {
|
|
147
|
+
key: string;
|
|
148
|
+
language: string;
|
|
149
|
+
keyVersionId?: string;
|
|
150
|
+
unitContentHash?: string;
|
|
151
|
+
}
|
|
152
|
+
export interface VersionedImportTarget {
|
|
153
|
+
readCurrentState(requested: ReadonlyArray<{
|
|
154
|
+
key: string;
|
|
155
|
+
language: string;
|
|
156
|
+
}>): Promise<VersionedImportCurrentState[]>;
|
|
157
|
+
upsertUnit(data: {
|
|
158
|
+
key: string;
|
|
159
|
+
language: string;
|
|
160
|
+
text: string;
|
|
161
|
+
state: TranslationState;
|
|
162
|
+
keyVersionId: string;
|
|
163
|
+
source: 'import';
|
|
164
|
+
idempotencyKey: string;
|
|
165
|
+
}): Promise<void>;
|
|
166
|
+
createSuggestion(data: {
|
|
167
|
+
key: string;
|
|
168
|
+
language: string;
|
|
169
|
+
text: string;
|
|
170
|
+
keyVersionId: string;
|
|
171
|
+
basedOnText: string;
|
|
172
|
+
source: 'import' | 'carry-forward';
|
|
173
|
+
note?: string;
|
|
174
|
+
idempotencyKey: string;
|
|
175
|
+
}): Promise<void>;
|
|
176
|
+
}
|
|
177
|
+
export interface VersionedImportCommitReport {
|
|
178
|
+
status: 'committed' | 'requires-redry-run';
|
|
179
|
+
imported: number;
|
|
180
|
+
suggested: number;
|
|
181
|
+
skipped: number;
|
|
182
|
+
completedIdempotencyKeys: string[];
|
|
183
|
+
}
|
|
184
|
+
/** Stable compare-and-set value for a current translation unit. */
|
|
185
|
+
export declare function translationUnitContentHash(unit: Pick<TranslationUnitRecord, 'keyVersionId' | 'language' | 'text' | 'state'>): Promise<string>;
|
|
186
|
+
/**
|
|
187
|
+
* Normalize and classify the complete document before any import write. Merge
|
|
188
|
+
* policy is intentionally applied only after version compatibility succeeds.
|
|
189
|
+
*/
|
|
190
|
+
export declare function planVersionedImport(value: unknown, currentEntries: readonly TranslationEntryRecord[], options: VersionedImportPlanOptions): Promise<VersionedImportPlan>;
|
|
191
|
+
/**
|
|
192
|
+
* Compare-and-set commit. The entire requested batch is re-read and validated
|
|
193
|
+
* before its first write, so stale dry-runs cannot partially mutate the batch.
|
|
194
|
+
*/
|
|
195
|
+
export declare function commitVersionedImport(plan: VersionedImportPlan, target: VersionedImportTarget, options?: {
|
|
196
|
+
completedIdempotencyKeys?: ReadonlySet<string>;
|
|
197
|
+
}): Promise<VersionedImportCommitReport>;
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translation import framework (Plan 014 AD-M / Plan 016 P2.1) — the minimal,
|
|
3
|
+
* pluggable core that migrates existing translations INTO the graph. A
|
|
4
|
+
* `TranslationImportSource` yields `(language, key, text)` triples; the shared
|
|
5
|
+
* `runImport` pipeline maps them onto existing `TranslationKey`s and writes
|
|
6
|
+
* `TranslationUnit`s via an injected target — no I/O of its own, so it is pure
|
|
7
|
+
* and unit-testable, and P3 can add XLIFF/CSV/JSON sources behind the same
|
|
8
|
+
* `TranslationImportSource` interface. The Tolgee CDN adapter is v1 (Plan 016
|
|
9
|
+
* D3, Option A: pull the public per-language files, no auth).
|
|
10
|
+
*
|
|
11
|
+
* Design mirrors `key-sync.ts`: transport is injected, the sync is a pure diff.
|
|
12
|
+
*/
|
|
13
|
+
import { normalizeParsedTranslationExchangeDocument, } from './exchange.js';
|
|
14
|
+
import { canonicalLanguageTag, sha256Hex } from './key-version.js';
|
|
15
|
+
import { canonicalJson } from './release.js';
|
|
16
|
+
/** Detect ICU plural/select syntax that a `format:'simple'` key would render literally. */
|
|
17
|
+
export function hasIcuSyntax(text) {
|
|
18
|
+
return /\{[^{}]*,\s*(plural|select|selectordinal)\s*,/.test(text);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run a source through the shared pipeline: map → merge policy → state → lint →
|
|
22
|
+
* report (and commit unless `dryRun`). Source-language values are compared to
|
|
23
|
+
* `sourceText` (drift report) but never written as units — English is the
|
|
24
|
+
* canonical inline default (AD-J/R7).
|
|
25
|
+
*/
|
|
26
|
+
export async function runImport(target, source, options = {}) {
|
|
27
|
+
var _a, _b, _c, _d;
|
|
28
|
+
const mergePolicy = (_a = options.mergePolicy) !== null && _a !== void 0 ? _a : 'skip-existing';
|
|
29
|
+
const sourceLanguage = (_b = options.sourceLanguage) !== null && _b !== void 0 ? _b : 'en';
|
|
30
|
+
const importState = (_c = options.importState) !== null && _c !== void 0 ? _c : 'reviewed';
|
|
31
|
+
const dryRun = (_d = options.dryRun) !== null && _d !== void 0 ? _d : false;
|
|
32
|
+
const [parsed, keyRows, unitRows] = await Promise.all([
|
|
33
|
+
source.load(),
|
|
34
|
+
target.listKeys(),
|
|
35
|
+
target.listUnits(),
|
|
36
|
+
]);
|
|
37
|
+
const sourceText = new Map(keyRows.map((k) => [k.key, k.sourceText]));
|
|
38
|
+
const formatOf = new Map(keyRows.map((k) => { var _a; return [k.key, (_a = k.format) !== null && _a !== void 0 ? _a : 'simple']; }));
|
|
39
|
+
const existingUnit = new Set(unitRows.map((u) => `${u.key}\u0000${u.language}`));
|
|
40
|
+
const report = {
|
|
41
|
+
source: source.name,
|
|
42
|
+
dryRun,
|
|
43
|
+
languages: [],
|
|
44
|
+
created: 0,
|
|
45
|
+
updated: 0,
|
|
46
|
+
skippedExisting: 0,
|
|
47
|
+
orphanKeys: [],
|
|
48
|
+
uncoveredKeys: [],
|
|
49
|
+
sourceMismatches: [],
|
|
50
|
+
icuFlags: [],
|
|
51
|
+
perLanguage: {},
|
|
52
|
+
};
|
|
53
|
+
const languages = new Set();
|
|
54
|
+
const orphans = new Set();
|
|
55
|
+
const icuFlags = new Set();
|
|
56
|
+
const coveredAppKeys = new Set();
|
|
57
|
+
const per = (lang) => { var _a; var _b; return ((_a = (_b = report.perLanguage)[lang]) !== null && _a !== void 0 ? _a : (_b[lang] = { created: 0, updated: 0, skippedExisting: 0 })); };
|
|
58
|
+
for (const unit of parsed) {
|
|
59
|
+
if (!(unit === null || unit === void 0 ? void 0 : unit.key) || !unit.language)
|
|
60
|
+
continue;
|
|
61
|
+
languages.add(unit.language);
|
|
62
|
+
// Source language: drift-check against sourceText, but never import as units.
|
|
63
|
+
if (unit.language === sourceLanguage) {
|
|
64
|
+
if (sourceText.has(unit.key)) {
|
|
65
|
+
coveredAppKeys.add(unit.key);
|
|
66
|
+
const app = sourceText.get(unit.key);
|
|
67
|
+
if (app !== unit.text) {
|
|
68
|
+
report.sourceMismatches.push({
|
|
69
|
+
key: unit.key,
|
|
70
|
+
appSource: app,
|
|
71
|
+
importSource: unit.text,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!sourceText.has(unit.key)) {
|
|
78
|
+
orphans.add(unit.key);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
coveredAppKeys.add(unit.key);
|
|
82
|
+
if (formatOf.get(unit.key) === 'simple' && hasIcuSyntax(unit.text)) {
|
|
83
|
+
icuFlags.add(unit.key);
|
|
84
|
+
}
|
|
85
|
+
const exists = existingUnit.has(`${unit.key}\u0000${unit.language}`);
|
|
86
|
+
if (exists && mergePolicy === 'skip-existing') {
|
|
87
|
+
report.skippedExisting++;
|
|
88
|
+
per(unit.language).skippedExisting++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const state = mergePolicy === 'import-as-stale' ? 'stale' : importState;
|
|
92
|
+
if (!dryRun) {
|
|
93
|
+
await target.upsertUnit({
|
|
94
|
+
key: unit.key,
|
|
95
|
+
language: unit.language,
|
|
96
|
+
text: unit.text,
|
|
97
|
+
state,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (exists) {
|
|
101
|
+
report.updated++;
|
|
102
|
+
per(unit.language).updated++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
report.created++;
|
|
106
|
+
per(unit.language).created++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
report.languages = [...languages].sort();
|
|
110
|
+
report.orphanKeys = [...orphans].sort();
|
|
111
|
+
report.icuFlags = [...icuFlags].sort();
|
|
112
|
+
report.uncoveredKeys = keyRows
|
|
113
|
+
.map((k) => k.key)
|
|
114
|
+
.filter((k) => !coveredAppKeys.has(k))
|
|
115
|
+
.sort();
|
|
116
|
+
return report;
|
|
117
|
+
}
|
|
118
|
+
/** Flatten nested JSON (Tolgee's CDN shape) into dot-joined leaf keys. */
|
|
119
|
+
export function flattenMessages(obj, prefix = '', out = {}) {
|
|
120
|
+
if (!obj || typeof obj !== 'object')
|
|
121
|
+
return out;
|
|
122
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
123
|
+
const key = prefix ? `${prefix}.${k}` : k;
|
|
124
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
125
|
+
flattenMessages(v, key, out);
|
|
126
|
+
}
|
|
127
|
+
else if (typeof v === 'string') {
|
|
128
|
+
out[key] = v;
|
|
129
|
+
}
|
|
130
|
+
else if (v != null) {
|
|
131
|
+
out[key] = String(v);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Tolgee CDN import source (Plan 016 D3, Option A). Pulls the public per-language
|
|
138
|
+
* JSON files (no auth) and flattens Tolgee's nested structure to dot-keys that
|
|
139
|
+
* match serve's `t('a.b.c')` keys. A language whose file is missing/unfetchable
|
|
140
|
+
* is skipped (it simply contributes no units). `fetchImpl` is injectable for tests.
|
|
141
|
+
*/
|
|
142
|
+
export function tolgeeCdnSource(config) {
|
|
143
|
+
var _a;
|
|
144
|
+
const base = config.baseUrl.replace(/\/+$/, '');
|
|
145
|
+
const doFetch = (_a = config.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
|
|
146
|
+
return {
|
|
147
|
+
name: `tolgee-cdn(${base})`,
|
|
148
|
+
async load() {
|
|
149
|
+
const units = [];
|
|
150
|
+
for (const language of config.languages) {
|
|
151
|
+
let json;
|
|
152
|
+
try {
|
|
153
|
+
const res = await doFetch(`${base}/${language}.json`);
|
|
154
|
+
if (!res.ok)
|
|
155
|
+
continue;
|
|
156
|
+
json = await res.json();
|
|
157
|
+
}
|
|
158
|
+
catch (_a) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
for (const [key, text] of Object.entries(flattenMessages(json))) {
|
|
162
|
+
units.push({ language, key, text });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return units;
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/** Stable compare-and-set value for a current translation unit. */
|
|
170
|
+
export async function translationUnitContentHash(unit) {
|
|
171
|
+
var _a;
|
|
172
|
+
return sha256Hex(canonicalJson([
|
|
173
|
+
(_a = unit.keyVersionId) !== null && _a !== void 0 ? _a : null,
|
|
174
|
+
canonicalLanguageTag(unit.language),
|
|
175
|
+
unit.text,
|
|
176
|
+
unit.state,
|
|
177
|
+
]));
|
|
178
|
+
}
|
|
179
|
+
function entryIdentity(entry) {
|
|
180
|
+
var _a;
|
|
181
|
+
return `${(_a = entry.namespace) !== null && _a !== void 0 ? _a : ''}\u0000${entry.key}`;
|
|
182
|
+
}
|
|
183
|
+
function parsedIdentity(entry) {
|
|
184
|
+
var _a;
|
|
185
|
+
return `${(_a = entry.namespace) !== null && _a !== void 0 ? _a : ''}\u0000${entry.key}`;
|
|
186
|
+
}
|
|
187
|
+
async function makeVersionedDecision(input) {
|
|
188
|
+
var _a, _b, _c;
|
|
189
|
+
const { importedEntry, importedKey, language, text, state, note, current, sessionId, mergePolicy, managerBound, } = input;
|
|
190
|
+
const version = current === null || current === void 0 ? void 0 : current.currentVersion;
|
|
191
|
+
const existing = current === null || current === void 0 ? void 0 : current.units[language];
|
|
192
|
+
const expectedUnitContentHash = existing
|
|
193
|
+
? await translationUnitContentHash(existing)
|
|
194
|
+
: undefined;
|
|
195
|
+
const importedContentHash = await sha256Hex(canonicalJson([(_a = importedEntry.keyVersionId) !== null && _a !== void 0 ? _a : null, language, text, state]));
|
|
196
|
+
const key = (_b = current === null || current === void 0 ? void 0 : current.key) !== null && _b !== void 0 ? _b : importedKey;
|
|
197
|
+
const idempotencyKey = await sha256Hex(canonicalJson([
|
|
198
|
+
sessionId,
|
|
199
|
+
(_c = version === null || version === void 0 ? void 0 : version.id) !== null && _c !== void 0 ? _c : 'unverified',
|
|
200
|
+
language,
|
|
201
|
+
importedContentHash,
|
|
202
|
+
]));
|
|
203
|
+
const base = {
|
|
204
|
+
key,
|
|
205
|
+
importedKey,
|
|
206
|
+
language,
|
|
207
|
+
text,
|
|
208
|
+
state,
|
|
209
|
+
expectedKeyVersionId: version === null || version === void 0 ? void 0 : version.id,
|
|
210
|
+
expectedUnitContentHash,
|
|
211
|
+
note,
|
|
212
|
+
importedContentHash,
|
|
213
|
+
idempotencyKey,
|
|
214
|
+
};
|
|
215
|
+
if (!current || !version) {
|
|
216
|
+
return { ...base, disposition: 'conflict', reason: 'orphan-key' };
|
|
217
|
+
}
|
|
218
|
+
const hasEvidence = Boolean(importedEntry.keyVersionId &&
|
|
219
|
+
importedEntry.sourceHash &&
|
|
220
|
+
importedEntry.contractHash &&
|
|
221
|
+
importedEntry.argumentSignature !== undefined &&
|
|
222
|
+
importedEntry.sourceText !== undefined);
|
|
223
|
+
if (!hasEvidence) {
|
|
224
|
+
if (managerBound) {
|
|
225
|
+
return {
|
|
226
|
+
...base,
|
|
227
|
+
disposition: 'unverified-source',
|
|
228
|
+
reason: 'manager-bound-unverified',
|
|
229
|
+
basedOnText: version.sourceText,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
...base,
|
|
234
|
+
disposition: 'unverified-source',
|
|
235
|
+
reason: 'missing-version-evidence',
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (importedEntry.contractHash !== version.contractHash ||
|
|
239
|
+
importedEntry.argumentSignature !== version.argumentSignature ||
|
|
240
|
+
importedEntry.format !== version.format) {
|
|
241
|
+
return {
|
|
242
|
+
...base,
|
|
243
|
+
disposition: 'conflict',
|
|
244
|
+
reason: 'incompatible-contract',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
const exactVersion = importedEntry.keyVersionId === version.id &&
|
|
248
|
+
importedEntry.sourceHash === version.sourceHash &&
|
|
249
|
+
importedEntry.sourceText === version.sourceText;
|
|
250
|
+
if (!exactVersion) {
|
|
251
|
+
return {
|
|
252
|
+
...base,
|
|
253
|
+
disposition: 'carry-forward',
|
|
254
|
+
reason: 'compatible-source-change',
|
|
255
|
+
basedOnText: version.sourceText,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
if (existing && mergePolicy === 'skip-existing') {
|
|
259
|
+
return { ...base, disposition: 'skip', reason: 'existing-unit' };
|
|
260
|
+
}
|
|
261
|
+
return { ...base, disposition: 'import', reason: 'exact-current-version' };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Normalize and classify the complete document before any import write. Merge
|
|
265
|
+
* policy is intentionally applied only after version compatibility succeeds.
|
|
266
|
+
*/
|
|
267
|
+
export async function planVersionedImport(value, currentEntries, options) {
|
|
268
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
269
|
+
const document = normalizeParsedTranslationExchangeDocument(value);
|
|
270
|
+
const mergePolicy = (_a = options.mergePolicy) !== null && _a !== void 0 ? _a : 'skip-existing';
|
|
271
|
+
const defaultState = (_b = options.importState) !== null && _b !== void 0 ? _b : 'reviewed';
|
|
272
|
+
const byIdentity = new Map(currentEntries.map((entry) => [entryIdentity(entry), entry]));
|
|
273
|
+
const byKey = new Map(currentEntries.map((entry) => [entry.key, entry]));
|
|
274
|
+
const decisions = [];
|
|
275
|
+
for (const importedEntry of [...document.entries].sort((left, right) => parsedIdentity(left).localeCompare(parsedIdentity(right)))) {
|
|
276
|
+
const boundKey = (_c = options.managerBindings) === null || _c === void 0 ? void 0 : _c[importedEntry.key];
|
|
277
|
+
const current = (_d = (boundKey ? byKey.get(boundKey) : undefined)) !== null && _d !== void 0 ? _d : byIdentity.get(parsedIdentity(importedEntry));
|
|
278
|
+
for (const [rawLanguage, value] of Object.entries(importedEntry.translations).sort(([left], [right]) => left.localeCompare(right))) {
|
|
279
|
+
const language = canonicalLanguageTag(rawLanguage);
|
|
280
|
+
if (language === document.sourceLanguage) {
|
|
281
|
+
const importedContentHash = await sha256Hex(canonicalJson([(_e = importedEntry.keyVersionId) !== null && _e !== void 0 ? _e : null, language, value.text]));
|
|
282
|
+
decisions.push({
|
|
283
|
+
key: (_f = current === null || current === void 0 ? void 0 : current.key) !== null && _f !== void 0 ? _f : importedEntry.key,
|
|
284
|
+
importedKey: importedEntry.key,
|
|
285
|
+
language,
|
|
286
|
+
text: value.text,
|
|
287
|
+
state: (_g = value.state) !== null && _g !== void 0 ? _g : defaultState,
|
|
288
|
+
disposition: 'skip',
|
|
289
|
+
reason: 'source-language',
|
|
290
|
+
expectedKeyVersionId: (_h = current === null || current === void 0 ? void 0 : current.currentVersion) === null || _h === void 0 ? void 0 : _h.id,
|
|
291
|
+
importedContentHash,
|
|
292
|
+
idempotencyKey: await sha256Hex(canonicalJson([options.sessionId, 'source-language', language, importedContentHash])),
|
|
293
|
+
});
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const state = mergePolicy === 'import-as-stale'
|
|
297
|
+
? 'stale'
|
|
298
|
+
: ((_j = value.state) !== null && _j !== void 0 ? _j : defaultState);
|
|
299
|
+
decisions.push(await makeVersionedDecision({
|
|
300
|
+
importedEntry,
|
|
301
|
+
importedKey: importedEntry.key,
|
|
302
|
+
language,
|
|
303
|
+
text: value.text,
|
|
304
|
+
state,
|
|
305
|
+
note: value.note,
|
|
306
|
+
current,
|
|
307
|
+
sessionId: options.sessionId,
|
|
308
|
+
mergePolicy,
|
|
309
|
+
managerBound: Boolean(boundKey),
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return Object.freeze({
|
|
314
|
+
sessionId: options.sessionId,
|
|
315
|
+
documentHash: await sha256Hex(canonicalJson(document)),
|
|
316
|
+
revisionWatermark: options.revisionWatermark,
|
|
317
|
+
decisions: Object.freeze(decisions.map((decision) => Object.freeze(decision))),
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Compare-and-set commit. The entire requested batch is re-read and validated
|
|
322
|
+
* before its first write, so stale dry-runs cannot partially mutate the batch.
|
|
323
|
+
*/
|
|
324
|
+
export async function commitVersionedImport(plan, target, options = {}) {
|
|
325
|
+
var _a, _b;
|
|
326
|
+
const completed = (_a = options.completedIdempotencyKeys) !== null && _a !== void 0 ? _a : new Set();
|
|
327
|
+
const actionable = plan.decisions.filter((decision) => !completed.has(decision.idempotencyKey) &&
|
|
328
|
+
(decision.disposition === 'import' ||
|
|
329
|
+
decision.disposition === 'carry-forward' ||
|
|
330
|
+
(decision.disposition === 'unverified-source' &&
|
|
331
|
+
decision.reason === 'manager-bound-unverified')));
|
|
332
|
+
const current = await target.readCurrentState(actionable.map(({ key, language }) => ({ key, language })));
|
|
333
|
+
const currentByIdentity = new Map(current.map((item) => [`${item.key}\u0000${item.language}`, item]));
|
|
334
|
+
const drifted = actionable.some((decision) => {
|
|
335
|
+
const actual = currentByIdentity.get(`${decision.key}\u0000${decision.language}`);
|
|
336
|
+
return ((actual === null || actual === void 0 ? void 0 : actual.keyVersionId) !== decision.expectedKeyVersionId ||
|
|
337
|
+
(actual === null || actual === void 0 ? void 0 : actual.unitContentHash) !== decision.expectedUnitContentHash);
|
|
338
|
+
});
|
|
339
|
+
if (drifted) {
|
|
340
|
+
return {
|
|
341
|
+
status: 'requires-redry-run',
|
|
342
|
+
imported: 0,
|
|
343
|
+
suggested: 0,
|
|
344
|
+
skipped: plan.decisions.length,
|
|
345
|
+
completedIdempotencyKeys: [...completed],
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
let imported = 0;
|
|
349
|
+
let suggested = 0;
|
|
350
|
+
const completedKeys = [...completed];
|
|
351
|
+
for (const decision of actionable) {
|
|
352
|
+
if (!decision.expectedKeyVersionId)
|
|
353
|
+
continue;
|
|
354
|
+
if (decision.disposition === 'import') {
|
|
355
|
+
await target.upsertUnit({
|
|
356
|
+
key: decision.key,
|
|
357
|
+
language: decision.language,
|
|
358
|
+
text: decision.text,
|
|
359
|
+
state: decision.state,
|
|
360
|
+
keyVersionId: decision.expectedKeyVersionId,
|
|
361
|
+
source: 'import',
|
|
362
|
+
idempotencyKey: decision.idempotencyKey,
|
|
363
|
+
});
|
|
364
|
+
imported++;
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
await target.createSuggestion({
|
|
368
|
+
key: decision.key,
|
|
369
|
+
language: decision.language,
|
|
370
|
+
text: decision.text,
|
|
371
|
+
keyVersionId: decision.expectedKeyVersionId,
|
|
372
|
+
basedOnText: (_b = decision.basedOnText) !== null && _b !== void 0 ? _b : '',
|
|
373
|
+
source: decision.disposition === 'carry-forward'
|
|
374
|
+
? 'carry-forward'
|
|
375
|
+
: 'import',
|
|
376
|
+
note: decision.note,
|
|
377
|
+
idempotencyKey: decision.idempotencyKey,
|
|
378
|
+
});
|
|
379
|
+
suggested++;
|
|
380
|
+
}
|
|
381
|
+
completedKeys.push(decision.idempotencyKey);
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
status: 'committed',
|
|
385
|
+
imported,
|
|
386
|
+
suggested,
|
|
387
|
+
skipped: plan.decisions.length - actionable.length,
|
|
388
|
+
completedIdempotencyKeys: completedKeys,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import './ontologies/translation.js';
|
|
2
|
+
import './shapes/TranslationKey.js';
|
|
3
|
+
import './shapes/TranslationKeyVersion.js';
|
|
4
|
+
import './shapes/TranslationRelease.js';
|
|
5
|
+
import './shapes/TranslationUnit.js';
|
|
6
|
+
import './shapes/TranslationRevision.js';
|
|
7
|
+
import './shapes/GlossaryTerm.js';
|
|
8
|
+
import './shapes/TranslationInventoryOrigin.js';
|
|
9
|
+
export { canAuthorTranslation, configureTranslationAuthorization, } from './authorization.js';
|
|
10
|
+
export type { TranslationAuthoringAction, TranslationAuthorizationRequest, TranslationAuthorizationResolver, } from './authorization.js';
|
|
11
|
+
export { TranslationKey } from './shapes/TranslationKey.js';
|
|
12
|
+
export { TranslationKeyVersion } from './shapes/TranslationKeyVersion.js';
|
|
13
|
+
export { TranslationRelease } from './shapes/TranslationRelease.js';
|
|
14
|
+
export { TranslationUnit } from './shapes/TranslationUnit.js';
|
|
15
|
+
export { TranslationRevision } from './shapes/TranslationRevision.js';
|
|
16
|
+
export { GlossaryTerm } from './shapes/GlossaryTerm.js';
|
|
17
|
+
export { TranslationInventoryOrigin } from './shapes/TranslationInventoryOrigin.js';
|
|
18
|
+
export { tr } from './ontologies/translation.js';
|
|
19
|
+
export { canonicalLanguageTag, classifyKeyVersion, createArgumentSignature, createMonotonicVersionId, deriveBackfillKeyVersion, deriveTranslationKeyVersionContract, sha256Hex, } from './key-version.js';
|
|
20
|
+
export type { DerivedBackfillKeyVersion, ExtractedTranslationKeyContract, KeyVersionDecision, TranslationKeyVersionContract, TranslationKeyVersionLike, } from './key-version.js';
|
|
21
|
+
export { defineShapeTranslationCatalog, installShapeTranslationCatalog, shapeCatalogTranslationDiscoverySource, } from './shape-catalog.js';
|
|
22
|
+
export type { ShapeTranslationCatalog, ShapeTranslationCatalogEntry, ShapeTranslationCatalogTarget, ShapeTranslationInstallReport, } from './shape-catalog.js';
|
|
23
|
+
export { discoverTranslationInventory, manifestTranslationDiscoverySource, parseTranslationDiscoveryManifest, translationBuildDeclarationsFromInventory, translationDeclarationIdentity, } from './discovery.js';
|
|
24
|
+
export type { DiscoverTranslationInventoryOptions, TranslationDeclaration, TranslationDeclarationProvenance, TranslationDeclarationSource, TranslationDiscoveryContext, TranslationDiscoveryManifest, TranslationDiscoveryManifestEntry, TranslationDiscoverySource, TranslationInventoryConflict, TranslationInventoryItem, TranslationInventorySnapshot, TranslationInventoryStatus, } from './discovery.js';
|
|
25
|
+
export { linkedPackageTranslationDiscoverySource, parseLinkedPackageTranslationCatalog, } from './linked-discovery.js';
|
|
26
|
+
export type { LinkedComponentTranslationCatalog, LinkedContentTranslationCatalogEntry, LinkedPackageTranslationCatalog, LinkedSemanticCatalogEntry, LinkedSemanticEntryType, } from './linked-discovery.js';
|
|
27
|
+
export { clearTranslationFormatAdapters, getTranslationFormatAdapter, isConfirmedBuildDeclaration, listTranslationFormatAdapters, normalizeParsedTranslationExchangeDocument, registerTranslationFormatAdapter, validateTranslationExchangeDocument, } from './exchange.js';
|
|
28
|
+
export type { ParsedTranslationExchangeDocument, ParsedTranslationExchangeEntry, SerializedTranslationDocument, TranslationBuildDeclaration, TranslationDeclarationKind, TranslationDeclarationStatus, TranslationExchangeDocument, TranslationExchangeEntry, TranslationExchangeKind, TranslationExchangeValue, TranslationFormat, TranslationFormatAdapter, TranslationImportDisposition, TranslationImportDryRun, TranslationImportDryRunEntry, } from './exchange.js';
|
|
29
|
+
export { commitVersionedImport, flattenMessages, hasIcuSyntax, planVersionedImport, runImport, tolgeeCdnSource, translationUnitContentHash, } from './import.js';
|
|
30
|
+
export type { ImportMergePolicy, ImportOptions, ImportReport, ImportTarget, ParsedUnit, TranslationImportSource, VersionedImportCommitReport, VersionedImportCurrentState, VersionedImportDecision, VersionedImportPlan, VersionedImportPlanOptions, VersionedImportTarget, } from './import.js';
|
|
31
|
+
export { createTranslationExchangeDocument } from './export.js';
|
|
32
|
+
export type { TranslationExportFinding, TranslationExportOptions, TranslationExportResult, } from './export.js';
|
|
33
|
+
export { translationCsvAdapter } from './formats/csv.js';
|
|
34
|
+
export { xliff12Adapter, xliff20Adapter } from './formats/xliff.js';
|
|
35
|
+
export type { XliffFinding, XliffParseOptions } from './formats/xliff.js';
|
|
36
|
+
export { DEFAULT_TRANSLATION_JSON_ARCHIVE_LIMITS, i18nextJsonFormatAdapter, parseI18nextJson, serializeI18nextJsonZip, } from './formats/json.js';
|
|
37
|
+
export type { I18nextJsonLayout, TranslationJsonArchiveLimits, TranslationJsonParseOptions, TranslationJsonSerializeOptions, } from './formats/json.js';
|
|
38
|
+
export { DEFAULT_TRANSLATION_ARCHIVE_LIMITS, createTranslationArchive, parseTranslationArchive, planTranslationArchiveRestore, TRANSLATION_ARCHIVE_COLLECTIONS, TRANSLATION_ARCHIVE_EXCLUSIONS, TRANSLATION_ARCHIVE_MANIFEST_PATH, } from './archive.js';
|
|
39
|
+
export type { ParsedTranslationArchive, PlanTranslationArchiveRestoreOptions, SerializedTranslationArchive, TranslationArchiveCollection, TranslationArchiveContentMapping, TranslationArchiveEntity, TranslationArchiveEntityInput, TranslationArchiveFileInventory, TranslationArchiveJson, TranslationArchiveManifest, TranslationArchiveObjectInput, TranslationArchiveObjectInventory, TranslationArchiveRestoreDecision, TranslationArchiveRestorePlan, TranslationArchiveSnapshot, TranslationArchiveTargetRecord, } from './archive.js';
|
|
40
|
+
export type { GlossaryTermRecord, TranslationEntryRecord, TranslationRevisionRecord, TranslationRevisionStatus, TranslationMemoryMatchKind, TranslationMemoryMatchRecord, TranslationMemoryPretranslateCandidate, TranslationMemoryPretranslateReport, TranslationMemoryRecord, TranslationProposalDecision, TranslationReleaseChannel, TranslationReleaseRecord, TranslationReleaseStatus, TranslationState, TranslationKeyVersionRecord, TranslationUnitRecord, } from './records.js';
|
|
41
|
+
export { TranslationLanguage } from './shapes/TranslationLanguage.js';
|
|
42
|
+
export * from './languages.js';
|