@_linked/translation 0.4.5 → 0.5.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 CHANGED
@@ -93,8 +93,10 @@ are deliberately not part of this package. They live in Create Now's
93
93
  `translation-studio` feature so applications can use this runtime without
94
94
  depending on Create Now.
95
95
 
96
- The package targets `@_linked/core` 2.14.4 and uses the permanent identifier
97
- namespace `https://id.linked.cm/translation/`.
96
+ The package targets `@_linked/core` 2.14.4. Its ontology terms live at
97
+ `https://linked.cm/ont/translation/` (prefix `translation:`), following the
98
+ first-party rule `https://linked.cm/ont/{ontologySlug}/{localName}`. Shape IRIs
99
+ are built from the package `baseUri`, `https://id.linked.cm/translation/`.
98
100
 
99
101
  ## Open language configuration
100
102
 
@@ -2,7 +2,7 @@ import { type TranslationLanguageDefinition } from './languages.js';
2
2
  /**
3
3
  * `loadMessages` factory for the CDN delivery cascade (Plan 016 P2.4, AD-J/AD-K).
4
4
  * SIMPLE-POINTER mode (the ratified default): fetch `${base}/{lang}.json` from
5
- * the published CDN — changing `base` (an app's `tr:cdnTarget`) repoints at
5
+ * the published CDN — changing `base` (an app's `translation:cdnTarget`) repoints at
6
6
  * different cloud files with no call-site change, exactly the Tolgee model.
7
7
  * `bundledPath` (same-origin bundled copy) and `devApi` (e.g. the `getMessages`
8
8
  * RPC for live dev editing) are optional fallbacks, tried in the order given.
@@ -1 +1 @@
1
- {"version":3,"file":"cdn-loader.js","sourceRoot":"","sources":["../../src/cdn-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineLanguage,\n validateLanguageDefinitions,\n type TranslationLanguageDefinition,\n} from './languages.js';\n/**\n * `loadMessages` factory for the CDN delivery cascade (Plan 016 P2.4, AD-J/AD-K).\n * SIMPLE-POINTER mode (the ratified default): fetch `${base}/{lang}.json` from\n * the published CDN — changing `base` (an app's `tr:cdnTarget`) repoints at\n * different cloud files with no call-site change, exactly the Tolgee model.\n * `bundledPath` (same-origin bundled copy) and `devApi` (e.g. the `getMessages`\n * RPC for live dev editing) are optional fallbacks, tried in the order given.\n * Any source that yields a non-empty map wins; all-empty ⇒ `{}` and the client\n * keeps its inline English defaults. Never throws.\n *\n * Portable (no CN import): the caller wires `base`/`devApi` for its environment.\n */\nimport type { TranslationMessages } from './core/messages.js';\nimport { sha256Hex } from './key-version.js';\nimport {\n applyCatalogPatches,\n type TranslationBuildDescriptor,\n type TranslationCatalogPatch,\n type TranslationReleaseManifest,\n} from './release.js';\n\nexport interface CdnLoaderConfig {\n /** Published CDN base — `${base}/{lang}.json`. The repoint knob. Omit to skip. */\n base?: string;\n /** Same-origin bundled base — `${bundledPath}/{lang}.json`. Omit to skip. */\n bundledPath?: string;\n /** Last-resort loader (e.g. a live backend RPC). Omit to skip. */\n devApi?: (language: string) => Promise<TranslationMessages>;\n /** Injectable for tests / non-DOM runtimes. */\n fetchImpl?: typeof fetch;\n}\n\nfunction isNonEmptyMap(v: unknown): v is TranslationMessages {\n return !!v && typeof v === 'object' && Object.keys(v as object).length > 0;\n}\n\nexport function createCdnLoader(\n config: CdnLoaderConfig\n): (language: string) => Promise<TranslationMessages> {\n const doFetch =\n config.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined);\n const base = config.base?.replace(/\\/+$/, '');\n const bundled = config.bundledPath?.replace(/\\/+$/, '');\n\n const fetchJson = async (\n url: string\n ): Promise<TranslationMessages | null> => {\n if (!doFetch) return null;\n try {\n const res = await doFetch(url);\n if (!res.ok) return null;\n return (await res.json()) as TranslationMessages;\n } catch {\n return null;\n }\n };\n\n return async (language: string): Promise<TranslationMessages> => {\n const sources: Array<() => Promise<TranslationMessages | null>> = [];\n if (base) sources.push(() => fetchJson(`${base}/${language}.json`));\n if (bundled) sources.push(() => fetchJson(`${bundled}/${language}.json`));\n if (config.devApi)\n sources.push(async () => {\n try {\n return await config.devApi!(language);\n } catch {\n return null;\n }\n });\n\n for (const source of sources) {\n const result = await source();\n if (isNonEmptyMap(result)) return result;\n }\n return {};\n };\n}\n\nexport interface ReleaseLoaderConfig {\n bundledPath: string;\n descriptor:\n | TranslationBuildDescriptor\n | (() => Promise<TranslationBuildDescriptor | null>);\n fetchImpl?: typeof fetch;\n devApi?: (language: string) => Promise<TranslationMessages>;\n}\n\nfunction resolveReleaseUrl(url: string, manifestUrl: string): string {\n try {\n return new URL(url, manifestUrl).toString();\n } catch {\n return url;\n }\n}\n\nfunction isReleaseManifest(\n value: unknown\n): value is TranslationReleaseManifest {\n const manifest = value as Partial<TranslationReleaseManifest> | undefined;\n return (\n manifest?.schemaVersion === 2 &&\n typeof manifest.releaseId === 'string' &&\n typeof manifest.contractSetHash === 'string' &&\n !!manifest.keyVersions &&\n typeof manifest.keyVersions === 'object' &&\n !!manifest.languages &&\n typeof manifest.languages === 'object'\n );\n}\n\n/**\n * Schema-v2 release loader. Bundled messages always win the first render;\n * compatible immutable CDN objects fetched in the background become visible\n * only on the next call for that language.\n */\nexport function createReleaseLoader(\n config: ReleaseLoaderConfig\n): (language: string) => Promise<TranslationMessages> {\n const doFetch =\n config.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined);\n const bundled = config.bundledPath.replace(/\\/+$/, '');\n const objectCache = new Map<string, unknown>();\n const pending = new Map<string, Promise<TranslationMessages | null>>();\n const requested = new Set<string>();\n let descriptorPromise: Promise<TranslationBuildDescriptor | null> | undefined;\n const getDescriptor = () =>\n (descriptorPromise ??=\n typeof config.descriptor === 'function'\n ? config.descriptor()\n : Promise.resolve(config.descriptor));\n\n const fetchText = async (url: string): Promise<string | null> => {\n if (!doFetch) return null;\n try {\n const response = await doFetch(url);\n return response.ok ? await response.text() : null;\n } catch {\n return null;\n }\n };\n\n const fetchMessages = async (\n url: string\n ): Promise<TranslationMessages | null> => {\n const text = await fetchText(url);\n if (text === null) return null;\n try {\n const parsed = JSON.parse(text);\n return isNonEmptyMap(parsed) ? parsed : null;\n } catch {\n return null;\n }\n };\n\n const fetchHashed = async <T>(\n url: string,\n hash: string\n ): Promise<T | null> => {\n if (objectCache.has(hash)) return objectCache.get(hash) as T;\n const text = await fetchText(url);\n if (text === null || (await sha256Hex(text)) !== hash) return null;\n try {\n const parsed = JSON.parse(text) as T;\n objectCache.set(hash, parsed);\n return parsed;\n } catch {\n return null;\n }\n };\n\n const fetchReleaseLanguage = async (\n language: string\n ): Promise<TranslationMessages | null> => {\n const descriptor = await getDescriptor();\n if (!descriptor) return null;\n const manifestText = await fetchText(descriptor.manifestUrl);\n if (manifestText === null) return null;\n let manifest: unknown;\n try {\n manifest = JSON.parse(manifestText);\n } catch {\n return null;\n }\n if (\n !isReleaseManifest(manifest) ||\n manifest.releaseId !== descriptor.releaseId ||\n manifest.contractSetHash !== descriptor.contractSetHash\n ) {\n return null;\n }\n const lane = manifest.languages[language];\n if (!lane) return null;\n const base = await fetchHashed<TranslationMessages>(\n resolveReleaseUrl(lane.base.url, descriptor.manifestUrl),\n lane.base.hash\n );\n if (!base) return null;\n const patches: TranslationCatalogPatch[] = [];\n for (const patch of [...lane.patches].sort(\n (left, right) => left.sequence - right.sequence\n )) {\n const body = await fetchHashed<TranslationCatalogPatch>(\n resolveReleaseUrl(patch.url, descriptor.manifestUrl),\n patch.hash\n );\n if (!body) return null;\n patches.push(body);\n }\n return applyCatalogPatches(base, patches);\n };\n\n return async (language: string): Promise<TranslationMessages> => {\n const bundledMessages = await fetchMessages(`${bundled}/${language}.json`);\n const existing = pending.get(language);\n if (requested.has(language) && existing) {\n const released = await existing;\n return released ?? bundledMessages ?? {};\n }\n requested.add(language);\n const background = fetchReleaseLanguage(language);\n pending.set(language, background);\n if (bundledMessages) {\n void background.catch(() => null);\n return bundledMessages;\n }\n const released = await background;\n if (released) return released;\n if (config.devApi) {\n try {\n return await config.devApi(language);\n } catch {\n // Preserve the empty fallback contract.\n }\n }\n return {};\n };\n}\n\n/** Fetch public language resources independently of a compiled application. */\nexport function createCdnLanguageLoader(\n config: Pick<CdnLoaderConfig, 'base' | 'fetchImpl'>\n): () => Promise<TranslationLanguageDefinition[]> {\n return async () => {\n if (!config.base) throw new Error('A translation CDN base is required.');\n const response = await (config.fetchImpl ?? fetch)(\n `${config.base.replace(/\\/+$/, '')}/languages.json`\n );\n if (!response.ok)\n throw new Error(`Language catalog HTTP ${response.status}`);\n const catalog = await response.json();\n if (catalog.schemaVersion !== 1 || !Array.isArray(catalog.languages))\n throw new Error('Invalid language catalog.');\n const definitions = catalog.languages.map(\n (item: TranslationLanguageDefinition) => defineLanguage(item.code, item)\n );\n validateLanguageDefinitions(definitions);\n return definitions;\n };\n}\n"]}
1
+ {"version":3,"file":"cdn-loader.js","sourceRoot":"","sources":["../../src/cdn-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineLanguage,\n validateLanguageDefinitions,\n type TranslationLanguageDefinition,\n} from './languages.js';\n/**\n * `loadMessages` factory for the CDN delivery cascade (Plan 016 P2.4, AD-J/AD-K).\n * SIMPLE-POINTER mode (the ratified default): fetch `${base}/{lang}.json` from\n * the published CDN — changing `base` (an app's `translation:cdnTarget`) repoints at\n * different cloud files with no call-site change, exactly the Tolgee model.\n * `bundledPath` (same-origin bundled copy) and `devApi` (e.g. the `getMessages`\n * RPC for live dev editing) are optional fallbacks, tried in the order given.\n * Any source that yields a non-empty map wins; all-empty ⇒ `{}` and the client\n * keeps its inline English defaults. Never throws.\n *\n * Portable (no CN import): the caller wires `base`/`devApi` for its environment.\n */\nimport type { TranslationMessages } from './core/messages.js';\nimport { sha256Hex } from './key-version.js';\nimport {\n applyCatalogPatches,\n type TranslationBuildDescriptor,\n type TranslationCatalogPatch,\n type TranslationReleaseManifest,\n} from './release.js';\n\nexport interface CdnLoaderConfig {\n /** Published CDN base — `${base}/{lang}.json`. The repoint knob. Omit to skip. */\n base?: string;\n /** Same-origin bundled base — `${bundledPath}/{lang}.json`. Omit to skip. */\n bundledPath?: string;\n /** Last-resort loader (e.g. a live backend RPC). Omit to skip. */\n devApi?: (language: string) => Promise<TranslationMessages>;\n /** Injectable for tests / non-DOM runtimes. */\n fetchImpl?: typeof fetch;\n}\n\nfunction isNonEmptyMap(v: unknown): v is TranslationMessages {\n return !!v && typeof v === 'object' && Object.keys(v as object).length > 0;\n}\n\nexport function createCdnLoader(\n config: CdnLoaderConfig\n): (language: string) => Promise<TranslationMessages> {\n const doFetch =\n config.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined);\n const base = config.base?.replace(/\\/+$/, '');\n const bundled = config.bundledPath?.replace(/\\/+$/, '');\n\n const fetchJson = async (\n url: string\n ): Promise<TranslationMessages | null> => {\n if (!doFetch) return null;\n try {\n const res = await doFetch(url);\n if (!res.ok) return null;\n return (await res.json()) as TranslationMessages;\n } catch {\n return null;\n }\n };\n\n return async (language: string): Promise<TranslationMessages> => {\n const sources: Array<() => Promise<TranslationMessages | null>> = [];\n if (base) sources.push(() => fetchJson(`${base}/${language}.json`));\n if (bundled) sources.push(() => fetchJson(`${bundled}/${language}.json`));\n if (config.devApi)\n sources.push(async () => {\n try {\n return await config.devApi!(language);\n } catch {\n return null;\n }\n });\n\n for (const source of sources) {\n const result = await source();\n if (isNonEmptyMap(result)) return result;\n }\n return {};\n };\n}\n\nexport interface ReleaseLoaderConfig {\n bundledPath: string;\n descriptor:\n | TranslationBuildDescriptor\n | (() => Promise<TranslationBuildDescriptor | null>);\n fetchImpl?: typeof fetch;\n devApi?: (language: string) => Promise<TranslationMessages>;\n}\n\nfunction resolveReleaseUrl(url: string, manifestUrl: string): string {\n try {\n return new URL(url, manifestUrl).toString();\n } catch {\n return url;\n }\n}\n\nfunction isReleaseManifest(\n value: unknown\n): value is TranslationReleaseManifest {\n const manifest = value as Partial<TranslationReleaseManifest> | undefined;\n return (\n manifest?.schemaVersion === 2 &&\n typeof manifest.releaseId === 'string' &&\n typeof manifest.contractSetHash === 'string' &&\n !!manifest.keyVersions &&\n typeof manifest.keyVersions === 'object' &&\n !!manifest.languages &&\n typeof manifest.languages === 'object'\n );\n}\n\n/**\n * Schema-v2 release loader. Bundled messages always win the first render;\n * compatible immutable CDN objects fetched in the background become visible\n * only on the next call for that language.\n */\nexport function createReleaseLoader(\n config: ReleaseLoaderConfig\n): (language: string) => Promise<TranslationMessages> {\n const doFetch =\n config.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined);\n const bundled = config.bundledPath.replace(/\\/+$/, '');\n const objectCache = new Map<string, unknown>();\n const pending = new Map<string, Promise<TranslationMessages | null>>();\n const requested = new Set<string>();\n let descriptorPromise: Promise<TranslationBuildDescriptor | null> | undefined;\n const getDescriptor = () =>\n (descriptorPromise ??=\n typeof config.descriptor === 'function'\n ? config.descriptor()\n : Promise.resolve(config.descriptor));\n\n const fetchText = async (url: string): Promise<string | null> => {\n if (!doFetch) return null;\n try {\n const response = await doFetch(url);\n return response.ok ? await response.text() : null;\n } catch {\n return null;\n }\n };\n\n const fetchMessages = async (\n url: string\n ): Promise<TranslationMessages | null> => {\n const text = await fetchText(url);\n if (text === null) return null;\n try {\n const parsed = JSON.parse(text);\n return isNonEmptyMap(parsed) ? parsed : null;\n } catch {\n return null;\n }\n };\n\n const fetchHashed = async <T>(\n url: string,\n hash: string\n ): Promise<T | null> => {\n if (objectCache.has(hash)) return objectCache.get(hash) as T;\n const text = await fetchText(url);\n if (text === null || (await sha256Hex(text)) !== hash) return null;\n try {\n const parsed = JSON.parse(text) as T;\n objectCache.set(hash, parsed);\n return parsed;\n } catch {\n return null;\n }\n };\n\n const fetchReleaseLanguage = async (\n language: string\n ): Promise<TranslationMessages | null> => {\n const descriptor = await getDescriptor();\n if (!descriptor) return null;\n const manifestText = await fetchText(descriptor.manifestUrl);\n if (manifestText === null) return null;\n let manifest: unknown;\n try {\n manifest = JSON.parse(manifestText);\n } catch {\n return null;\n }\n if (\n !isReleaseManifest(manifest) ||\n manifest.releaseId !== descriptor.releaseId ||\n manifest.contractSetHash !== descriptor.contractSetHash\n ) {\n return null;\n }\n const lane = manifest.languages[language];\n if (!lane) return null;\n const base = await fetchHashed<TranslationMessages>(\n resolveReleaseUrl(lane.base.url, descriptor.manifestUrl),\n lane.base.hash\n );\n if (!base) return null;\n const patches: TranslationCatalogPatch[] = [];\n for (const patch of [...lane.patches].sort(\n (left, right) => left.sequence - right.sequence\n )) {\n const body = await fetchHashed<TranslationCatalogPatch>(\n resolveReleaseUrl(patch.url, descriptor.manifestUrl),\n patch.hash\n );\n if (!body) return null;\n patches.push(body);\n }\n return applyCatalogPatches(base, patches);\n };\n\n return async (language: string): Promise<TranslationMessages> => {\n const bundledMessages = await fetchMessages(`${bundled}/${language}.json`);\n const existing = pending.get(language);\n if (requested.has(language) && existing) {\n const released = await existing;\n return released ?? bundledMessages ?? {};\n }\n requested.add(language);\n const background = fetchReleaseLanguage(language);\n pending.set(language, background);\n if (bundledMessages) {\n void background.catch(() => null);\n return bundledMessages;\n }\n const released = await background;\n if (released) return released;\n if (config.devApi) {\n try {\n return await config.devApi(language);\n } catch {\n // Preserve the empty fallback contract.\n }\n }\n return {};\n };\n}\n\n/** Fetch public language resources independently of a compiled application. */\nexport function createCdnLanguageLoader(\n config: Pick<CdnLoaderConfig, 'base' | 'fetchImpl'>\n): () => Promise<TranslationLanguageDefinition[]> {\n return async () => {\n if (!config.base) throw new Error('A translation CDN base is required.');\n const response = await (config.fetchImpl ?? fetch)(\n `${config.base.replace(/\\/+$/, '')}/languages.json`\n );\n if (!response.ok)\n throw new Error(`Language catalog HTTP ${response.status}`);\n const catalog = await response.json();\n if (catalog.schemaVersion !== 1 || !Array.isArray(catalog.languages))\n throw new Error('Invalid language catalog.');\n const definitions = catalog.languages.map(\n (item: TranslationLanguageDefinition) => defineLanguage(item.code, item)\n );\n validateLanguageDefinitions(definitions);\n return definitions;\n };\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  "@context": {
3
3
  "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
4
4
  "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
5
- "tr": "https://id.linked.cm/translation/vocab#"
5
+ "translation": "https://linked.cm/ont/translation/"
6
6
  },
7
7
  "@graph": []
8
8
  }
@@ -1,8 +1,9 @@
1
1
  import { normalizeParsedTranslationExchangeDocument, } from '../exchange.js';
2
2
  const UTF8 = new TextEncoder();
3
3
  /**
4
- * Our own metadata namespace, a sibling of the translation vocabulary
5
- * (`https://id.linked.cm/translation/vocab#`). Files exported before 0.3.0
4
+ * Our own XML metadata namespace for exchange files. It is a file-format
5
+ * identifier written into exported documents, not the translation ontology
6
+ * (which lives at `https://linked.cm/ont/translation/`). Files exported before 0.3.0
6
7
  * used a Create Now URI and a `cn:` prefix; the reader below still accepts
7
8
  * both, so those files keep importing.
8
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../../src/formats/xliff.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n normalizeParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeEntry,\n type TranslationExchangeDocument,\n type TranslationExchangeEntry,\n type TranslationExchangeValue,\n type TranslationFormatAdapter,\n} from '../exchange.js';\nimport type { TranslationState } from '../records.js';\n\nconst UTF8 = new TextEncoder();\n/**\n * Our own metadata namespace, a sibling of the translation vocabulary\n * (`https://id.linked.cm/translation/vocab#`). Files exported before 0.3.0\n * used a Create Now URI and a `cn:` prefix; the reader below still accepts\n * both, so those files keep importing.\n */\nconst EXCHANGE_NAMESPACE = 'https://id.linked.cm/translation/exchange/1';\nconst PREFIX = 'lt';\nconst LEGACY_PREFIX = 'cn';\n/** `from`/`category` on a `<note>`, in current and pre-0.3.0 spelling. */\nconst NOTE_ROLES = {\n description: ['linked-description', 'create-now-description'],\n target: ['linked-target', 'create-now-target'],\n} as const;\n\nfunction isNoteRole(\n value: string | undefined,\n role: keyof typeof NOTE_ROLES,\n): boolean {\n return value !== undefined && (NOTE_ROLES[role] as readonly string[]).includes(value);\n}\nconst XLIFF_12_NAMESPACE = 'urn:oasis:names:tc:xliff:document:1.2';\nconst XLIFF_20_NAMESPACE = 'urn:oasis:names:tc:xliff:document:2.0';\nconst XML_MEDIA_TYPE = 'application/xliff+xml';\n\nconst INLINE_12 = new Set([\n 'bpt',\n 'bx',\n 'ept',\n 'ex',\n 'g',\n 'it',\n 'mrk',\n 'ph',\n 'sub',\n 'x',\n]);\nconst INLINE_20 = new Set(['ec', 'em', 'mrk', 'pc', 'ph', 'sc', 'sm']);\n\ntype XmlChild = XmlNode | string;\n\ninterface XmlNode {\n name: string;\n attributes: Record<string, string>;\n children: XmlChild[];\n}\n\nexport interface XliffFinding {\n code: 'unsupported-inline';\n message: string;\n element: string;\n unitId?: string;\n}\n\nexport interface XliffParseOptions {\n onFinding?: (finding: XliffFinding) => void;\n}\n\ninterface MutableParsedEntry extends ParsedTranslationExchangeEntry {\n translations: Record<string, TranslationExchangeValue>;\n}\n\nfunction text(input: Uint8Array): string {\n return new TextDecoder('utf-8', { fatal: true }).decode(input);\n}\n\nfunction localName(name: string): string {\n const separator = name.indexOf(':');\n return separator === -1 ? name : name.slice(separator + 1);\n}\n\nfunction escapeText(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value)\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;');\n}\n\nfunction decodeEntities(value: string): string {\n const decoded = value.replace(\n /&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,\n (entity, body: string) => {\n if (body === 'amp') return '&';\n if (body === 'lt') return '<';\n if (body === 'gt') return '>';\n if (body === 'quot') return '\"';\n if (body === 'apos') return \"'\";\n const point = Number.parseInt(body.slice(body[1] === 'x' ? 2 : 1), body[1] === 'x' ? 16 : 10);\n if (!Number.isFinite(point) || point > 0x10ffff) {\n throw new Error(`Invalid XML character reference \"&${body};\".`);\n }\n return String.fromCodePoint(point);\n },\n );\n const unresolved = /&([A-Za-z_:][\\w.:-]*);/.exec(decoded);\n if (unresolved) {\n throw new Error(`Unsupported XML entity reference \"&${unresolved[1]};\".`);\n }\n return decoded;\n}\n\nfunction readTagEnd(xml: string, start: number): number {\n let quote = '';\n for (let index = start; index < xml.length; index += 1) {\n const character = xml[index];\n if (quote) {\n if (character === quote) quote = '';\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '>') {\n return index;\n }\n }\n throw new Error('Malformed XML: unterminated tag.');\n}\n\nfunction parseAttributes(input: string): {\n name: string;\n attributes: Record<string, string>;\n selfClosing: boolean;\n} {\n let content = input.trim();\n const selfClosing = content.endsWith('/');\n if (selfClosing) content = content.slice(0, -1).trimEnd();\n const nameMatch = /^([^\\s/>]+)/.exec(content);\n if (!nameMatch) throw new Error('Malformed XML: element name is missing.');\n const name = nameMatch[1];\n const attributes: Record<string, string> = {};\n let remainder = content.slice(name.length);\n const attributePattern = /^\\s+([^\\s=/>]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/;\n while (remainder.trim()) {\n const match = attributePattern.exec(remainder);\n if (!match) {\n throw new Error(`Malformed XML attributes on <${name}>.`);\n }\n if (attributes[match[1]] !== undefined) {\n throw new Error(`Duplicate XML attribute \"${match[1]}\".`);\n }\n attributes[match[1]] = decodeEntities(match[3] ?? match[4] ?? '');\n remainder = remainder.slice(match[0].length);\n }\n return { name, attributes, selfClosing };\n}\n\n/**\n * Small, non-validating XML parser for the deliberately narrow XLIFF surface.\n * DTDs and entity declarations are rejected before tokenization, so parsing\n * never performs filesystem or network resolution.\n */\nfunction parseXml(xml: string): XmlNode {\n if (/<!DOCTYPE\\b/i.test(xml) || /<!ENTITY\\b/i.test(xml)) {\n throw new Error('XLIFF containing a DTD or entity declaration is not allowed.');\n }\n const root: XmlNode = {\n name: '#document',\n attributes: {},\n children: [],\n };\n const stack = [root];\n let cursor = 0;\n while (cursor < xml.length) {\n const opening = xml.indexOf('<', cursor);\n if (opening === -1) {\n const trailing = xml.slice(cursor);\n if (trailing) stack.at(-1)!.children.push(decodeEntities(trailing));\n break;\n }\n if (opening > cursor) {\n stack.at(-1)!.children.push(decodeEntities(xml.slice(cursor, opening)));\n }\n if (xml.startsWith('<!--', opening)) {\n const closing = xml.indexOf('-->', opening + 4);\n if (closing === -1) throw new Error('Malformed XML comment.');\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('<?', opening)) {\n const closing = xml.indexOf('?>', opening + 2);\n if (closing === -1) throw new Error('Malformed XML processing instruction.');\n cursor = closing + 2;\n continue;\n }\n if (xml.startsWith('<![CDATA[', opening)) {\n const closing = xml.indexOf(']]>', opening + 9);\n if (closing === -1) throw new Error('Malformed XML CDATA section.');\n stack.at(-1)!.children.push(xml.slice(opening + 9, closing));\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('</', opening)) {\n const closing = readTagEnd(xml, opening + 2);\n const name = xml.slice(opening + 2, closing).trim();\n const current = stack.pop();\n if (!current || current === root || current.name !== name) {\n throw new Error(`Malformed XML closing tag </${name}>.`);\n }\n cursor = closing + 1;\n continue;\n }\n if (xml.startsWith('<!', opening)) {\n throw new Error('Unsupported XML declaration.');\n }\n const closing = readTagEnd(xml, opening + 1);\n const parsed = parseAttributes(xml.slice(opening + 1, closing));\n const node: XmlNode = {\n name: parsed.name,\n attributes: parsed.attributes,\n children: [],\n };\n stack.at(-1)!.children.push(node);\n if (!parsed.selfClosing) stack.push(node);\n cursor = closing + 1;\n }\n if (stack.length !== 1) {\n throw new Error(`Malformed XML: unclosed <${stack.at(-1)!.name}> element.`);\n }\n const documentElements = root.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (documentElements.length !== 1) {\n throw new Error('XLIFF must contain exactly one document element.');\n }\n return documentElements[0];\n}\n\nfunction children(node: XmlNode, name: string): XmlNode[] {\n return node.children.filter(\n (child): child is XmlNode =>\n typeof child !== 'string' && localName(child.name) === name,\n );\n}\n\nfunction descendants(node: XmlNode, name: string): XmlNode[] {\n const found: XmlNode[] = [];\n for (const child of node.children) {\n if (typeof child === 'string') continue;\n if (localName(child.name) === name) found.push(child);\n found.push(...descendants(child, name));\n }\n return found;\n}\n\nfunction first(node: XmlNode, name: string): XmlNode | undefined {\n return children(node, name)[0];\n}\n\nfunction attribute(node: XmlNode, name: string): string | undefined {\n const direct = node.attributes[name];\n if (direct !== undefined) return direct;\n const entry = Object.entries(node.attributes).find(\n ([qualified]) => localName(qualified) === name,\n );\n return entry?.[1];\n}\n\nfunction serializeNode(node: XmlNode): string {\n const attributes = Object.entries(node.attributes)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n if (node.children.length === 0) return `<${node.name}${attributes}/>`;\n return `<${node.name}${attributes}>${node.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('')}</${node.name}>`;\n}\n\nfunction innerXml(\n node: XmlNode | undefined,\n supportedInline: Set<string>,\n options: XliffParseOptions,\n unitId?: string,\n): string | undefined {\n if (!node) return undefined;\n const visit = (parent: XmlNode): void => {\n for (const child of parent.children) {\n if (typeof child === 'string') continue;\n const name = localName(child.name);\n if (!supportedInline.has(name)) {\n options.onFinding?.({\n code: 'unsupported-inline',\n message: `Unsupported inline XLIFF element <${child.name}> was preserved.`,\n element: child.name,\n unitId,\n });\n }\n visit(child);\n }\n };\n visit(node);\n return node.children\n .map((child) =>\n typeof child === 'string' ? child : serializeNode(child),\n )\n .join('');\n}\n\nfunction plainText(node: XmlNode | undefined): string | undefined {\n if (!node) return undefined;\n return node.children\n .map((child) => (typeof child === 'string' ? child : plainText(child) ?? ''))\n .join('');\n}\n\nfunction metadata(node: XmlNode, name: string): string | undefined {\n return (\n node.attributes[`${PREFIX}:${name}`] ??\n node.attributes[`${LEGACY_PREFIX}:${name}`] ??\n attribute(node, name)\n );\n}\n\nfunction recognizedState(value: string | undefined): TranslationState | undefined {\n if (\n value === 'untranslated' ||\n value === 'machine' ||\n value === 'reviewed' ||\n value === 'stale'\n ) {\n return value;\n }\n if (value === 'final' || value === 'reviewed' || value === 'signed-off') {\n return 'reviewed';\n }\n if (value === 'translated') return 'machine';\n if (value === 'needs-review-translation') return 'stale';\n if (value === 'new' || value === 'initial') return 'untranslated';\n return undefined;\n}\n\nfunction commonDocument(root: XmlNode): Omit<\n ParsedTranslationExchangeDocument,\n 'sourceLanguage' | 'targetLanguages' | 'entries'\n> {\n return {\n schemaVersion: 1,\n ...(metadata(root, 'app-id') ? { appId: metadata(root, 'app-id') } : {}),\n ...(metadata(root, 'branch-id')\n ? { branchId: metadata(root, 'branch-id') }\n : {}),\n ...(metadata(root, 'exported-at')\n ? { exportedAt: metadata(root, 'exported-at') }\n : {}),\n ...(metadata(root, 'revision-watermark')\n ? { revisionWatermark: metadata(root, 'revision-watermark') }\n : {}),\n ...(metadata(root, 'contract-set-hash')\n ? { contractSetHash: metadata(root, 'contract-set-hash') }\n : {}),\n };\n}\n\nfunction mergeUnit(\n entries: Map<string, MutableParsedEntry>,\n unit: XmlNode,\n sourceText: string | undefined,\n targetText: string | undefined,\n targetLanguage: string | undefined,\n targetState: TranslationState | undefined,\n targetNote: string | undefined,\n description: string | undefined,\n): void {\n const key = metadata(unit, 'key') ?? attribute(unit, 'resname') ?? attribute(unit, 'name') ?? attribute(unit, 'id');\n if (!key) throw new Error('XLIFF unit is missing an id/key.');\n const namespace = metadata(unit, 'namespace');\n const identity = `${namespace ?? ''}\\u0000${key}`;\n let entry = entries.get(identity);\n if (!entry) {\n entry = {\n key,\n ...(namespace ? { namespace } : {}),\n kind: metadata(unit, 'kind') === 'semantic' ? 'semantic' : 'ui',\n format: metadata(unit, 'format') === 'icu' ? 'icu' : 'simple',\n ...(sourceText !== undefined ? { sourceText } : {}),\n ...(metadata(unit, 'key-version-id')\n ? { keyVersionId: metadata(unit, 'key-version-id') }\n : {}),\n ...(metadata(unit, 'source-hash')\n ? { sourceHash: metadata(unit, 'source-hash') }\n : {}),\n ...(metadata(unit, 'contract-hash')\n ? { contractHash: metadata(unit, 'contract-hash') }\n : {}),\n ...(metadata(unit, 'argument-signature')\n ? { argumentSignature: metadata(unit, 'argument-signature') }\n : {}),\n ...(description ? { description } : {}),\n translations: {},\n };\n entries.set(identity, entry);\n } else if (sourceText !== undefined && entry.sourceText !== sourceText) {\n throw new Error(`XLIFF source text conflicts for key \"${key}\".`);\n }\n if (targetLanguage && targetText !== undefined) {\n if (entry.translations[targetLanguage]) {\n throw new Error(\n `Duplicate XLIFF target for key \"${key}\" in ${targetLanguage}.`,\n );\n }\n entry.translations[targetLanguage] = {\n text: targetText,\n ...(targetState ? { state: targetState } : {}),\n ...(targetNote ? { note: targetNote } : {}),\n };\n }\n}\n\nfunction parse12(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n let sourceLanguage = attribute(root, 'source-language');\n const targetLanguages = new Set<string>();\n for (const file of descendants(root, 'file')) {\n sourceLanguage ??= attribute(file, 'source-language');\n const targetLanguage = attribute(file, 'target-language');\n if (targetLanguage) targetLanguages.add(targetLanguage);\n for (const unit of descendants(file, 'trans-unit')) {\n const id = attribute(unit, 'id');\n const sourceText = innerXml(first(unit, 'source'), INLINE_12, options, id);\n const target = first(unit, 'target');\n const language =\n attribute(target ?? unit, 'lang') ?? targetLanguage;\n if (language) targetLanguages.add(language);\n const notes = children(unit, 'note');\n const description = plainText(\n notes.find((note) => isNoteRole(attribute(note, 'from'), 'description')),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'from'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n mergeUnit(\n entries,\n unit,\n sourceText,\n innerXml(target, INLINE_12, options, id),\n language,\n recognizedState(metadata(target ?? unit, 'state') ?? attribute(target ?? unit, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n if (!sourceLanguage) throw new Error('XLIFF 1.2 source language is missing.');\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parse20(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n const sourceLanguage = attribute(root, 'srcLang');\n if (!sourceLanguage) throw new Error('XLIFF 2.0 srcLang is missing.');\n const targetLanguages = new Set<string>();\n const rootTargetLanguage = attribute(root, 'trgLang');\n if (rootTargetLanguage) targetLanguages.add(rootTargetLanguage);\n for (const file of descendants(root, 'file')) {\n const fileTargetLanguage =\n attribute(file, 'trgLang') ??\n metadata(file, 'target-language') ??\n rootTargetLanguage;\n if (fileTargetLanguage) targetLanguages.add(fileTargetLanguage);\n for (const unit of descendants(file, 'unit')) {\n const segment = first(unit, 'segment') ?? descendants(unit, 'segment')[0];\n if (!segment) continue;\n const target = first(segment, 'target');\n const language = attribute(target ?? unit, 'lang') ?? fileTargetLanguage;\n if (language) targetLanguages.add(language);\n const notesContainer = first(unit, 'notes');\n const notes = notesContainer ? children(notesContainer, 'note') : [];\n const description = plainText(\n notes.find(\n (note) => isNoteRole(attribute(note, 'category'), 'description'),\n ),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'category'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n const id = attribute(unit, 'id');\n mergeUnit(\n entries,\n unit,\n innerXml(first(segment, 'source'), INLINE_20, options, id),\n innerXml(target, INLINE_20, options, id),\n language,\n recognizedState(metadata(segment, 'state') ?? attribute(segment, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parseXliff(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n options: XliffParseOptions = {},\n): ParsedTranslationExchangeDocument {\n const root = parseXml(text(input));\n if (localName(root.name) !== 'xliff') {\n throw new Error('Document is not XLIFF.');\n }\n const version = attribute(root, 'version');\n if (version !== expectedVersion) {\n throw new Error(\n `Expected XLIFF ${expectedVersion}, received ${version ?? 'an unknown version'}.`,\n );\n }\n return version === '1.2' ? parse12(root, options) : parse20(root, options);\n}\n\nfunction deterministicId(entry: TranslationExchangeEntry, index: number): string {\n const identity = `${entry.namespace ?? 'default'}:${entry.key}`;\n return `u${index + 1}-${encodeURIComponent(identity).replaceAll('%', '_')}`;\n}\n\nfunction state12(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'needs-review-translation';\n if (state === 'machine') return 'translated';\n return 'new';\n}\n\nfunction state20(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'translated';\n if (state === 'machine') return 'translated';\n return 'initial';\n}\n\nfunction metadataAttributes(entry: TranslationExchangeEntry): string {\n return [\n [`${PREFIX}:key`, entry.key],\n [`${PREFIX}:namespace`, entry.namespace],\n [`${PREFIX}:kind`, entry.kind],\n [`${PREFIX}:format`, entry.format],\n [`${PREFIX}:key-version-id`, entry.keyVersionId],\n [`${PREFIX}:source-hash`, entry.sourceHash],\n [`${PREFIX}:contract-hash`, entry.contractHash],\n [`${PREFIX}:argument-signature`, entry.argumentSignature],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction rootMetadata(document: TranslationExchangeDocument): string {\n return [\n [`${PREFIX}:schema-version`, String(document.schemaVersion)],\n [`${PREFIX}:app-id`, document.appId],\n [`${PREFIX}:branch-id`, document.branchId],\n [`${PREFIX}:exported-at`, document.exportedAt],\n [`${PREFIX}:revision-watermark`, document.revisionWatermark],\n [`${PREFIX}:contract-set-hash`, document.contractSetHash],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction validatedMixedContent(value: string, inline: Set<string>): string {\n if (!value.includes('<')) return escapeText(value);\n try {\n const wrapper = parseXml(`<cn-wrapper>${value}</cn-wrapper>`);\n const nodes = wrapper.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (\n nodes.length === 0 ||\n nodes.some((node) => !inline.has(localName(node.name)))\n ) {\n return escapeText(value);\n }\n return wrapper.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('');\n } catch {\n return escapeText(value);\n }\n}\n\nfunction targets(document: TranslationExchangeDocument): Array<string | undefined> {\n return document.targetLanguages.length > 0\n ? document.targetLanguages\n : [undefined];\n}\n\nfunction serialize12(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes = [\n entry.description\n ? `<note from=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : '',\n target?.note\n ? `<note from=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : '',\n ].join('');\n return `<trans-unit id=\"${escapeAttribute(id)}\" resname=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}><source>${validatedMixedContent(entry.sourceText, INLINE_12)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\" state=\"${state12(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\">${validatedMixedContent(target?.text ?? '', INLINE_12)}</target>`\n : ''\n }${notes}</trans-unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\" original=\"linked\" datatype=\"plaintext\" source-language=\"${escapeAttribute(document.sourceLanguage)}\"${\n language ? ` target-language=\"${escapeAttribute(language)}\"` : ''\n }><body>${units}</body></file>`;\n })\n .join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_12_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"1.2\"${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction serialize20(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes =\n entry.description || target?.note\n ? `<notes>${\n entry.description\n ? `<note category=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : ''\n }${\n target?.note\n ? `<note category=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : ''\n }</notes>`\n : '';\n return `<unit id=\"${escapeAttribute(id)}\" name=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}>${notes}<segment id=\"s1\" state=\"${state20(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\"><source>${validatedMixedContent(entry.sourceText, INLINE_20)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\">${validatedMixedContent(target?.text ?? '', INLINE_20)}</target>`\n : ''\n }</segment></unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\"${\n language ? ` ${PREFIX}:target-language=\"${escapeAttribute(language)}\"` : ''\n }>${units}</file>`;\n })\n .join('');\n const singleTarget =\n document.targetLanguages.length === 1\n ? ` trgLang=\"${escapeAttribute(document.targetLanguages[0])}\"`\n : '';\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_20_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"2.0\" srcLang=\"${escapeAttribute(document.sourceLanguage)}\"${singleTarget}${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction sniffVersion(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n fileName?: string,\n): boolean {\n if (fileName && !/\\.xlf(f)?$/i.test(fileName)) return false;\n const prefix = text(input.slice(0, Math.min(input.length, 4096)));\n return (\n /<(?:(?:[\\w.-]+):)?xliff\\b/i.test(prefix) &&\n new RegExp(`\\\\bversion\\\\s*=\\\\s*[\"']${expectedVersion.replace('.', '\\\\.')}[\"']`).test(prefix)\n );\n}\n\nexport const xliff12Adapter: TranslationFormatAdapter = {\n format: 'xliff-1.2',\n sniff: (input, fileName) => sniffVersion(input, '1.2', fileName),\n parse: async (input, options) =>\n parseXliff(input, '1.2', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize12(document)),\n }),\n};\n\nexport const xliff20Adapter: TranslationFormatAdapter = {\n format: 'xliff-2.0',\n sniff: (input, fileName) => sniffVersion(input, '2.0', fileName),\n parse: async (input, options) =>\n parseXliff(input, '2.0', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize20(document)),\n }),\n};\n"]}
1
+ {"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../../src/formats/xliff.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n normalizeParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeEntry,\n type TranslationExchangeDocument,\n type TranslationExchangeEntry,\n type TranslationExchangeValue,\n type TranslationFormatAdapter,\n} from '../exchange.js';\nimport type { TranslationState } from '../records.js';\n\nconst UTF8 = new TextEncoder();\n/**\n * Our own XML metadata namespace for exchange files. It is a file-format\n * identifier written into exported documents, not the translation ontology\n * (which lives at `https://linked.cm/ont/translation/`). Files exported before 0.3.0\n * used a Create Now URI and a `cn:` prefix; the reader below still accepts\n * both, so those files keep importing.\n */\nconst EXCHANGE_NAMESPACE = 'https://id.linked.cm/translation/exchange/1';\nconst PREFIX = 'lt';\nconst LEGACY_PREFIX = 'cn';\n/** `from`/`category` on a `<note>`, in current and pre-0.3.0 spelling. */\nconst NOTE_ROLES = {\n description: ['linked-description', 'create-now-description'],\n target: ['linked-target', 'create-now-target'],\n} as const;\n\nfunction isNoteRole(\n value: string | undefined,\n role: keyof typeof NOTE_ROLES,\n): boolean {\n return value !== undefined && (NOTE_ROLES[role] as readonly string[]).includes(value);\n}\nconst XLIFF_12_NAMESPACE = 'urn:oasis:names:tc:xliff:document:1.2';\nconst XLIFF_20_NAMESPACE = 'urn:oasis:names:tc:xliff:document:2.0';\nconst XML_MEDIA_TYPE = 'application/xliff+xml';\n\nconst INLINE_12 = new Set([\n 'bpt',\n 'bx',\n 'ept',\n 'ex',\n 'g',\n 'it',\n 'mrk',\n 'ph',\n 'sub',\n 'x',\n]);\nconst INLINE_20 = new Set(['ec', 'em', 'mrk', 'pc', 'ph', 'sc', 'sm']);\n\ntype XmlChild = XmlNode | string;\n\ninterface XmlNode {\n name: string;\n attributes: Record<string, string>;\n children: XmlChild[];\n}\n\nexport interface XliffFinding {\n code: 'unsupported-inline';\n message: string;\n element: string;\n unitId?: string;\n}\n\nexport interface XliffParseOptions {\n onFinding?: (finding: XliffFinding) => void;\n}\n\ninterface MutableParsedEntry extends ParsedTranslationExchangeEntry {\n translations: Record<string, TranslationExchangeValue>;\n}\n\nfunction text(input: Uint8Array): string {\n return new TextDecoder('utf-8', { fatal: true }).decode(input);\n}\n\nfunction localName(name: string): string {\n const separator = name.indexOf(':');\n return separator === -1 ? name : name.slice(separator + 1);\n}\n\nfunction escapeText(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value)\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;');\n}\n\nfunction decodeEntities(value: string): string {\n const decoded = value.replace(\n /&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,\n (entity, body: string) => {\n if (body === 'amp') return '&';\n if (body === 'lt') return '<';\n if (body === 'gt') return '>';\n if (body === 'quot') return '\"';\n if (body === 'apos') return \"'\";\n const point = Number.parseInt(body.slice(body[1] === 'x' ? 2 : 1), body[1] === 'x' ? 16 : 10);\n if (!Number.isFinite(point) || point > 0x10ffff) {\n throw new Error(`Invalid XML character reference \"&${body};\".`);\n }\n return String.fromCodePoint(point);\n },\n );\n const unresolved = /&([A-Za-z_:][\\w.:-]*);/.exec(decoded);\n if (unresolved) {\n throw new Error(`Unsupported XML entity reference \"&${unresolved[1]};\".`);\n }\n return decoded;\n}\n\nfunction readTagEnd(xml: string, start: number): number {\n let quote = '';\n for (let index = start; index < xml.length; index += 1) {\n const character = xml[index];\n if (quote) {\n if (character === quote) quote = '';\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '>') {\n return index;\n }\n }\n throw new Error('Malformed XML: unterminated tag.');\n}\n\nfunction parseAttributes(input: string): {\n name: string;\n attributes: Record<string, string>;\n selfClosing: boolean;\n} {\n let content = input.trim();\n const selfClosing = content.endsWith('/');\n if (selfClosing) content = content.slice(0, -1).trimEnd();\n const nameMatch = /^([^\\s/>]+)/.exec(content);\n if (!nameMatch) throw new Error('Malformed XML: element name is missing.');\n const name = nameMatch[1];\n const attributes: Record<string, string> = {};\n let remainder = content.slice(name.length);\n const attributePattern = /^\\s+([^\\s=/>]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/;\n while (remainder.trim()) {\n const match = attributePattern.exec(remainder);\n if (!match) {\n throw new Error(`Malformed XML attributes on <${name}>.`);\n }\n if (attributes[match[1]] !== undefined) {\n throw new Error(`Duplicate XML attribute \"${match[1]}\".`);\n }\n attributes[match[1]] = decodeEntities(match[3] ?? match[4] ?? '');\n remainder = remainder.slice(match[0].length);\n }\n return { name, attributes, selfClosing };\n}\n\n/**\n * Small, non-validating XML parser for the deliberately narrow XLIFF surface.\n * DTDs and entity declarations are rejected before tokenization, so parsing\n * never performs filesystem or network resolution.\n */\nfunction parseXml(xml: string): XmlNode {\n if (/<!DOCTYPE\\b/i.test(xml) || /<!ENTITY\\b/i.test(xml)) {\n throw new Error('XLIFF containing a DTD or entity declaration is not allowed.');\n }\n const root: XmlNode = {\n name: '#document',\n attributes: {},\n children: [],\n };\n const stack = [root];\n let cursor = 0;\n while (cursor < xml.length) {\n const opening = xml.indexOf('<', cursor);\n if (opening === -1) {\n const trailing = xml.slice(cursor);\n if (trailing) stack.at(-1)!.children.push(decodeEntities(trailing));\n break;\n }\n if (opening > cursor) {\n stack.at(-1)!.children.push(decodeEntities(xml.slice(cursor, opening)));\n }\n if (xml.startsWith('<!--', opening)) {\n const closing = xml.indexOf('-->', opening + 4);\n if (closing === -1) throw new Error('Malformed XML comment.');\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('<?', opening)) {\n const closing = xml.indexOf('?>', opening + 2);\n if (closing === -1) throw new Error('Malformed XML processing instruction.');\n cursor = closing + 2;\n continue;\n }\n if (xml.startsWith('<![CDATA[', opening)) {\n const closing = xml.indexOf(']]>', opening + 9);\n if (closing === -1) throw new Error('Malformed XML CDATA section.');\n stack.at(-1)!.children.push(xml.slice(opening + 9, closing));\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('</', opening)) {\n const closing = readTagEnd(xml, opening + 2);\n const name = xml.slice(opening + 2, closing).trim();\n const current = stack.pop();\n if (!current || current === root || current.name !== name) {\n throw new Error(`Malformed XML closing tag </${name}>.`);\n }\n cursor = closing + 1;\n continue;\n }\n if (xml.startsWith('<!', opening)) {\n throw new Error('Unsupported XML declaration.');\n }\n const closing = readTagEnd(xml, opening + 1);\n const parsed = parseAttributes(xml.slice(opening + 1, closing));\n const node: XmlNode = {\n name: parsed.name,\n attributes: parsed.attributes,\n children: [],\n };\n stack.at(-1)!.children.push(node);\n if (!parsed.selfClosing) stack.push(node);\n cursor = closing + 1;\n }\n if (stack.length !== 1) {\n throw new Error(`Malformed XML: unclosed <${stack.at(-1)!.name}> element.`);\n }\n const documentElements = root.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (documentElements.length !== 1) {\n throw new Error('XLIFF must contain exactly one document element.');\n }\n return documentElements[0];\n}\n\nfunction children(node: XmlNode, name: string): XmlNode[] {\n return node.children.filter(\n (child): child is XmlNode =>\n typeof child !== 'string' && localName(child.name) === name,\n );\n}\n\nfunction descendants(node: XmlNode, name: string): XmlNode[] {\n const found: XmlNode[] = [];\n for (const child of node.children) {\n if (typeof child === 'string') continue;\n if (localName(child.name) === name) found.push(child);\n found.push(...descendants(child, name));\n }\n return found;\n}\n\nfunction first(node: XmlNode, name: string): XmlNode | undefined {\n return children(node, name)[0];\n}\n\nfunction attribute(node: XmlNode, name: string): string | undefined {\n const direct = node.attributes[name];\n if (direct !== undefined) return direct;\n const entry = Object.entries(node.attributes).find(\n ([qualified]) => localName(qualified) === name,\n );\n return entry?.[1];\n}\n\nfunction serializeNode(node: XmlNode): string {\n const attributes = Object.entries(node.attributes)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n if (node.children.length === 0) return `<${node.name}${attributes}/>`;\n return `<${node.name}${attributes}>${node.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('')}</${node.name}>`;\n}\n\nfunction innerXml(\n node: XmlNode | undefined,\n supportedInline: Set<string>,\n options: XliffParseOptions,\n unitId?: string,\n): string | undefined {\n if (!node) return undefined;\n const visit = (parent: XmlNode): void => {\n for (const child of parent.children) {\n if (typeof child === 'string') continue;\n const name = localName(child.name);\n if (!supportedInline.has(name)) {\n options.onFinding?.({\n code: 'unsupported-inline',\n message: `Unsupported inline XLIFF element <${child.name}> was preserved.`,\n element: child.name,\n unitId,\n });\n }\n visit(child);\n }\n };\n visit(node);\n return node.children\n .map((child) =>\n typeof child === 'string' ? child : serializeNode(child),\n )\n .join('');\n}\n\nfunction plainText(node: XmlNode | undefined): string | undefined {\n if (!node) return undefined;\n return node.children\n .map((child) => (typeof child === 'string' ? child : plainText(child) ?? ''))\n .join('');\n}\n\nfunction metadata(node: XmlNode, name: string): string | undefined {\n return (\n node.attributes[`${PREFIX}:${name}`] ??\n node.attributes[`${LEGACY_PREFIX}:${name}`] ??\n attribute(node, name)\n );\n}\n\nfunction recognizedState(value: string | undefined): TranslationState | undefined {\n if (\n value === 'untranslated' ||\n value === 'machine' ||\n value === 'reviewed' ||\n value === 'stale'\n ) {\n return value;\n }\n if (value === 'final' || value === 'reviewed' || value === 'signed-off') {\n return 'reviewed';\n }\n if (value === 'translated') return 'machine';\n if (value === 'needs-review-translation') return 'stale';\n if (value === 'new' || value === 'initial') return 'untranslated';\n return undefined;\n}\n\nfunction commonDocument(root: XmlNode): Omit<\n ParsedTranslationExchangeDocument,\n 'sourceLanguage' | 'targetLanguages' | 'entries'\n> {\n return {\n schemaVersion: 1,\n ...(metadata(root, 'app-id') ? { appId: metadata(root, 'app-id') } : {}),\n ...(metadata(root, 'branch-id')\n ? { branchId: metadata(root, 'branch-id') }\n : {}),\n ...(metadata(root, 'exported-at')\n ? { exportedAt: metadata(root, 'exported-at') }\n : {}),\n ...(metadata(root, 'revision-watermark')\n ? { revisionWatermark: metadata(root, 'revision-watermark') }\n : {}),\n ...(metadata(root, 'contract-set-hash')\n ? { contractSetHash: metadata(root, 'contract-set-hash') }\n : {}),\n };\n}\n\nfunction mergeUnit(\n entries: Map<string, MutableParsedEntry>,\n unit: XmlNode,\n sourceText: string | undefined,\n targetText: string | undefined,\n targetLanguage: string | undefined,\n targetState: TranslationState | undefined,\n targetNote: string | undefined,\n description: string | undefined,\n): void {\n const key = metadata(unit, 'key') ?? attribute(unit, 'resname') ?? attribute(unit, 'name') ?? attribute(unit, 'id');\n if (!key) throw new Error('XLIFF unit is missing an id/key.');\n const namespace = metadata(unit, 'namespace');\n const identity = `${namespace ?? ''}\\u0000${key}`;\n let entry = entries.get(identity);\n if (!entry) {\n entry = {\n key,\n ...(namespace ? { namespace } : {}),\n kind: metadata(unit, 'kind') === 'semantic' ? 'semantic' : 'ui',\n format: metadata(unit, 'format') === 'icu' ? 'icu' : 'simple',\n ...(sourceText !== undefined ? { sourceText } : {}),\n ...(metadata(unit, 'key-version-id')\n ? { keyVersionId: metadata(unit, 'key-version-id') }\n : {}),\n ...(metadata(unit, 'source-hash')\n ? { sourceHash: metadata(unit, 'source-hash') }\n : {}),\n ...(metadata(unit, 'contract-hash')\n ? { contractHash: metadata(unit, 'contract-hash') }\n : {}),\n ...(metadata(unit, 'argument-signature')\n ? { argumentSignature: metadata(unit, 'argument-signature') }\n : {}),\n ...(description ? { description } : {}),\n translations: {},\n };\n entries.set(identity, entry);\n } else if (sourceText !== undefined && entry.sourceText !== sourceText) {\n throw new Error(`XLIFF source text conflicts for key \"${key}\".`);\n }\n if (targetLanguage && targetText !== undefined) {\n if (entry.translations[targetLanguage]) {\n throw new Error(\n `Duplicate XLIFF target for key \"${key}\" in ${targetLanguage}.`,\n );\n }\n entry.translations[targetLanguage] = {\n text: targetText,\n ...(targetState ? { state: targetState } : {}),\n ...(targetNote ? { note: targetNote } : {}),\n };\n }\n}\n\nfunction parse12(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n let sourceLanguage = attribute(root, 'source-language');\n const targetLanguages = new Set<string>();\n for (const file of descendants(root, 'file')) {\n sourceLanguage ??= attribute(file, 'source-language');\n const targetLanguage = attribute(file, 'target-language');\n if (targetLanguage) targetLanguages.add(targetLanguage);\n for (const unit of descendants(file, 'trans-unit')) {\n const id = attribute(unit, 'id');\n const sourceText = innerXml(first(unit, 'source'), INLINE_12, options, id);\n const target = first(unit, 'target');\n const language =\n attribute(target ?? unit, 'lang') ?? targetLanguage;\n if (language) targetLanguages.add(language);\n const notes = children(unit, 'note');\n const description = plainText(\n notes.find((note) => isNoteRole(attribute(note, 'from'), 'description')),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'from'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n mergeUnit(\n entries,\n unit,\n sourceText,\n innerXml(target, INLINE_12, options, id),\n language,\n recognizedState(metadata(target ?? unit, 'state') ?? attribute(target ?? unit, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n if (!sourceLanguage) throw new Error('XLIFF 1.2 source language is missing.');\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parse20(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n const sourceLanguage = attribute(root, 'srcLang');\n if (!sourceLanguage) throw new Error('XLIFF 2.0 srcLang is missing.');\n const targetLanguages = new Set<string>();\n const rootTargetLanguage = attribute(root, 'trgLang');\n if (rootTargetLanguage) targetLanguages.add(rootTargetLanguage);\n for (const file of descendants(root, 'file')) {\n const fileTargetLanguage =\n attribute(file, 'trgLang') ??\n metadata(file, 'target-language') ??\n rootTargetLanguage;\n if (fileTargetLanguage) targetLanguages.add(fileTargetLanguage);\n for (const unit of descendants(file, 'unit')) {\n const segment = first(unit, 'segment') ?? descendants(unit, 'segment')[0];\n if (!segment) continue;\n const target = first(segment, 'target');\n const language = attribute(target ?? unit, 'lang') ?? fileTargetLanguage;\n if (language) targetLanguages.add(language);\n const notesContainer = first(unit, 'notes');\n const notes = notesContainer ? children(notesContainer, 'note') : [];\n const description = plainText(\n notes.find(\n (note) => isNoteRole(attribute(note, 'category'), 'description'),\n ),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'category'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n const id = attribute(unit, 'id');\n mergeUnit(\n entries,\n unit,\n innerXml(first(segment, 'source'), INLINE_20, options, id),\n innerXml(target, INLINE_20, options, id),\n language,\n recognizedState(metadata(segment, 'state') ?? attribute(segment, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parseXliff(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n options: XliffParseOptions = {},\n): ParsedTranslationExchangeDocument {\n const root = parseXml(text(input));\n if (localName(root.name) !== 'xliff') {\n throw new Error('Document is not XLIFF.');\n }\n const version = attribute(root, 'version');\n if (version !== expectedVersion) {\n throw new Error(\n `Expected XLIFF ${expectedVersion}, received ${version ?? 'an unknown version'}.`,\n );\n }\n return version === '1.2' ? parse12(root, options) : parse20(root, options);\n}\n\nfunction deterministicId(entry: TranslationExchangeEntry, index: number): string {\n const identity = `${entry.namespace ?? 'default'}:${entry.key}`;\n return `u${index + 1}-${encodeURIComponent(identity).replaceAll('%', '_')}`;\n}\n\nfunction state12(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'needs-review-translation';\n if (state === 'machine') return 'translated';\n return 'new';\n}\n\nfunction state20(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'translated';\n if (state === 'machine') return 'translated';\n return 'initial';\n}\n\nfunction metadataAttributes(entry: TranslationExchangeEntry): string {\n return [\n [`${PREFIX}:key`, entry.key],\n [`${PREFIX}:namespace`, entry.namespace],\n [`${PREFIX}:kind`, entry.kind],\n [`${PREFIX}:format`, entry.format],\n [`${PREFIX}:key-version-id`, entry.keyVersionId],\n [`${PREFIX}:source-hash`, entry.sourceHash],\n [`${PREFIX}:contract-hash`, entry.contractHash],\n [`${PREFIX}:argument-signature`, entry.argumentSignature],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction rootMetadata(document: TranslationExchangeDocument): string {\n return [\n [`${PREFIX}:schema-version`, String(document.schemaVersion)],\n [`${PREFIX}:app-id`, document.appId],\n [`${PREFIX}:branch-id`, document.branchId],\n [`${PREFIX}:exported-at`, document.exportedAt],\n [`${PREFIX}:revision-watermark`, document.revisionWatermark],\n [`${PREFIX}:contract-set-hash`, document.contractSetHash],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction validatedMixedContent(value: string, inline: Set<string>): string {\n if (!value.includes('<')) return escapeText(value);\n try {\n const wrapper = parseXml(`<cn-wrapper>${value}</cn-wrapper>`);\n const nodes = wrapper.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (\n nodes.length === 0 ||\n nodes.some((node) => !inline.has(localName(node.name)))\n ) {\n return escapeText(value);\n }\n return wrapper.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('');\n } catch {\n return escapeText(value);\n }\n}\n\nfunction targets(document: TranslationExchangeDocument): Array<string | undefined> {\n return document.targetLanguages.length > 0\n ? document.targetLanguages\n : [undefined];\n}\n\nfunction serialize12(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes = [\n entry.description\n ? `<note from=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : '',\n target?.note\n ? `<note from=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : '',\n ].join('');\n return `<trans-unit id=\"${escapeAttribute(id)}\" resname=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}><source>${validatedMixedContent(entry.sourceText, INLINE_12)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\" state=\"${state12(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\">${validatedMixedContent(target?.text ?? '', INLINE_12)}</target>`\n : ''\n }${notes}</trans-unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\" original=\"linked\" datatype=\"plaintext\" source-language=\"${escapeAttribute(document.sourceLanguage)}\"${\n language ? ` target-language=\"${escapeAttribute(language)}\"` : ''\n }><body>${units}</body></file>`;\n })\n .join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_12_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"1.2\"${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction serialize20(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes =\n entry.description || target?.note\n ? `<notes>${\n entry.description\n ? `<note category=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : ''\n }${\n target?.note\n ? `<note category=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : ''\n }</notes>`\n : '';\n return `<unit id=\"${escapeAttribute(id)}\" name=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}>${notes}<segment id=\"s1\" state=\"${state20(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\"><source>${validatedMixedContent(entry.sourceText, INLINE_20)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\">${validatedMixedContent(target?.text ?? '', INLINE_20)}</target>`\n : ''\n }</segment></unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\"${\n language ? ` ${PREFIX}:target-language=\"${escapeAttribute(language)}\"` : ''\n }>${units}</file>`;\n })\n .join('');\n const singleTarget =\n document.targetLanguages.length === 1\n ? ` trgLang=\"${escapeAttribute(document.targetLanguages[0])}\"`\n : '';\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_20_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"2.0\" srcLang=\"${escapeAttribute(document.sourceLanguage)}\"${singleTarget}${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction sniffVersion(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n fileName?: string,\n): boolean {\n if (fileName && !/\\.xlf(f)?$/i.test(fileName)) return false;\n const prefix = text(input.slice(0, Math.min(input.length, 4096)));\n return (\n /<(?:(?:[\\w.-]+):)?xliff\\b/i.test(prefix) &&\n new RegExp(`\\\\bversion\\\\s*=\\\\s*[\"']${expectedVersion.replace('.', '\\\\.')}[\"']`).test(prefix)\n );\n}\n\nexport const xliff12Adapter: TranslationFormatAdapter = {\n format: 'xliff-1.2',\n sniff: (input, fileName) => sniffVersion(input, '1.2', fileName),\n parse: async (input, options) =>\n parseXliff(input, '1.2', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize12(document)),\n }),\n};\n\nexport const xliff20Adapter: TranslationFormatAdapter = {\n format: 'xliff-2.0',\n sniff: (input, fileName) => sniffVersion(input, '2.0', fileName),\n parse: async (input, options) =>\n parseXliff(input, '2.0', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize20(document)),\n }),\n};\n"]}
@@ -3,11 +3,18 @@ export declare var loadData: () => Promise<{
3
3
  "@context": {
4
4
  rdf: string;
5
5
  rdfs: string;
6
- tr: string;
6
+ translation: string;
7
7
  };
8
8
  "@graph": any[];
9
9
  }>;
10
- /** Vocabulary namespace for the translation package. */
10
+ /**
11
+ * Public ontology namespace for the translation package. First-party Linked
12
+ * ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
13
+ * the ontology slug — and the prefix label — is the package's public slug
14
+ * (Create Now arch-02, "Public ontology namespace"). So terms are
15
+ * `https://linked.cm/ont/translation/TranslationKey` and the prefix is
16
+ * `translation:`. Before 0.5.0 this was `https://id.linked.cm/translation/vocab#`.
17
+ */
11
18
  export declare var ns: (term: string) => import("@_linked/core/utils/NodeReference").NodeReferenceValue;
12
19
  export declare var _self: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
13
20
  export declare var TranslationKey: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
@@ -4,8 +4,15 @@ export var loadData = () => {
4
4
  //@ts-ignore
5
5
  return import('../data/translation.json', { with: { type: 'json' } }).then((data) => data.default);
6
6
  };
7
- /** Vocabulary namespace for the translation package. */
8
- export var ns = createNameSpace('https://id.linked.cm/translation/vocab#');
7
+ /**
8
+ * Public ontology namespace for the translation package. First-party Linked
9
+ * ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
10
+ * the ontology slug — and the prefix label — is the package's public slug
11
+ * (Create Now arch-02, "Public ontology namespace"). So terms are
12
+ * `https://linked.cm/ont/translation/TranslationKey` and the prefix is
13
+ * `translation:`. Before 0.5.0 this was `https://id.linked.cm/translation/vocab#`.
14
+ */
15
+ export var ns = createNameSpace('https://linked.cm/ont/translation/');
9
16
  export var _self = ns('');
10
17
  // ── Classes ─────────────────────────────────────────────────────────────
11
18
  export var TranslationKey = ns('TranslationKey');
@@ -1 +1 @@
1
- {"version":3,"file":"translation.js","sourceRoot":"","sources":["../../../src/ontologies/translation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNameSpace } from '@_linked/core/utils/NameSpace';\n\n/** Lazy-load the (currently empty) serialized ontology graph. */\nexport var loadData = () => {\n //@ts-ignore\n return import('../data/translation.json', { with: { type: 'json' } }).then(\n (data) => data.default\n );\n};\n\n/** Vocabulary namespace for the translation package. */\nexport var ns = createNameSpace('https://id.linked.cm/translation/vocab#');\nexport var _self = ns('');\n\n// ── Classes ─────────────────────────────────────────────────────────────\nexport var TranslationKey = ns('TranslationKey');\nexport var TranslationKeyVersion = ns('TranslationKeyVersion');\nexport var TranslationRelease = ns('TranslationRelease');\nexport var TranslationUnit = ns('TranslationUnit');\nexport var TranslationRevision = ns('TranslationRevision');\nexport var GlossaryTerm = ns('GlossaryTerm');\nexport var TranslationInventoryOrigin = ns('TranslationInventoryOrigin');\n\n// Open language resources; BCP-47 is a string identifier, not an enum.\nexport var TranslationLanguage = ns('TranslationLanguage');\nexport var languageIdentifier = ns('languageIdentifier');\nexport var languageCode = ns('languageCode');\nexport var nativeName = ns('nativeName');\nexport var englishName = ns('englishName');\nexport var textDirection = ns('textDirection');\nexport var parentLanguage = ns('parentLanguage');\nexport var fallbackLanguage = ns('fallbackLanguage');\nexport var languageEnabled = ns('languageEnabled');\nexport var languageSupported = ns('languageSupported');\n\n// ── TranslationKey properties ───────────────────────────────────────────\nexport var namespace = ns('namespace');\nexport var key = ns('key');\nexport var sourceText = ns('sourceText'); // canonical English (Plan 014 AD-J/R7)\nexport var description = ns('description');\nexport var kind = ns('kind'); // 'ui' | 'content' (AD-I)\nexport var ofApplication = ns('ofApplication'); // owning app IRI (AD-H/R2)\nexport var ofNode = ns('ofNode'); // content-translation subject (kind:'content')\nexport var ofField = ns('ofField');\nexport var ofShape = ns('ofShape'); // semantic SHACL shape context for package keys\nexport var ofProperty = ns('ofProperty'); // semantic predicate context for package keys\nexport var fromPackage = ns('fromPackage'); // package that supplied a seed catalog\nexport var overridden = ns('overridden'); // app diverged this shape key from canonical → excluded from shape propagation (AD-N)\nexport var shapeSource = ns('shapeSource'); // canonical source snapshot at override time → the value \"clear override\" reverts to (AD-N)\nexport var format = ns('format'); // 'simple' | 'icu' (AD-J/R8)\nexport var currentVersion = ns('currentVersion'); // → TranslationKeyVersion\n\n// ── TranslationKeyVersion properties (Plan 018) ────────────────────────\nexport var versionId = ns('versionId');\nexport var sourceLanguage = ns('sourceLanguage');\nexport var argumentSignature = ns('argumentSignature');\nexport var contractHash = ns('contractHash');\nexport var sourceHash = ns('sourceHash');\nexport var supersedes = ns('supersedes');\nexport var createdBy = ns('createdBy');\n\n// ── TranslationRelease properties (Plan 018) ───────────────────────────\nexport var branch = ns('branch');\nexport var releaseId = ns('releaseId');\nexport var buildId = ns('buildId');\nexport var channel = ns('channel');\nexport var contractSetHash = ns('contractSetHash');\nexport var manifestHash = ns('manifestHash');\nexport var hotfixSequence = ns('hotfixSequence');\nexport var publishedAt = ns('publishedAt');\nexport var supportedUntil = ns('supportedUntil');\nexport var qualitySummary = ns('qualitySummary');\n\n// ── CapabilityAppConfig properties (stored in Create Now's cn-main) ────\nexport var languages = ns('languages'); // active BCP-47 tags, including source\nexport var defaultLanguage = ns('defaultLanguage'); // authored/source language\nexport var cdnTarget = ns('cdnTarget'); // delivery base URL / bucket prefix — the \"repoint\" knob (AD-K, P2)\nexport var autoPublish = ns('autoPublish'); // boolean — overridable auto-publish-on-edit toggle (P2, default off)\nexport var reviewedOnlyLanguage = ns('reviewedOnlyLanguage'); // BCP-47 tags published reviewed-only; absence ⇒ machine-ok (AD-K/R9, P2)\nexport var mtDefault = ns('mtDefault'); // default MT provider key (AD-L, unused until P4)\nexport var mtFormality = ns('mtFormality'); // multi-value: \"formal\" (app default) or \"de:informal\" (per-language) — Plan 017 §7.4b\nexport var mtStyleNote = ns('mtStyleNote'); // free-text tone guidance fed to LLM MT providers (Plan 017 §7.4b)\n\n// ── TranslationUnit properties ──────────────────────────────────────────\nexport var ofKey = ns('ofKey'); // → TranslationKey\nexport var ofKeyVersion = ns('ofKeyVersion'); // → TranslationKeyVersion\nexport var language = ns('language'); // BCP-47 tag\nexport var text = ns('text');\nexport var state = ns('state'); // untranslated | machine | reviewed | stale\nexport var updatedAt = ns('updatedAt');\nexport var updatedBy = ns('updatedBy');\nexport var origin = ns('origin'); // current-value provenance, e.g. `tm`\n\n// ── TranslationRevision properties (Plan 017 AD-P) ─────────────────────\n// One append-only node per authored value: history (`applied`), translator\n// proposals (`proposed`), and MT suggestions (`suggested`) share the shape.\nexport var status = ns('status'); // applied | proposed | suggested | accepted | rejected | superseded\nexport var author = ns('author'); // WebID or MT provider IRI\nexport var authorKind = ns('authorKind'); // 'human' | 'machine'\nexport var mtProvider = ns('mtProvider'); // provider key when authorKind=machine\nexport var basedOnText = ns('basedOnText'); // unit text at authoring time (conflict detection)\nexport var note = ns('note'); // translator/reviewer comment\nexport var createdAt = ns('createdAt');\nexport var decidedAt = ns('decidedAt'); // when a proposal/suggestion was accepted/rejected\nexport var decidedBy = ns('decidedBy'); // WebID of the reviewer\n\n// ── GlossaryTerm properties ─────────────────────────────────────────────\nexport var term = ns('term');\nexport var glossaryTranslation = ns('glossaryTranslation');\nexport var glossaryLanguage = ns('glossaryLanguage');\nexport var termType = ns('termType'); // prefer | require | keep | forbid (Plan 017 B2-1 termbase)\nexport var useInstead = ns('useInstead'); // replacement for a forbidden term/spelling\nexport var caseSensitive = ns('caseSensitive'); // boolean — exact-casing matching (proper nouns)\n\n// ── Branch translation inventory metadata (Plan 017 Phase 8b) ─────────\n// These records are materialized into the active branch metadata dataset,\n// never app data. Confirmed TranslationKey/TranslationUnit records retain\n// their existing app-data placement.\nexport var inventoryBranch = ns('inventoryBranch');\nexport var inventoryIdentity = ns('inventoryIdentity');\nexport var inventoryStatus = ns('inventoryStatus');\nexport var inventorySource = ns('inventorySource');\nexport var inventorySourceId = ns('inventorySourceId');\nexport var inventoryAuthoritative = ns('inventoryAuthoritative');\nexport var inventoryFile = ns('inventoryFile');\nexport var inventoryLine = ns('inventoryLine');\nexport var inventoryOwner = ns('inventoryOwner');\nexport var inventoryShape = ns('inventoryShape');\nexport var inventoryProperty = ns('inventoryProperty');\nexport var inventoryNode = ns('inventoryNode');\nexport var inventoryTargetClass = ns('inventoryTargetClass');\nexport var inventoryObservedAt = ns('inventoryObservedAt');\n\n/** Grouped export for prefix/name access. */\nexport const tr = {\n TranslationLanguage,\n languageIdentifier,\n languageCode,\n nativeName,\n englishName,\n textDirection,\n parentLanguage,\n fallbackLanguage,\n languageEnabled,\n languageSupported,\n TranslationKey,\n TranslationKeyVersion,\n TranslationRelease,\n TranslationUnit,\n TranslationRevision,\n GlossaryTerm,\n TranslationInventoryOrigin,\n namespace,\n key,\n sourceText,\n description,\n kind,\n ofApplication,\n ofNode,\n ofField,\n ofShape,\n ofProperty,\n fromPackage,\n overridden,\n shapeSource,\n format,\n currentVersion,\n versionId,\n sourceLanguage,\n argumentSignature,\n contractHash,\n sourceHash,\n supersedes,\n createdBy,\n branch,\n releaseId,\n buildId,\n channel,\n contractSetHash,\n manifestHash,\n hotfixSequence,\n publishedAt,\n supportedUntil,\n qualitySummary,\n languages,\n defaultLanguage,\n cdnTarget,\n autoPublish,\n reviewedOnlyLanguage,\n mtDefault,\n mtFormality,\n mtStyleNote,\n ofKey,\n ofKeyVersion,\n language,\n text,\n state,\n updatedAt,\n updatedBy,\n origin,\n status,\n author,\n authorKind,\n mtProvider,\n basedOnText,\n note,\n createdAt,\n decidedAt,\n decidedBy,\n term,\n glossaryTranslation,\n glossaryLanguage,\n termType,\n useInstead,\n caseSensitive,\n inventoryBranch,\n inventoryIdentity,\n inventoryStatus,\n inventorySource,\n inventorySourceId,\n inventoryAuthoritative,\n inventoryFile,\n inventoryLine,\n inventoryOwner,\n inventoryShape,\n inventoryProperty,\n inventoryNode,\n inventoryTargetClass,\n inventoryObservedAt,\n};\n\n"]}
1
+ {"version":3,"file":"translation.js","sourceRoot":"","sources":["../../../src/ontologies/translation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNameSpace } from '@_linked/core/utils/NameSpace';\n\n/** Lazy-load the (currently empty) serialized ontology graph. */\nexport var loadData = () => {\n //@ts-ignore\n return import('../data/translation.json', { with: { type: 'json' } }).then(\n (data) => data.default\n );\n};\n\n/**\n * Public ontology namespace for the translation package. First-party Linked\n * ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where\n * the ontology slug — and the prefix label — is the package's public slug\n * (Create Now arch-02, \"Public ontology namespace\"). So terms are\n * `https://linked.cm/ont/translation/TranslationKey` and the prefix is\n * `translation:`. Before 0.5.0 this was `https://id.linked.cm/translation/vocab#`.\n */\nexport var ns = createNameSpace('https://linked.cm/ont/translation/');\nexport var _self = ns('');\n\n// ── Classes ─────────────────────────────────────────────────────────────\nexport var TranslationKey = ns('TranslationKey');\nexport var TranslationKeyVersion = ns('TranslationKeyVersion');\nexport var TranslationRelease = ns('TranslationRelease');\nexport var TranslationUnit = ns('TranslationUnit');\nexport var TranslationRevision = ns('TranslationRevision');\nexport var GlossaryTerm = ns('GlossaryTerm');\nexport var TranslationInventoryOrigin = ns('TranslationInventoryOrigin');\n\n// Open language resources; BCP-47 is a string identifier, not an enum.\nexport var TranslationLanguage = ns('TranslationLanguage');\nexport var languageIdentifier = ns('languageIdentifier');\nexport var languageCode = ns('languageCode');\nexport var nativeName = ns('nativeName');\nexport var englishName = ns('englishName');\nexport var textDirection = ns('textDirection');\nexport var parentLanguage = ns('parentLanguage');\nexport var fallbackLanguage = ns('fallbackLanguage');\nexport var languageEnabled = ns('languageEnabled');\nexport var languageSupported = ns('languageSupported');\n\n// ── TranslationKey properties ───────────────────────────────────────────\nexport var namespace = ns('namespace');\nexport var key = ns('key');\nexport var sourceText = ns('sourceText'); // canonical English (Plan 014 AD-J/R7)\nexport var description = ns('description');\nexport var kind = ns('kind'); // 'ui' | 'content' (AD-I)\nexport var ofApplication = ns('ofApplication'); // owning app IRI (AD-H/R2)\nexport var ofNode = ns('ofNode'); // content-translation subject (kind:'content')\nexport var ofField = ns('ofField');\nexport var ofShape = ns('ofShape'); // semantic SHACL shape context for package keys\nexport var ofProperty = ns('ofProperty'); // semantic predicate context for package keys\nexport var fromPackage = ns('fromPackage'); // package that supplied a seed catalog\nexport var overridden = ns('overridden'); // app diverged this shape key from canonical → excluded from shape propagation (AD-N)\nexport var shapeSource = ns('shapeSource'); // canonical source snapshot at override time → the value \"clear override\" reverts to (AD-N)\nexport var format = ns('format'); // 'simple' | 'icu' (AD-J/R8)\nexport var currentVersion = ns('currentVersion'); // → TranslationKeyVersion\n\n// ── TranslationKeyVersion properties (Plan 018) ────────────────────────\nexport var versionId = ns('versionId');\nexport var sourceLanguage = ns('sourceLanguage');\nexport var argumentSignature = ns('argumentSignature');\nexport var contractHash = ns('contractHash');\nexport var sourceHash = ns('sourceHash');\nexport var supersedes = ns('supersedes');\nexport var createdBy = ns('createdBy');\n\n// ── TranslationRelease properties (Plan 018) ───────────────────────────\nexport var branch = ns('branch');\nexport var releaseId = ns('releaseId');\nexport var buildId = ns('buildId');\nexport var channel = ns('channel');\nexport var contractSetHash = ns('contractSetHash');\nexport var manifestHash = ns('manifestHash');\nexport var hotfixSequence = ns('hotfixSequence');\nexport var publishedAt = ns('publishedAt');\nexport var supportedUntil = ns('supportedUntil');\nexport var qualitySummary = ns('qualitySummary');\n\n// ── CapabilityAppConfig properties (stored in Create Now's cn-main) ────\nexport var languages = ns('languages'); // active BCP-47 tags, including source\nexport var defaultLanguage = ns('defaultLanguage'); // authored/source language\nexport var cdnTarget = ns('cdnTarget'); // delivery base URL / bucket prefix — the \"repoint\" knob (AD-K, P2)\nexport var autoPublish = ns('autoPublish'); // boolean — overridable auto-publish-on-edit toggle (P2, default off)\nexport var reviewedOnlyLanguage = ns('reviewedOnlyLanguage'); // BCP-47 tags published reviewed-only; absence ⇒ machine-ok (AD-K/R9, P2)\nexport var mtDefault = ns('mtDefault'); // default MT provider key (AD-L, unused until P4)\nexport var mtFormality = ns('mtFormality'); // multi-value: \"formal\" (app default) or \"de:informal\" (per-language) — Plan 017 §7.4b\nexport var mtStyleNote = ns('mtStyleNote'); // free-text tone guidance fed to LLM MT providers (Plan 017 §7.4b)\n\n// ── TranslationUnit properties ──────────────────────────────────────────\nexport var ofKey = ns('ofKey'); // → TranslationKey\nexport var ofKeyVersion = ns('ofKeyVersion'); // → TranslationKeyVersion\nexport var language = ns('language'); // BCP-47 tag\nexport var text = ns('text');\nexport var state = ns('state'); // untranslated | machine | reviewed | stale\nexport var updatedAt = ns('updatedAt');\nexport var updatedBy = ns('updatedBy');\nexport var origin = ns('origin'); // current-value provenance, e.g. `tm`\n\n// ── TranslationRevision properties (Plan 017 AD-P) ─────────────────────\n// One append-only node per authored value: history (`applied`), translator\n// proposals (`proposed`), and MT suggestions (`suggested`) share the shape.\nexport var status = ns('status'); // applied | proposed | suggested | accepted | rejected | superseded\nexport var author = ns('author'); // WebID or MT provider IRI\nexport var authorKind = ns('authorKind'); // 'human' | 'machine'\nexport var mtProvider = ns('mtProvider'); // provider key when authorKind=machine\nexport var basedOnText = ns('basedOnText'); // unit text at authoring time (conflict detection)\nexport var note = ns('note'); // translator/reviewer comment\nexport var createdAt = ns('createdAt');\nexport var decidedAt = ns('decidedAt'); // when a proposal/suggestion was accepted/rejected\nexport var decidedBy = ns('decidedBy'); // WebID of the reviewer\n\n// ── GlossaryTerm properties ─────────────────────────────────────────────\nexport var term = ns('term');\nexport var glossaryTranslation = ns('glossaryTranslation');\nexport var glossaryLanguage = ns('glossaryLanguage');\nexport var termType = ns('termType'); // prefer | require | keep | forbid (Plan 017 B2-1 termbase)\nexport var useInstead = ns('useInstead'); // replacement for a forbidden term/spelling\nexport var caseSensitive = ns('caseSensitive'); // boolean — exact-casing matching (proper nouns)\n\n// ── Branch translation inventory metadata (Plan 017 Phase 8b) ─────────\n// These records are materialized into the active branch metadata dataset,\n// never app data. Confirmed TranslationKey/TranslationUnit records retain\n// their existing app-data placement.\nexport var inventoryBranch = ns('inventoryBranch');\nexport var inventoryIdentity = ns('inventoryIdentity');\nexport var inventoryStatus = ns('inventoryStatus');\nexport var inventorySource = ns('inventorySource');\nexport var inventorySourceId = ns('inventorySourceId');\nexport var inventoryAuthoritative = ns('inventoryAuthoritative');\nexport var inventoryFile = ns('inventoryFile');\nexport var inventoryLine = ns('inventoryLine');\nexport var inventoryOwner = ns('inventoryOwner');\nexport var inventoryShape = ns('inventoryShape');\nexport var inventoryProperty = ns('inventoryProperty');\nexport var inventoryNode = ns('inventoryNode');\nexport var inventoryTargetClass = ns('inventoryTargetClass');\nexport var inventoryObservedAt = ns('inventoryObservedAt');\n\n/** Grouped export for prefix/name access. */\nexport const tr = {\n TranslationLanguage,\n languageIdentifier,\n languageCode,\n nativeName,\n englishName,\n textDirection,\n parentLanguage,\n fallbackLanguage,\n languageEnabled,\n languageSupported,\n TranslationKey,\n TranslationKeyVersion,\n TranslationRelease,\n TranslationUnit,\n TranslationRevision,\n GlossaryTerm,\n TranslationInventoryOrigin,\n namespace,\n key,\n sourceText,\n description,\n kind,\n ofApplication,\n ofNode,\n ofField,\n ofShape,\n ofProperty,\n fromPackage,\n overridden,\n shapeSource,\n format,\n currentVersion,\n versionId,\n sourceLanguage,\n argumentSignature,\n contractHash,\n sourceHash,\n supersedes,\n createdBy,\n branch,\n releaseId,\n buildId,\n channel,\n contractSetHash,\n manifestHash,\n hotfixSequence,\n publishedAt,\n supportedUntil,\n qualitySummary,\n languages,\n defaultLanguage,\n cdnTarget,\n autoPublish,\n reviewedOnlyLanguage,\n mtDefault,\n mtFormality,\n mtStyleNote,\n ofKey,\n ofKeyVersion,\n language,\n text,\n state,\n updatedAt,\n updatedBy,\n origin,\n status,\n author,\n authorKind,\n mtProvider,\n basedOnText,\n note,\n createdAt,\n decidedAt,\n decidedBy,\n term,\n glossaryTranslation,\n glossaryLanguage,\n termType,\n useInstead,\n caseSensitive,\n inventoryBranch,\n inventoryIdentity,\n inventoryStatus,\n inventorySource,\n inventorySourceId,\n inventoryAuthoritative,\n inventoryFile,\n inventoryLine,\n inventoryOwner,\n inventoryShape,\n inventoryProperty,\n inventoryNode,\n inventoryTargetClass,\n inventoryObservedAt,\n};\n\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@_linked/translation",
3
3
  "description": "LINKED translation management — graph-native i18n keys + units, Tolgee-compatible client, CDN delivery. Built inside Create Now for now; structured to extract to its own repo unchanged.",
4
- "version": "0.4.5",
4
+ "version": "0.5.0",
5
5
  "packageManager": "npm@11.20.0",
6
6
  "linkedPackage": true,
7
7
  "type": "module",
@@ -110,17 +110,17 @@
110
110
  },
111
111
  "devDependencies": {
112
112
  "@_linked/cli": "^1.11.1",
113
+ "@changesets/changelog-github": "^1.0.0",
114
+ "@changesets/cli": "^3.0.0",
113
115
  "@testing-library/dom": "^10.4.1",
114
116
  "@testing-library/react": "^16.3.0",
115
117
  "@types/node": "^24.0.0",
116
- "@types/react": "^18.3.24",
117
- "@types/react-dom": "^18.3.7",
118
- "jsdom": "^26.1.0",
119
- "react": "^18.3.1",
120
- "react-dom": "^18.3.1",
118
+ "@types/react": "^19.3.0",
119
+ "@types/react-dom": "^19.3.0",
120
+ "jsdom": "^30.0.0",
121
+ "react": "^19.3.0",
122
+ "react-dom": "^19.3.0",
121
123
  "typescript": "5.9.3",
122
- "vitest": "^3.2.4",
123
- "@changesets/cli": "^3.0.0",
124
- "@changesets/changelog-github": "^1.0.0"
124
+ "vitest": "^3.2.4"
125
125
  }
126
126
  }
package/src/cdn-loader.ts CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  /**
7
7
  * `loadMessages` factory for the CDN delivery cascade (Plan 016 P2.4, AD-J/AD-K).
8
8
  * SIMPLE-POINTER mode (the ratified default): fetch `${base}/{lang}.json` from
9
- * the published CDN — changing `base` (an app's `tr:cdnTarget`) repoints at
9
+ * the published CDN — changing `base` (an app's `translation:cdnTarget`) repoints at
10
10
  * different cloud files with no call-site change, exactly the Tolgee model.
11
11
  * `bundledPath` (same-origin bundled copy) and `devApi` (e.g. the `getMessages`
12
12
  * RPC for live dev editing) are optional fallbacks, tried in the order given.
@@ -2,7 +2,7 @@
2
2
  "@context": {
3
3
  "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
4
4
  "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
5
- "tr": "https://id.linked.cm/translation/vocab#"
5
+ "translation": "https://linked.cm/ont/translation/"
6
6
  },
7
7
  "@graph": []
8
8
  }
@@ -11,8 +11,9 @@ import type { TranslationState } from '../records.js';
11
11
 
12
12
  const UTF8 = new TextEncoder();
13
13
  /**
14
- * Our own metadata namespace, a sibling of the translation vocabulary
15
- * (`https://id.linked.cm/translation/vocab#`). Files exported before 0.3.0
14
+ * Our own XML metadata namespace for exchange files. It is a file-format
15
+ * identifier written into exported documents, not the translation ontology
16
+ * (which lives at `https://linked.cm/ont/translation/`). Files exported before 0.3.0
16
17
  * used a Create Now URI and a `cn:` prefix; the reader below still accepts
17
18
  * both, so those files keep importing.
18
19
  */
@@ -8,8 +8,15 @@ export var loadData = () => {
8
8
  );
9
9
  };
10
10
 
11
- /** Vocabulary namespace for the translation package. */
12
- export var ns = createNameSpace('https://id.linked.cm/translation/vocab#');
11
+ /**
12
+ * Public ontology namespace for the translation package. First-party Linked
13
+ * ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
14
+ * the ontology slug — and the prefix label — is the package's public slug
15
+ * (Create Now arch-02, "Public ontology namespace"). So terms are
16
+ * `https://linked.cm/ont/translation/TranslationKey` and the prefix is
17
+ * `translation:`. Before 0.5.0 this was `https://id.linked.cm/translation/vocab#`.
18
+ */
19
+ export var ns = createNameSpace('https://linked.cm/ont/translation/');
13
20
  export var _self = ns('');
14
21
 
15
22
  // ── Classes ─────────────────────────────────────────────────────────────