@_linked/translation 0.6.0 → 0.8.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 +18 -17
- package/lib/esm/archive.d.ts +2 -2
- package/lib/esm/archive.js +2 -2
- package/lib/esm/archive.js.map +1 -1
- package/lib/esm/authorization.d.ts +1 -1
- package/lib/esm/authorization.js +1 -1
- package/lib/esm/authorization.js.map +1 -1
- package/lib/esm/cdn-loader.d.ts +1 -1
- package/lib/esm/cdn-loader.js.map +1 -1
- package/lib/esm/core/messages.d.ts +14 -1
- package/lib/esm/core/messages.js +33 -2
- package/lib/esm/core/messages.js.map +1 -1
- package/lib/esm/exchange.d.ts +1 -1
- package/lib/esm/exchange.js +1 -1
- package/lib/esm/exchange.js.map +1 -1
- package/lib/esm/export.js +4 -1
- package/lib/esm/export.js.map +1 -1
- package/lib/esm/formats/xliff.js +1 -1
- package/lib/esm/formats/xliff.js.map +1 -1
- package/lib/esm/key-sync.d.ts +12 -0
- package/lib/esm/key-sync.js +32 -7
- package/lib/esm/key-sync.js.map +1 -1
- package/lib/esm/mt.js +1 -1
- package/lib/esm/mt.js.map +1 -1
- package/lib/esm/ontologies/translation.d.ts +3 -1
- package/lib/esm/ontologies/translation.js +4 -2
- package/lib/esm/ontologies/translation.js.map +1 -1
- package/lib/esm/package.js +4 -9
- package/lib/esm/package.js.map +1 -1
- package/lib/esm/react.d.ts +38 -2
- package/lib/esm/react.js +98 -15
- package/lib/esm/react.js.map +1 -1
- package/lib/esm/records.d.ts +2 -1
- package/lib/esm/records.js.map +1 -1
- package/lib/esm/release.d.ts +3 -1
- package/lib/esm/release.js +21 -4
- package/lib/esm/release.js.map +1 -1
- package/lib/esm/shape-catalog.d.ts +1 -1
- package/lib/esm/shape-catalog.js.map +1 -1
- package/lib/esm/shapes/TranslationKey.d.ts +10 -5
- package/lib/esm/shapes/TranslationKey.js +16 -5
- package/lib/esm/shapes/TranslationKey.js.map +1 -1
- package/lib/esm/shapes/TranslationProvider.d.ts +25 -8
- package/lib/esm/shapes/TranslationProvider.js +50 -19
- package/lib/esm/shapes/TranslationProvider.js.map +1 -1
- package/package.json +3 -3
- package/src/archive.ts +2 -2
- package/src/authorization.ts +1 -1
- package/src/cdn-loader.ts +1 -1
- package/src/core/messages.ts +35 -2
- package/src/exchange.ts +1 -1
- package/src/export.ts +4 -1
- package/src/formats/xliff.ts +1 -1
- package/src/key-sync.ts +46 -6
- package/src/mt.ts +1 -1
- package/src/ontologies/translation.ts +4 -2
- package/src/package.ts +4 -9
- package/src/react.tsx +158 -35
- package/src/records.ts +2 -1
- package/src/release.ts +31 -3
- package/src/shape-catalog.ts +1 -1
- package/src/shapes/TranslationKey.ts +14 -5
- package/src/shapes/TranslationProvider.ts +73 -13
package/lib/esm/mt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mt.js","sourceRoot":"","sources":["../../src/mt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Machine-translation provider registry (Plan 014 AD-L / Plan 017 Slice B).\n * Providers implement one method — translate a batch of UI strings — and\n * register by key ('claude', 'deepl', …). Resolution is PER TARGET LANGUAGE\n * with a fallback chain: not every provider covers every language (DeepL has\n * no Swahili or Urdu), so the preferred provider is used where it supports\n * the target and the chain falls through otherwise. Pure module: no I/O, no\n * SDK imports — concrete providers live with the host (Create Now) and are\n * registered at boot.\n */\nimport {\n analyzeMessage,\n compareMessageArguments,\n} from './message-format.js';\nimport type { MessageFormat } from './core/messages.js';\n\nexport interface MtItem {\n key: string;\n sourceText: string;\n /** Authoring context shown to the translator/model. */\n description?: string;\n format?: 'simple' | 'icu';\n}\n\nexport interface MtGlossaryEntry {\n term: string;\n /** prefer (default) = translate as `translation`; keep = do-not-translate; forbid = never use. */\n termType?: 'prefer' | 'require' | 'keep' | 'forbid';\n /** Preferred translation (prefer entries); empty/undefined = keep the term as-is. */\n translation?: string;\n /** Replacement wording (forbid entries). */\n useInstead?: string;\n /** Target language this applies to; empty = all languages. */\n language?: string;\n /** Exact-casing matching (proper nouns / brand styling). */\n caseSensitive?: boolean;\n description?: string;\n}\n\n/** Register/tone controls (Plan 017 §7.4b) — NOT sampling temperature. */\nexport interface MtStyle {\n formality?: 'formal' | 'informal';\n /** Free-text tone guidance, e.g. \"friendly, energetic, no bureaucratese\". */\n note?: string;\n}\n\n/** An established translation the provider should stay consistent with. */\nexport interface MtReference {\n sourceText: string;\n text: string;\n}\n\nexport interface MtBatchRequest {\n sourceLanguage: string;\n targetLanguage: string;\n items: MtItem[];\n glossary: MtGlossaryEntry[];\n style?: MtStyle;\n /** Translation-memory context: reviewed units for consistency (Plan 017 §7.4c). */\n references?: MtReference[];\n}\n\nexport interface MtBatchResult {\n key: string;\n text: string;\n}\n\nexport interface TranslationMtProvider {\n readonly key: string;\n /** Absent ⇒ the provider claims every language. */\n supportsLanguage?(language: string): boolean;\n translateBatch(request: MtBatchRequest): Promise<MtBatchResult[]>;\n}\n\nconst providers = new Map<string, TranslationMtProvider>();\n\nexport function registerMtProvider(provider: TranslationMtProvider): void {\n providers.set(provider.key, provider);\n}\n\nexport function getMtProvider(key: string): TranslationMtProvider | undefined {\n return providers.get(key);\n}\n\nexport function listMtProviders(): TranslationMtProvider[] {\n return [...providers.values()];\n}\n\n/** Test seam. */\nexport function clearMtProviders(): void {\n providers.clear();\n}\n\n/**\n * Ordered provider chain for one target language: the preferred provider\n * first when it exists AND supports the language, then every other provider\n * that supports it, registration order.\n */\nexport function resolveMtProviders(\n targetLanguage: string,\n preferred?: string,\n): TranslationMtProvider[] {\n const supports = (p: TranslationMtProvider) =>\n !p.supportsLanguage || p.supportsLanguage(targetLanguage);\n const chain = listMtProviders().filter(supports);\n if (!preferred) return chain;\n const first = chain.find((p) => p.key === preferred);\n if (!first) return chain;\n return [first, ...chain.filter((p) => p !== first)];\n}\n\n/** Unique `{placeholder}` tokens in a message, sorted for set comparison. */\nexport function extractPlaceholders(\n text: string,\n format: MessageFormat = 'simple',\n): string[] {\n return analyzeMessage(text, format).arguments.map(({ name }) => name);\n}\n\n/**\n * A translation is only usable if it preserves the source's placeholder SET\n * exactly — a dropped or renamed `{param}` breaks interpolation at runtime.\n */\nexport function placeholdersIntact(\n source: string,\n translated: string,\n format: MessageFormat = 'simple',\n): boolean {\n return compareMessageArguments(source, translated, format).valid;\n}\n\n/** Glossary entries applying to one target language (global + language-specific). */\nexport function glossaryForLanguage(\n glossary: MtGlossaryEntry[],\n language: string,\n): MtGlossaryEntry[] {\n return glossary.filter((g) => !g.language || g.language === language);\n}\n\nexport function chunkItems<T>(items: T[], size: number): T[][] {\n if (size < 1) throw new Error('chunk size must be >= 1');\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) chunks.push(items.slice(i, i + size));\n return chunks;\n}\n\n/**\n * Resolve the formality for one language from the encoded config entries\n * (\"formal\" = app default; \"de:informal\" = per-language override; override wins).\n */\nexport function formalityForLanguage(\n entries: string[],\n language: string,\n): 'formal' | 'informal' | undefined {\n let result: 'formal' | 'informal' | undefined;\n for (const entry of entries ?? []) {\n const i = entry.indexOf(':');\n const value = i === -1 ? entry : entry.slice(i + 1);\n if (value !== 'formal' && value !== 'informal') continue;\n if (i === -1) {\n if (!result) result = value;\n } else if (entry.slice(0, i) === language) {\n return value;\n }\n }\n return result;\n}\n\n// ── Consistency (Plan 017 §7.4c) ────────────────────────────────────────\n\n/** Minimal entry view the consistency helpers need (client-safe). */\nexport interface ConsistencyEntry {\n key: string;\n namespace?: string;\n sourceText: string;\n format?: 'simple' | 'icu';\n units: Record<string, { text: string; state: string } | undefined>;\n}\n\n/** Identical English source translated DIFFERENTLY within one language. */\nexport interface ConsistencyConflict {\n sourceText: string;\n language: string;\n /** One entry per distinct translation: the text + the keys carrying it. */\n variants: Array<{ text: string; keys: string[] }>;\n}\n\n/**\n * Find keys whose IDENTICAL source text has diverging translations in a\n * language — the core \"same words, same translation\" consistency check.\n * Empty/untranslated units are ignored; whitespace-trimmed comparison.\n */\nexport function findInconsistentTranslations(\n entries: ConsistencyEntry[],\n language: string,\n): ConsistencyConflict[] {\n const bySource = new Map<string, Map<string, string[]>>();\n for (const entry of entries) {\n const source = entry.sourceText.trim();\n const text = entry.units[language]?.text?.trim();\n if (!source || !text) continue;\n const variants = bySource.get(source) ?? new Map<string, string[]>();\n variants.set(text, [...(variants.get(text) ?? []), entry.key]);\n bySource.set(source, variants);\n }\n const conflicts: ConsistencyConflict[] = [];\n for (const [sourceText, variants] of bySource) {\n if (variants.size < 2) continue;\n conflicts.push({\n sourceText,\n language,\n variants: [...variants].map(([text, keys]) => ({ text, keys: keys.sort() })),\n });\n }\n return conflicts.sort((a, b) => a.sourceText.localeCompare(b.sourceText));\n}\n\n/**\n * Pick reviewed units as translation-memory REFERENCES for an MT batch:\n * same-namespace reviewed translations first (shared vocabulary), then the\n * shortest reviewed units overall (vocabulary-dense). Deterministic.\n */\nexport function pickReferenceUnits(\n entries: ConsistencyEntry[],\n language: string,\n batchNamespaces: string[],\n max = 20,\n): MtReference[] {\n const namespaces = new Set(batchNamespaces);\n const reviewed = entries\n .map((entry) => ({\n namespace: entry.namespace ?? '',\n sourceText: entry.sourceText.trim(),\n unit: entry.units[language],\n }))\n .filter(\n (row) =>\n row.sourceText &&\n row.unit?.state === 'reviewed' &&\n row.unit.text.trim(),\n );\n const score = (row: (typeof reviewed)[number]) =>\n (namespaces.has(row.namespace) ? 0 : 100000) + row.sourceText.length;\n return reviewed\n .sort((a, b) => score(a) - score(b) || a.sourceText.localeCompare(b.sourceText))\n .slice(0, max)\n .map((row) => ({ sourceText: row.sourceText, text: row.unit!.text.trim() }));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mt.js","sourceRoot":"","sources":["../../src/mt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Machine-translation provider registry (Plan 014 AD-L / Plan 017 Slice B).\n * Providers implement one method — translate a batch of UI strings — and\n * register by key ('claude', 'deepl', …). Resolution is PER TARGET LANGUAGE\n * with a fallback chain: not every provider covers every language (DeepL has\n * no Swahili or Urdu), so the preferred provider is used where it supports\n * the target and the chain falls through otherwise. Pure module: no I/O, no\n * SDK imports — concrete providers live with the host application and are\n * registered at boot.\n */\nimport {\n analyzeMessage,\n compareMessageArguments,\n} from './message-format.js';\nimport type { MessageFormat } from './core/messages.js';\n\nexport interface MtItem {\n key: string;\n sourceText: string;\n /** Authoring context shown to the translator/model. */\n description?: string;\n format?: 'simple' | 'icu';\n}\n\nexport interface MtGlossaryEntry {\n term: string;\n /** prefer (default) = translate as `translation`; keep = do-not-translate; forbid = never use. */\n termType?: 'prefer' | 'require' | 'keep' | 'forbid';\n /** Preferred translation (prefer entries); empty/undefined = keep the term as-is. */\n translation?: string;\n /** Replacement wording (forbid entries). */\n useInstead?: string;\n /** Target language this applies to; empty = all languages. */\n language?: string;\n /** Exact-casing matching (proper nouns / brand styling). */\n caseSensitive?: boolean;\n description?: string;\n}\n\n/** Register/tone controls (Plan 017 §7.4b) — NOT sampling temperature. */\nexport interface MtStyle {\n formality?: 'formal' | 'informal';\n /** Free-text tone guidance, e.g. \"friendly, energetic, no bureaucratese\". */\n note?: string;\n}\n\n/** An established translation the provider should stay consistent with. */\nexport interface MtReference {\n sourceText: string;\n text: string;\n}\n\nexport interface MtBatchRequest {\n sourceLanguage: string;\n targetLanguage: string;\n items: MtItem[];\n glossary: MtGlossaryEntry[];\n style?: MtStyle;\n /** Translation-memory context: reviewed units for consistency (Plan 017 §7.4c). */\n references?: MtReference[];\n}\n\nexport interface MtBatchResult {\n key: string;\n text: string;\n}\n\nexport interface TranslationMtProvider {\n readonly key: string;\n /** Absent ⇒ the provider claims every language. */\n supportsLanguage?(language: string): boolean;\n translateBatch(request: MtBatchRequest): Promise<MtBatchResult[]>;\n}\n\nconst providers = new Map<string, TranslationMtProvider>();\n\nexport function registerMtProvider(provider: TranslationMtProvider): void {\n providers.set(provider.key, provider);\n}\n\nexport function getMtProvider(key: string): TranslationMtProvider | undefined {\n return providers.get(key);\n}\n\nexport function listMtProviders(): TranslationMtProvider[] {\n return [...providers.values()];\n}\n\n/** Test seam. */\nexport function clearMtProviders(): void {\n providers.clear();\n}\n\n/**\n * Ordered provider chain for one target language: the preferred provider\n * first when it exists AND supports the language, then every other provider\n * that supports it, registration order.\n */\nexport function resolveMtProviders(\n targetLanguage: string,\n preferred?: string,\n): TranslationMtProvider[] {\n const supports = (p: TranslationMtProvider) =>\n !p.supportsLanguage || p.supportsLanguage(targetLanguage);\n const chain = listMtProviders().filter(supports);\n if (!preferred) return chain;\n const first = chain.find((p) => p.key === preferred);\n if (!first) return chain;\n return [first, ...chain.filter((p) => p !== first)];\n}\n\n/** Unique `{placeholder}` tokens in a message, sorted for set comparison. */\nexport function extractPlaceholders(\n text: string,\n format: MessageFormat = 'simple',\n): string[] {\n return analyzeMessage(text, format).arguments.map(({ name }) => name);\n}\n\n/**\n * A translation is only usable if it preserves the source's placeholder SET\n * exactly — a dropped or renamed `{param}` breaks interpolation at runtime.\n */\nexport function placeholdersIntact(\n source: string,\n translated: string,\n format: MessageFormat = 'simple',\n): boolean {\n return compareMessageArguments(source, translated, format).valid;\n}\n\n/** Glossary entries applying to one target language (global + language-specific). */\nexport function glossaryForLanguage(\n glossary: MtGlossaryEntry[],\n language: string,\n): MtGlossaryEntry[] {\n return glossary.filter((g) => !g.language || g.language === language);\n}\n\nexport function chunkItems<T>(items: T[], size: number): T[][] {\n if (size < 1) throw new Error('chunk size must be >= 1');\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) chunks.push(items.slice(i, i + size));\n return chunks;\n}\n\n/**\n * Resolve the formality for one language from the encoded config entries\n * (\"formal\" = app default; \"de:informal\" = per-language override; override wins).\n */\nexport function formalityForLanguage(\n entries: string[],\n language: string,\n): 'formal' | 'informal' | undefined {\n let result: 'formal' | 'informal' | undefined;\n for (const entry of entries ?? []) {\n const i = entry.indexOf(':');\n const value = i === -1 ? entry : entry.slice(i + 1);\n if (value !== 'formal' && value !== 'informal') continue;\n if (i === -1) {\n if (!result) result = value;\n } else if (entry.slice(0, i) === language) {\n return value;\n }\n }\n return result;\n}\n\n// ── Consistency (Plan 017 §7.4c) ────────────────────────────────────────\n\n/** Minimal entry view the consistency helpers need (client-safe). */\nexport interface ConsistencyEntry {\n key: string;\n namespace?: string;\n sourceText: string;\n format?: 'simple' | 'icu';\n units: Record<string, { text: string; state: string } | undefined>;\n}\n\n/** Identical English source translated DIFFERENTLY within one language. */\nexport interface ConsistencyConflict {\n sourceText: string;\n language: string;\n /** One entry per distinct translation: the text + the keys carrying it. */\n variants: Array<{ text: string; keys: string[] }>;\n}\n\n/**\n * Find keys whose IDENTICAL source text has diverging translations in a\n * language — the core \"same words, same translation\" consistency check.\n * Empty/untranslated units are ignored; whitespace-trimmed comparison.\n */\nexport function findInconsistentTranslations(\n entries: ConsistencyEntry[],\n language: string,\n): ConsistencyConflict[] {\n const bySource = new Map<string, Map<string, string[]>>();\n for (const entry of entries) {\n const source = entry.sourceText.trim();\n const text = entry.units[language]?.text?.trim();\n if (!source || !text) continue;\n const variants = bySource.get(source) ?? new Map<string, string[]>();\n variants.set(text, [...(variants.get(text) ?? []), entry.key]);\n bySource.set(source, variants);\n }\n const conflicts: ConsistencyConflict[] = [];\n for (const [sourceText, variants] of bySource) {\n if (variants.size < 2) continue;\n conflicts.push({\n sourceText,\n language,\n variants: [...variants].map(([text, keys]) => ({ text, keys: keys.sort() })),\n });\n }\n return conflicts.sort((a, b) => a.sourceText.localeCompare(b.sourceText));\n}\n\n/**\n * Pick reviewed units as translation-memory REFERENCES for an MT batch:\n * same-namespace reviewed translations first (shared vocabulary), then the\n * shortest reviewed units overall (vocabulary-dense). Deterministic.\n */\nexport function pickReferenceUnits(\n entries: ConsistencyEntry[],\n language: string,\n batchNamespaces: string[],\n max = 20,\n): MtReference[] {\n const namespaces = new Set(batchNamespaces);\n const reviewed = entries\n .map((entry) => ({\n namespace: entry.namespace ?? '',\n sourceText: entry.sourceText.trim(),\n unit: entry.units[language],\n }))\n .filter(\n (row) =>\n row.sourceText &&\n row.unit?.state === 'reviewed' &&\n row.unit.text.trim(),\n );\n const score = (row: (typeof reviewed)[number]) =>\n (namespaces.has(row.namespace) ? 0 : 100000) + row.sourceText.length;\n return reviewed\n .sort((a, b) => score(a) - score(b) || a.sourceText.localeCompare(b.sourceText))\n .slice(0, max)\n .map((row) => ({ sourceText: row.sourceText, text: row.unit!.text.trim() }));\n}\n"]}
|
|
@@ -11,7 +11,7 @@ export declare var loadData: () => Promise<{
|
|
|
11
11
|
* Public ontology namespace for the translation package. First-party Linked
|
|
12
12
|
* ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
|
|
13
13
|
* the ontology slug — and the prefix label — is the package's public slug
|
|
14
|
-
* (
|
|
14
|
+
* (the LINKED first-party ontology namespace rule). So terms are
|
|
15
15
|
* `https://linked.cm/ont/translation/TranslationKey` and the prefix is
|
|
16
16
|
* `translation:`. Before 0.5.0 this was `https://id.linked.cm/translation/vocab#`.
|
|
17
17
|
*/
|
|
@@ -44,6 +44,7 @@ export declare var ofNode: import("@_linked/core/utils/NodeReference").NodeRefer
|
|
|
44
44
|
export declare var ofField: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
45
45
|
export declare var ofShape: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
46
46
|
export declare var ofProperty: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
47
|
+
export declare var ofResource: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
47
48
|
export declare var fromPackage: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
48
49
|
export declare var overridden: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
49
50
|
export declare var shapeSource: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
@@ -140,6 +141,7 @@ export declare const tr: {
|
|
|
140
141
|
ofField: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
141
142
|
ofShape: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
142
143
|
ofProperty: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
144
|
+
ofResource: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
143
145
|
fromPackage: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
144
146
|
overridden: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
145
147
|
shapeSource: import("@_linked/core/utils/NodeReference").NodeReferenceValue;
|
|
@@ -8,7 +8,7 @@ export var loadData = () => {
|
|
|
8
8
|
* Public ontology namespace for the translation package. First-party Linked
|
|
9
9
|
* ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
|
|
10
10
|
* the ontology slug — and the prefix label — is the package's public slug
|
|
11
|
-
* (
|
|
11
|
+
* (the LINKED first-party ontology namespace rule). So terms are
|
|
12
12
|
* `https://linked.cm/ont/translation/TranslationKey` and the prefix is
|
|
13
13
|
* `translation:`. Before 0.5.0 this was `https://id.linked.cm/translation/vocab#`.
|
|
14
14
|
*/
|
|
@@ -44,6 +44,7 @@ export var ofNode = ns('ofNode'); // content-translation subject (kind:'content'
|
|
|
44
44
|
export var ofField = ns('ofField');
|
|
45
45
|
export var ofShape = ns('ofShape'); // semantic SHACL shape context for package keys
|
|
46
46
|
export var ofProperty = ns('ofProperty'); // semantic predicate context for package keys
|
|
47
|
+
export var ofResource = ns('ofResource'); // arbitrary semantic resource (action, group, condition, port)
|
|
47
48
|
export var fromPackage = ns('fromPackage'); // package that supplied a seed catalog
|
|
48
49
|
export var overridden = ns('overridden'); // app diverged this shape key from canonical → excluded from shape propagation (AD-N)
|
|
49
50
|
export var shapeSource = ns('shapeSource'); // canonical source snapshot at override time → the value "clear override" reverts to (AD-N)
|
|
@@ -68,7 +69,7 @@ export var hotfixSequence = ns('hotfixSequence');
|
|
|
68
69
|
export var publishedAt = ns('publishedAt');
|
|
69
70
|
export var supportedUntil = ns('supportedUntil');
|
|
70
71
|
export var qualitySummary = ns('qualitySummary');
|
|
71
|
-
// ── CapabilityAppConfig properties (stored in
|
|
72
|
+
// ── CapabilityAppConfig properties (stored in the host's app configuration) ────
|
|
72
73
|
export var languages = ns('languages'); // active BCP-47 tags, including source
|
|
73
74
|
export var defaultLanguage = ns('defaultLanguage'); // authored/source language
|
|
74
75
|
export var cdnTarget = ns('cdnTarget'); // delivery base URL / bucket prefix — the "repoint" knob (AD-K, P2)
|
|
@@ -152,6 +153,7 @@ export const tr = {
|
|
|
152
153
|
ofField,
|
|
153
154
|
ofShape,
|
|
154
155
|
ofProperty,
|
|
156
|
+
ofResource,
|
|
155
157
|
fromPackage,
|
|
156
158
|
overridden,
|
|
157
159
|
shapeSource,
|
|
@@ -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/**\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"]}
|
|
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 * (the LINKED first-party ontology namespace rule). 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 ofResource = ns('ofResource'); // arbitrary semantic resource (action, group, condition, port)\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 the host's app configuration) ────\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 ofResource,\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/lib/esm/package.js
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { linkedPackage } from '@_linked/core/utils/Package';
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
// (Plan 014 AD-G). R14: confirm ownership of `id.linked.cm` before seeding real
|
|
7
|
-
// data under these IRIs; changing the baseUri afterwards means re-materializing.
|
|
8
|
-
export const { linkedShape, linkedUtil, linkedOntology, registerPackageExport, packageExports, packageName, getPackageShape, } = linkedPackage('@_linked/translation', {
|
|
9
|
-
baseUri: 'https://id.linked.cm/translation/',
|
|
10
|
-
});
|
|
2
|
+
// First-party LINKED package: no `baseUri`, so core's default root applies and
|
|
3
|
+
// IRIs follow the public rule — shapes `https://linked.cm/shape/translation/{ShapeName}`,
|
|
4
|
+
// package `https://linked.cm/pkg/translation` (arch-02 "Public community").
|
|
5
|
+
export const { linkedShape, linkedUtil, linkedOntology, registerPackageExport, packageExports, packageName, getPackageShape, } = linkedPackage('@_linked/translation');
|
|
11
6
|
//# sourceMappingURL=package.js.map
|
package/lib/esm/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,+EAA+E;AAC/E,0FAA0F;AAC1F,4EAA4E;AAC5E,MAAM,CAAC,MAAM,EACX,WAAW,EACX,UAAU,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,eAAe,GAChB,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAC","sourcesContent":["import { linkedPackage } from '@_linked/core/utils/Package';\n\n// First-party LINKED package: no `baseUri`, so core's default root applies and\n// IRIs follow the public rule — shapes `https://linked.cm/shape/translation/{ShapeName}`,\n// package `https://linked.cm/pkg/translation` (arch-02 \"Public community\").\nexport const {\n linkedShape,\n linkedUtil,\n linkedOntology,\n registerPackageExport,\n packageExports,\n packageName,\n getPackageShape,\n} = linkedPackage('@_linked/translation');\n"]}
|
package/lib/esm/react.d.ts
CHANGED
|
@@ -1,11 +1,45 @@
|
|
|
1
1
|
import { type TranslationLanguageDefinition } from './languages.js';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { type MessageFormat, type TranslationMessages } from './core/messages.js';
|
|
4
|
+
/**
|
|
5
|
+
* Window event that previews a language, text direction or pseudo-locale in
|
|
6
|
+
* every mounted `TranslationProvider`, without changing the user's language.
|
|
7
|
+
*
|
|
8
|
+
* Dispatch it with a {@link TranslationPreviewDetail}:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* window.dispatchEvent(
|
|
12
|
+
* new CustomEvent(TRANSLATION_PREVIEW_EVENT, {
|
|
13
|
+
* detail: { language: 'ar', direction: 'ltr', pseudoLocale: 'expanded' },
|
|
14
|
+
* })
|
|
15
|
+
* );
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Each event replaces the whole preview: a field that is missing or invalid
|
|
19
|
+
* falls back to its default (no preview language, `'auto'`, `'off'`), so an
|
|
20
|
+
* empty detail ends the preview. The preview language is never written to
|
|
21
|
+
* storage, and a preview direction wins over the language's own direction.
|
|
22
|
+
*/
|
|
23
|
+
export declare const TRANSLATION_PREVIEW_EVENT = "linked:translation-preview";
|
|
24
|
+
export type TranslationPreviewDirection = 'auto' | 'ltr' | 'rtl';
|
|
25
|
+
export type TranslationPreviewPseudoLocale = 'off' | 'accented' | 'expanded';
|
|
26
|
+
/** The `detail` of a {@link TRANSLATION_PREVIEW_EVENT}. */
|
|
27
|
+
export interface TranslationPreviewDetail {
|
|
28
|
+
/** BCP-47 tag to render in instead of the selected language. */
|
|
29
|
+
language?: string;
|
|
30
|
+
/** Force a text direction; `'auto'` uses the language's own. */
|
|
31
|
+
direction?: TranslationPreviewDirection;
|
|
32
|
+
/**
|
|
33
|
+
* `'accented'` accents every message; `'expanded'` pads every message by
|
|
34
|
+
* about a third to show controls that only fit their English copy.
|
|
35
|
+
*/
|
|
36
|
+
pseudoLocale?: TranslationPreviewPseudoLocale;
|
|
37
|
+
}
|
|
4
38
|
/**
|
|
5
39
|
* React binding for the translation core (Plan 014 P1.5). Kept in a `/react`
|
|
6
40
|
* subpath so non-React consumers use `./core/messages` without pulling React.
|
|
7
41
|
* Message LOADING is caller-injected (`loadMessages`) so this stays transport-
|
|
8
|
-
* agnostic: dev wires it to
|
|
42
|
+
* agnostic: dev wires it to the host's API, prod to the bundled `{lang}.json` with a
|
|
9
43
|
* CDN overlay (AD-J/AD-K) — the provider doesn't care which.
|
|
10
44
|
*
|
|
11
45
|
* The hook shape mirrors Tolgee (`useTranslate().t(key, default, params)`,
|
|
@@ -21,6 +55,7 @@ export interface TranslationCallOptions {
|
|
|
21
55
|
/** Explicit syntax for an inline default before per-key catalog metadata loads. */
|
|
22
56
|
format?: MessageFormat;
|
|
23
57
|
}
|
|
58
|
+
type TranslateFn = (key: string, defaultValue?: string, params?: Record<string, unknown>, options?: TranslationCallOptions) => string;
|
|
24
59
|
export interface TranslationProviderProps {
|
|
25
60
|
children: React.ReactNode;
|
|
26
61
|
languages: TranslationLanguage[];
|
|
@@ -37,7 +72,7 @@ export interface TranslationProviderProps {
|
|
|
37
72
|
export declare function TranslationProvider({ children, languages: initialLanguages, loadLanguages, defaultLanguage, format, loadMessages, storageKey, }: TranslationProviderProps): React.JSX.Element;
|
|
38
73
|
/** Tolgee-compatible: `const { t } = useTranslate()`. */
|
|
39
74
|
export declare function useTranslate(): {
|
|
40
|
-
t:
|
|
75
|
+
t: TranslateFn;
|
|
41
76
|
};
|
|
42
77
|
/** Active language + switcher + direction + the available languages. */
|
|
43
78
|
export declare function useLanguage(): {
|
|
@@ -53,3 +88,4 @@ export declare function T({ keyName, defaultValue, params, format, }: {
|
|
|
53
88
|
params?: Record<string, unknown>;
|
|
54
89
|
format?: MessageFormat;
|
|
55
90
|
}): React.JSX.Element;
|
|
91
|
+
export {};
|
package/lib/esm/react.js
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { languageFallbacks, } from './languages.js';
|
|
3
|
-
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
|
|
4
|
-
import { directionFor, translate, } from './core/messages.js';
|
|
3
|
+
import { createContext, startTransition, useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore, } from 'react';
|
|
4
|
+
import { directionFor, pseudoExpand, pseudoLocalize, translate, } from './core/messages.js';
|
|
5
|
+
/**
|
|
6
|
+
* Window event that previews a language, text direction or pseudo-locale in
|
|
7
|
+
* every mounted `TranslationProvider`, without changing the user's language.
|
|
8
|
+
*
|
|
9
|
+
* Dispatch it with a {@link TranslationPreviewDetail}:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* window.dispatchEvent(
|
|
13
|
+
* new CustomEvent(TRANSLATION_PREVIEW_EVENT, {
|
|
14
|
+
* detail: { language: 'ar', direction: 'ltr', pseudoLocale: 'expanded' },
|
|
15
|
+
* })
|
|
16
|
+
* );
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Each event replaces the whole preview: a field that is missing or invalid
|
|
20
|
+
* falls back to its default (no preview language, `'auto'`, `'off'`), so an
|
|
21
|
+
* empty detail ends the preview. The preview language is never written to
|
|
22
|
+
* storage, and a preview direction wins over the language's own direction.
|
|
23
|
+
*/
|
|
24
|
+
export const TRANSLATION_PREVIEW_EVENT = 'linked:translation-preview';
|
|
25
|
+
const EMPTY_MESSAGES = {};
|
|
5
26
|
const TranslationContext = createContext(null);
|
|
6
27
|
export function TranslationProvider({ children, languages: initialLanguages, loadLanguages, defaultLanguage = 'en', format = 'simple', loadMessages, storageKey = 'linked.lang', }) {
|
|
7
28
|
var _a, _b;
|
|
@@ -25,7 +46,15 @@ export function TranslationProvider({ children, languages: initialLanguages, loa
|
|
|
25
46
|
}
|
|
26
47
|
return defaultLanguage;
|
|
27
48
|
});
|
|
28
|
-
const
|
|
49
|
+
const [previewLanguage, setPreviewLanguage] = useState(null);
|
|
50
|
+
const [previewPseudoLocale, setPreviewPseudoLocale] = useState('off');
|
|
51
|
+
const [previewDirection, setPreviewDirection] = useState('auto');
|
|
52
|
+
const effectiveLanguage = previewLanguage !== null && previewLanguage !== void 0 ? previewLanguage : language;
|
|
53
|
+
// A preview direction is an editor coordinate and wins; otherwise the
|
|
54
|
+
// configured language's own direction, then the tag's script default.
|
|
55
|
+
const dir = previewDirection === 'ltr' || previewDirection === 'rtl'
|
|
56
|
+
? previewDirection
|
|
57
|
+
: ((_b = (_a = languages.find((item) => item.tag === effectiveLanguage)) === null || _a === void 0 ? void 0 : _a.direction) !== null && _b !== void 0 ? _b : directionFor(effectiveLanguage));
|
|
29
58
|
useEffect(() => {
|
|
30
59
|
if (!loadLanguages)
|
|
31
60
|
return;
|
|
@@ -53,15 +82,23 @@ export function TranslationProvider({ children, languages: initialLanguages, loa
|
|
|
53
82
|
// Load the active language's messages once. English renders from inline
|
|
54
83
|
// defaults until (and if) a payload arrives, so the app is never blank.
|
|
55
84
|
useEffect(() => {
|
|
56
|
-
if (messagesByLang[
|
|
85
|
+
if (messagesByLang[effectiveLanguage])
|
|
57
86
|
return;
|
|
58
87
|
let cancelled = false;
|
|
59
|
-
const chain = languageFallbacks(
|
|
88
|
+
const chain = languageFallbacks(effectiveLanguage, defaultLanguage, remoteLanguages).reverse();
|
|
60
89
|
Promise.all(chain.map((code) => loadMessages(code).catch(() => ({}))))
|
|
61
90
|
.then((maps) => Object.assign({}, ...maps))
|
|
62
91
|
.then((msgs) => {
|
|
63
92
|
if (!cancelled) {
|
|
64
|
-
|
|
93
|
+
// A descendant lazy route may still be hydrating when the catalog
|
|
94
|
+
// arrives. Overlay messages without replacing its server-rendered
|
|
95
|
+
// DOM; inline defaults remain usable until the transition commits.
|
|
96
|
+
startTransition(() => {
|
|
97
|
+
setMessagesByLang((prev) => ({
|
|
98
|
+
...prev,
|
|
99
|
+
[effectiveLanguage]: msgs,
|
|
100
|
+
}));
|
|
101
|
+
});
|
|
65
102
|
}
|
|
66
103
|
})
|
|
67
104
|
.catch(() => {
|
|
@@ -71,19 +108,42 @@ export function TranslationProvider({ children, languages: initialLanguages, loa
|
|
|
71
108
|
cancelled = true;
|
|
72
109
|
};
|
|
73
110
|
}, [
|
|
74
|
-
|
|
111
|
+
effectiveLanguage,
|
|
75
112
|
loadMessages,
|
|
76
113
|
messagesByLang,
|
|
77
114
|
defaultLanguage,
|
|
78
115
|
remoteLanguages,
|
|
79
116
|
]);
|
|
80
|
-
//
|
|
117
|
+
// Preview locale is an ephemeral editor coordinate. It intentionally does
|
|
118
|
+
// not call setLanguage(), because doing so would persist a test condition as
|
|
119
|
+
// the app user's real language preference.
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (typeof window === 'undefined')
|
|
122
|
+
return;
|
|
123
|
+
const onPreview = (event) => {
|
|
124
|
+
const detail = event
|
|
125
|
+
.detail;
|
|
126
|
+
const nextLanguage = detail === null || detail === void 0 ? void 0 : detail.language;
|
|
127
|
+
const nextPseudoLocale = detail === null || detail === void 0 ? void 0 : detail.pseudoLocale;
|
|
128
|
+
const nextDirection = detail === null || detail === void 0 ? void 0 : detail.direction;
|
|
129
|
+
setPreviewLanguage(typeof nextLanguage === 'string' && nextLanguage ? nextLanguage : null);
|
|
130
|
+
setPreviewPseudoLocale(nextPseudoLocale === 'accented' || nextPseudoLocale === 'expanded'
|
|
131
|
+
? nextPseudoLocale
|
|
132
|
+
: 'off');
|
|
133
|
+
setPreviewDirection(nextDirection === 'ltr' || nextDirection === 'rtl'
|
|
134
|
+
? nextDirection
|
|
135
|
+
: 'auto');
|
|
136
|
+
};
|
|
137
|
+
window.addEventListener(TRANSLATION_PREVIEW_EVENT, onPreview);
|
|
138
|
+
return () => window.removeEventListener(TRANSLATION_PREVIEW_EVENT, onPreview);
|
|
139
|
+
}, []);
|
|
140
|
+
// Reflect the effective language and text direction on <html>.
|
|
81
141
|
useEffect(() => {
|
|
82
142
|
if (typeof document !== 'undefined') {
|
|
83
143
|
document.documentElement.dir = dir;
|
|
84
|
-
document.documentElement.lang =
|
|
144
|
+
document.documentElement.lang = effectiveLanguage;
|
|
85
145
|
}
|
|
86
|
-
}, [
|
|
146
|
+
}, [effectiveLanguage, dir]);
|
|
87
147
|
const setLanguage = useCallback((tag) => {
|
|
88
148
|
var _a;
|
|
89
149
|
setLanguageState(tag);
|
|
@@ -91,11 +151,28 @@ export function TranslationProvider({ children, languages: initialLanguages, loa
|
|
|
91
151
|
(_a = window.localStorage) === null || _a === void 0 ? void 0 : _a.setItem(storageKey, tag);
|
|
92
152
|
}
|
|
93
153
|
}, [storageKey]);
|
|
94
|
-
const
|
|
154
|
+
const translatorFor = useCallback((catalogs) => (key, defaultValue, params, options) => {
|
|
95
155
|
var _a, _b;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
156
|
+
const translated = translate((_a = catalogs[effectiveLanguage]) !== null && _a !== void 0 ? _a : {}, key, defaultValue, params, (_b = options === null || options === void 0 ? void 0 : options.format) !== null && _b !== void 0 ? _b : format, effectiveLanguage);
|
|
157
|
+
if (previewPseudoLocale === 'accented') {
|
|
158
|
+
return effectiveLanguage.toLowerCase() === 'en-xa'
|
|
159
|
+
? translated
|
|
160
|
+
: pseudoLocalize(translated);
|
|
161
|
+
}
|
|
162
|
+
return previewPseudoLocale === 'expanded'
|
|
163
|
+
? pseudoExpand(translated)
|
|
164
|
+
: translated;
|
|
165
|
+
}, [effectiveLanguage, format, previewPseudoLocale]);
|
|
166
|
+
const t = useMemo(() => translatorFor(messagesByLang), [translatorFor, messagesByLang]);
|
|
167
|
+
const tInline = useMemo(() => translatorFor(EMPTY_MESSAGES), [translatorFor]);
|
|
168
|
+
const value = useMemo(() => ({
|
|
169
|
+
t,
|
|
170
|
+
tInline,
|
|
171
|
+
language: effectiveLanguage,
|
|
172
|
+
setLanguage,
|
|
173
|
+
languages,
|
|
174
|
+
dir,
|
|
175
|
+
}), [t, tInline, effectiveLanguage, setLanguage, languages, dir]);
|
|
99
176
|
return (_jsx(TranslationContext.Provider, { value: value, children: children }));
|
|
100
177
|
}
|
|
101
178
|
function useTranslationContext(hook) {
|
|
@@ -107,8 +184,14 @@ function useTranslationContext(hook) {
|
|
|
107
184
|
/** Tolgee-compatible: `const { t } = useTranslate()`. */
|
|
108
185
|
export function useTranslate() {
|
|
109
186
|
const ctx = useTranslationContext('useTranslate');
|
|
110
|
-
|
|
187
|
+
// The server never has a catalog, and a lazy descendant can hydrate after
|
|
188
|
+
// the catalog has already reached context. Gating per consumer means every
|
|
189
|
+
// hydrating render replays the inline defaults, then re-renders with the
|
|
190
|
+
// catalog once that consumer commits.
|
|
191
|
+
const hydrated = useSyncExternalStore(subscribeNever, () => true, () => false);
|
|
192
|
+
return { t: hydrated ? ctx.t : ctx.tInline };
|
|
111
193
|
}
|
|
194
|
+
const subscribeNever = () => () => { };
|
|
112
195
|
/** Active language + switcher + direction + the available languages. */
|
|
113
196
|
export function useLanguage() {
|
|
114
197
|
const ctx = useTranslationContext('useLanguage');
|
package/lib/esm/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/react.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AACxB,OAAc,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,YAAY,EAEZ,SAAS,GAEV,MAAM,oBAAoB,CAAC;AAsC5B,MAAM,kBAAkB,GAAG,aAAa,CAAiC,IAAI,CAAC,CAAC;AAgB/E,MAAM,UAAU,mBAAmB,CAAC,EAClC,QAAQ,EACR,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EACb,eAAe,GAAG,IAAI,EACtB,MAAM,GAAG,QAAQ,EACjB,YAAY,EACZ,UAAU,GAAG,aAAa,GACD;;IACzB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GACzC,QAAQ,EAAmC,CAAC;IAC9C,MAAM,SAAS,GAAG,eAAe;QAC/B,CAAC,CAAC,eAAe;aACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;aAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACP,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE;;QACzD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAA,MAAM,CAAC,YAAY,0CAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;QACvE,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GACP,MAAA,MAAA,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,0CAAE,SAAS,mCAC1D,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa;YAAE,OAAO;QAC3B,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,aAAa,EAAE;aACZ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;;YACd,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC1B,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACtB,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,WAAW;oBAC3B,CAAC,CAAC,MAAA,MAAM,CAAC,YAAY,0CAAE,OAAO,CAAC,UAAU,CAAC;oBAC1C,CAAC,CAAC,IAAI,CAAC;gBACX,IACE,MAAM;oBACN,KAAK,CAAC,IAAI,CACR,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CACjE;oBAED,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAElD,EAAE,CAAC,CAAC;IAEN,wEAAwE;IACxE,wEAAwE;IACxE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,QAAQ,CAAC;YAAE,OAAO;QACrC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,KAAK,GAAG,iBAAiB,CAC7B,QAAQ,EACR,eAAe,EACf,eAAe,CAChB,CAAC,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACnE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,CAAwB,CAAC;aACjE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,8CAA8C;QAChD,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,QAAQ;QACR,YAAY;QACZ,cAAc;QACd,eAAe;QACf,eAAe;KAChB,CAAC,CAAC;IAEH,gEAAgE;IAChE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,QAAQ,CAAC,eAAe,CAAC,GAAG,GAAG,GAAG,CAAC;YACnC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC3C,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAEpB,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,GAAW,EAAE,EAAE;;QACd,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAA,MAAM,CAAC,YAAY,0CAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,MAAM,CAAC,GAAG,WAAW,CACnB,CACE,GAAW,EACX,YAAqB,EACrB,MAAgC,EAChC,OAAgC,EAChC,EAAE;;QACF,OAAA,SAAS,CACP,MAAA,cAAc,CAAC,QAAQ,CAAC,mCAAI,EAAE,EAC9B,GAAG,EACH,YAAY,EACZ,MAAM,EACN,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,MAAM,EACzB,QAAQ,CACT,CAAA;KAAA,EACH,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CACnC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EACpD,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CAC3C,CAAC;IAEF,OAAO,CACL,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACtC,QAAQ,GACmB,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG;QACN,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8CAA8C,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACjD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,CAAC,CAAC,EAChB,OAAO,EACP,YAAY,EACZ,MAAM,EACN,MAAM,GAMP;IACC,MAAM,EAAE,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC;IAC7B,OAAO,4BAAG,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAI,CAAC;AAC7D,CAAC","sourcesContent":["import {\n languageFallbacks,\n type TranslationLanguageDefinition,\n} from './languages.js';\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n directionFor,\n type MessageFormat,\n translate,\n type TranslationMessages,\n} from './core/messages.js';\n\n/**\n * React binding for the translation core (Plan 014 P1.5). Kept in a `/react`\n * subpath so non-React consumers use `./core/messages` without pulling React.\n * Message LOADING is caller-injected (`loadMessages`) so this stays transport-\n * agnostic: dev wires it to CN's API, prod to the bundled `{lang}.json` with a\n * CDN overlay (AD-J/AD-K) — the provider doesn't care which.\n *\n * The hook shape mirrors Tolgee (`useTranslate().t(key, default, params)`,\n * `useLanguage()`), so swapping serve's provider touches only its i18n file.\n */\n\nexport interface TranslationLanguage {\n tag: string; // BCP-47\n label: string;\n direction?: 'ltr' | 'rtl';\n fallback?: string;\n}\n\nexport interface TranslationCallOptions {\n /** Explicit syntax for an inline default before per-key catalog metadata loads. */\n format?: MessageFormat;\n}\n\ninterface TranslationContextValue {\n t: (\n key: string,\n defaultValue?: string,\n params?: Record<string, unknown>,\n options?: TranslationCallOptions\n ) => string;\n language: string;\n setLanguage: (tag: string) => void;\n languages: TranslationLanguage[];\n dir: 'ltr' | 'rtl';\n}\n\nconst TranslationContext = createContext<TranslationContextValue | null>(null);\n\nexport interface TranslationProviderProps {\n children: React.ReactNode;\n languages: TranslationLanguage[];\n /** Optional live catalog metadata, refreshed independently of an app build. */\n loadLanguages?: () => Promise<TranslationLanguageDefinition[]>;\n defaultLanguage?: string;\n /** Global message format. 'simple' = FormatSimple (Tolgee-compatible default). */\n format?: MessageFormat;\n /** Caller-injected loader: dev→API, prod→bundled file then CDN overlay. */\n loadMessages: (language: string) => Promise<TranslationMessages>;\n /** localStorage key persisting the selected language. */\n storageKey?: string;\n}\n\nexport function TranslationProvider({\n children,\n languages: initialLanguages,\n loadLanguages,\n defaultLanguage = 'en',\n format = 'simple',\n loadMessages,\n storageKey = 'linked.lang',\n}: TranslationProviderProps) {\n const [remoteLanguages, setRemoteLanguages] =\n useState<TranslationLanguageDefinition[]>();\n const languages = remoteLanguages\n ? remoteLanguages\n .filter((item) => item.enabled && item.supported)\n .map((item) => ({\n tag: item.code,\n label: item.nativeName,\n direction: item.direction,\n fallback: item.fallback,\n }))\n : initialLanguages;\n const [language, setLanguageState] = useState<string>(() => {\n if (typeof window !== 'undefined') {\n const stored = window.localStorage?.getItem(storageKey);\n if (stored && languages.some((l) => l.tag === stored)) return stored;\n }\n return defaultLanguage;\n });\n const dir =\n languages.find((item) => item.tag === language)?.direction ??\n directionFor(language);\n useEffect(() => {\n if (!loadLanguages) return;\n let cancelled = false;\n loadLanguages()\n .then((items) => {\n if (!cancelled) {\n setRemoteLanguages(items);\n setMessagesByLang({});\n const stored =\n typeof window !== 'undefined'\n ? window.localStorage?.getItem(storageKey)\n : null;\n if (\n stored &&\n items.some(\n (item) => item.code === stored && item.enabled && item.supported\n )\n )\n setLanguageState(stored);\n }\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [loadLanguages, storageKey]);\n const [messagesByLang, setMessagesByLang] = useState<\n Record<string, TranslationMessages>\n >({});\n\n // Load the active language's messages once. English renders from inline\n // defaults until (and if) a payload arrives, so the app is never blank.\n useEffect(() => {\n if (messagesByLang[language]) return;\n let cancelled = false;\n const chain = languageFallbacks(\n language,\n defaultLanguage,\n remoteLanguages\n ).reverse();\n Promise.all(chain.map((code) => loadMessages(code).catch(() => ({}))))\n .then((maps) => Object.assign({}, ...maps) as TranslationMessages)\n .then((msgs) => {\n if (!cancelled) {\n setMessagesByLang((prev) => ({ ...prev, [language]: msgs }));\n }\n })\n .catch(() => {\n /* offline / missing → keep inline defaults */\n });\n return () => {\n cancelled = true;\n };\n }, [\n language,\n loadMessages,\n messagesByLang,\n defaultLanguage,\n remoteLanguages,\n ]);\n\n // Reflect the configured language and text direction on <html>.\n useEffect(() => {\n if (typeof document !== 'undefined') {\n document.documentElement.dir = dir;\n document.documentElement.lang = language;\n }\n }, [language, dir]);\n\n const setLanguage = useCallback(\n (tag: string) => {\n setLanguageState(tag);\n if (typeof window !== 'undefined') {\n window.localStorage?.setItem(storageKey, tag);\n }\n },\n [storageKey]\n );\n\n const t = useCallback(\n (\n key: string,\n defaultValue?: string,\n params?: Record<string, unknown>,\n options?: TranslationCallOptions\n ) =>\n translate(\n messagesByLang[language] ?? {},\n key,\n defaultValue,\n params,\n options?.format ?? format,\n language\n ),\n [messagesByLang, language, format]\n );\n\n const value = useMemo<TranslationContextValue>(\n () => ({ t, language, setLanguage, languages, dir }),\n [t, language, setLanguage, languages, dir]\n );\n\n return (\n <TranslationContext.Provider value={value}>\n {children}\n </TranslationContext.Provider>\n );\n}\n\nfunction useTranslationContext(hook: string): TranslationContextValue {\n const ctx = useContext(TranslationContext);\n if (!ctx)\n throw new Error(`${hook} must be used within a <TranslationProvider>`);\n return ctx;\n}\n\n/** Tolgee-compatible: `const { t } = useTranslate()`. */\nexport function useTranslate() {\n const ctx = useTranslationContext('useTranslate');\n return { t: ctx.t };\n}\n\n/** Active language + switcher + direction + the available languages. */\nexport function useLanguage() {\n const ctx = useTranslationContext('useLanguage');\n return {\n language: ctx.language,\n setLanguage: ctx.setLanguage,\n languages: ctx.languages,\n dir: ctx.dir,\n };\n}\n\n/** JSX convenience (Tolgee `<T keyName=… />`). */\nexport function T({\n keyName,\n defaultValue,\n params,\n format,\n}: {\n keyName: string;\n defaultValue?: string;\n params?: Record<string, unknown>;\n format?: MessageFormat;\n}) {\n const { t } = useTranslate();\n return <>{t(keyName, defaultValue, params, { format })}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n languageFallbacks,\n type TranslationLanguageDefinition,\n} from './languages.js';\nimport React, {\n createContext,\n startTransition,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport {\n directionFor,\n type MessageFormat,\n pseudoExpand,\n pseudoLocalize,\n translate,\n type TranslationMessages,\n} from './core/messages.js';\n\n/**\n * Window event that previews a language, text direction or pseudo-locale in\n * every mounted `TranslationProvider`, without changing the user's language.\n *\n * Dispatch it with a {@link TranslationPreviewDetail}:\n *\n * ```ts\n * window.dispatchEvent(\n * new CustomEvent(TRANSLATION_PREVIEW_EVENT, {\n * detail: { language: 'ar', direction: 'ltr', pseudoLocale: 'expanded' },\n * })\n * );\n * ```\n *\n * Each event replaces the whole preview: a field that is missing or invalid\n * falls back to its default (no preview language, `'auto'`, `'off'`), so an\n * empty detail ends the preview. The preview language is never written to\n * storage, and a preview direction wins over the language's own direction.\n */\nexport const TRANSLATION_PREVIEW_EVENT = 'linked:translation-preview';\n\nexport type TranslationPreviewDirection = 'auto' | 'ltr' | 'rtl';\nexport type TranslationPreviewPseudoLocale = 'off' | 'accented' | 'expanded';\n\n/** The `detail` of a {@link TRANSLATION_PREVIEW_EVENT}. */\nexport interface TranslationPreviewDetail {\n /** BCP-47 tag to render in instead of the selected language. */\n language?: string;\n /** Force a text direction; `'auto'` uses the language's own. */\n direction?: TranslationPreviewDirection;\n /**\n * `'accented'` accents every message; `'expanded'` pads every message by\n * about a third to show controls that only fit their English copy.\n */\n pseudoLocale?: TranslationPreviewPseudoLocale;\n}\n\nconst EMPTY_MESSAGES: Record<string, TranslationMessages> = {};\n\n/**\n * React binding for the translation core (Plan 014 P1.5). Kept in a `/react`\n * subpath so non-React consumers use `./core/messages` without pulling React.\n * Message LOADING is caller-injected (`loadMessages`) so this stays transport-\n * agnostic: dev wires it to the host's API, prod to the bundled `{lang}.json` with a\n * CDN overlay (AD-J/AD-K) — the provider doesn't care which.\n *\n * The hook shape mirrors Tolgee (`useTranslate().t(key, default, params)`,\n * `useLanguage()`), so swapping serve's provider touches only its i18n file.\n */\n\nexport interface TranslationLanguage {\n tag: string; // BCP-47\n label: string;\n direction?: 'ltr' | 'rtl';\n fallback?: string;\n}\n\nexport interface TranslationCallOptions {\n /** Explicit syntax for an inline default before per-key catalog metadata loads. */\n format?: MessageFormat;\n}\n\ntype TranslateFn = (\n key: string,\n defaultValue?: string,\n params?: Record<string, unknown>,\n options?: TranslationCallOptions\n) => string;\n\ninterface TranslationContextValue {\n t: TranslateFn;\n /** `t` over no catalog: exactly what the server rendered. */\n tInline: TranslateFn;\n language: string;\n setLanguage: (tag: string) => void;\n languages: TranslationLanguage[];\n dir: 'ltr' | 'rtl';\n}\n\nconst TranslationContext = createContext<TranslationContextValue | null>(null);\n\nexport interface TranslationProviderProps {\n children: React.ReactNode;\n languages: TranslationLanguage[];\n /** Optional live catalog metadata, refreshed independently of an app build. */\n loadLanguages?: () => Promise<TranslationLanguageDefinition[]>;\n defaultLanguage?: string;\n /** Global message format. 'simple' = FormatSimple (Tolgee-compatible default). */\n format?: MessageFormat;\n /** Caller-injected loader: dev→API, prod→bundled file then CDN overlay. */\n loadMessages: (language: string) => Promise<TranslationMessages>;\n /** localStorage key persisting the selected language. */\n storageKey?: string;\n}\n\nexport function TranslationProvider({\n children,\n languages: initialLanguages,\n loadLanguages,\n defaultLanguage = 'en',\n format = 'simple',\n loadMessages,\n storageKey = 'linked.lang',\n}: TranslationProviderProps) {\n const [remoteLanguages, setRemoteLanguages] =\n useState<TranslationLanguageDefinition[]>();\n const languages = remoteLanguages\n ? remoteLanguages\n .filter((item) => item.enabled && item.supported)\n .map((item) => ({\n tag: item.code,\n label: item.nativeName,\n direction: item.direction,\n fallback: item.fallback,\n }))\n : initialLanguages;\n const [language, setLanguageState] = useState<string>(() => {\n if (typeof window !== 'undefined') {\n const stored = window.localStorage?.getItem(storageKey);\n if (stored && languages.some((l) => l.tag === stored)) return stored;\n }\n return defaultLanguage;\n });\n const [previewLanguage, setPreviewLanguage] = useState<string | null>(null);\n const [previewPseudoLocale, setPreviewPseudoLocale] =\n useState<TranslationPreviewPseudoLocale>('off');\n const [previewDirection, setPreviewDirection] =\n useState<TranslationPreviewDirection>('auto');\n const effectiveLanguage = previewLanguage ?? language;\n // A preview direction is an editor coordinate and wins; otherwise the\n // configured language's own direction, then the tag's script default.\n const dir =\n previewDirection === 'ltr' || previewDirection === 'rtl'\n ? previewDirection\n : (languages.find((item) => item.tag === effectiveLanguage)?.direction ??\n directionFor(effectiveLanguage));\n useEffect(() => {\n if (!loadLanguages) return;\n let cancelled = false;\n loadLanguages()\n .then((items) => {\n if (!cancelled) {\n setRemoteLanguages(items);\n setMessagesByLang({});\n const stored =\n typeof window !== 'undefined'\n ? window.localStorage?.getItem(storageKey)\n : null;\n if (\n stored &&\n items.some(\n (item) => item.code === stored && item.enabled && item.supported\n )\n )\n setLanguageState(stored);\n }\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [loadLanguages, storageKey]);\n const [messagesByLang, setMessagesByLang] = useState<\n Record<string, TranslationMessages>\n >({});\n\n // Load the active language's messages once. English renders from inline\n // defaults until (and if) a payload arrives, so the app is never blank.\n useEffect(() => {\n if (messagesByLang[effectiveLanguage]) return;\n let cancelled = false;\n const chain = languageFallbacks(\n effectiveLanguage,\n defaultLanguage,\n remoteLanguages\n ).reverse();\n Promise.all(chain.map((code) => loadMessages(code).catch(() => ({}))))\n .then((maps) => Object.assign({}, ...maps) as TranslationMessages)\n .then((msgs) => {\n if (!cancelled) {\n // A descendant lazy route may still be hydrating when the catalog\n // arrives. Overlay messages without replacing its server-rendered\n // DOM; inline defaults remain usable until the transition commits.\n startTransition(() => {\n setMessagesByLang((prev) => ({\n ...prev,\n [effectiveLanguage]: msgs,\n }));\n });\n }\n })\n .catch(() => {\n /* offline / missing → keep inline defaults */\n });\n return () => {\n cancelled = true;\n };\n }, [\n effectiveLanguage,\n loadMessages,\n messagesByLang,\n defaultLanguage,\n remoteLanguages,\n ]);\n\n // Preview locale is an ephemeral editor coordinate. It intentionally does\n // not call setLanguage(), because doing so would persist a test condition as\n // the app user's real language preference.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const onPreview = (event: Event) => {\n const detail = (event as CustomEvent<TranslationPreviewDetail | null>)\n .detail;\n const nextLanguage: unknown = detail?.language;\n const nextPseudoLocale: unknown = detail?.pseudoLocale;\n const nextDirection: unknown = detail?.direction;\n setPreviewLanguage(\n typeof nextLanguage === 'string' && nextLanguage ? nextLanguage : null\n );\n setPreviewPseudoLocale(\n nextPseudoLocale === 'accented' || nextPseudoLocale === 'expanded'\n ? nextPseudoLocale\n : 'off'\n );\n setPreviewDirection(\n nextDirection === 'ltr' || nextDirection === 'rtl'\n ? nextDirection\n : 'auto'\n );\n };\n window.addEventListener(TRANSLATION_PREVIEW_EVENT, onPreview);\n return () =>\n window.removeEventListener(TRANSLATION_PREVIEW_EVENT, onPreview);\n }, []);\n\n // Reflect the effective language and text direction on <html>.\n useEffect(() => {\n if (typeof document !== 'undefined') {\n document.documentElement.dir = dir;\n document.documentElement.lang = effectiveLanguage;\n }\n }, [effectiveLanguage, dir]);\n\n const setLanguage = useCallback(\n (tag: string) => {\n setLanguageState(tag);\n if (typeof window !== 'undefined') {\n window.localStorage?.setItem(storageKey, tag);\n }\n },\n [storageKey]\n );\n\n const translatorFor = useCallback(\n (catalogs: Record<string, TranslationMessages>): TranslateFn =>\n (key, defaultValue, params, options) => {\n const translated = translate(\n catalogs[effectiveLanguage] ?? {},\n key,\n defaultValue,\n params,\n options?.format ?? format,\n effectiveLanguage\n );\n if (previewPseudoLocale === 'accented') {\n return effectiveLanguage.toLowerCase() === 'en-xa'\n ? translated\n : pseudoLocalize(translated);\n }\n return previewPseudoLocale === 'expanded'\n ? pseudoExpand(translated)\n : translated;\n },\n [effectiveLanguage, format, previewPseudoLocale]\n );\n const t = useMemo(\n () => translatorFor(messagesByLang),\n [translatorFor, messagesByLang]\n );\n const tInline = useMemo(() => translatorFor(EMPTY_MESSAGES), [translatorFor]);\n\n const value = useMemo<TranslationContextValue>(\n () => ({\n t,\n tInline,\n language: effectiveLanguage,\n setLanguage,\n languages,\n dir,\n }),\n [t, tInline, effectiveLanguage, setLanguage, languages, dir]\n );\n\n return (\n <TranslationContext.Provider value={value}>\n {children}\n </TranslationContext.Provider>\n );\n}\n\nfunction useTranslationContext(hook: string): TranslationContextValue {\n const ctx = useContext(TranslationContext);\n if (!ctx)\n throw new Error(`${hook} must be used within a <TranslationProvider>`);\n return ctx;\n}\n\n/** Tolgee-compatible: `const { t } = useTranslate()`. */\nexport function useTranslate() {\n const ctx = useTranslationContext('useTranslate');\n // The server never has a catalog, and a lazy descendant can hydrate after\n // the catalog has already reached context. Gating per consumer means every\n // hydrating render replays the inline defaults, then re-renders with the\n // catalog once that consumer commits.\n const hydrated = useSyncExternalStore(\n subscribeNever,\n () => true,\n () => false\n );\n return { t: hydrated ? ctx.t : ctx.tInline };\n}\n\nconst subscribeNever = () => () => {};\n\n/** Active language + switcher + direction + the available languages. */\nexport function useLanguage() {\n const ctx = useTranslationContext('useLanguage');\n return {\n language: ctx.language,\n setLanguage: ctx.setLanguage,\n languages: ctx.languages,\n dir: ctx.dir,\n };\n}\n\n/** JSX convenience (Tolgee `<T keyName=… />`). */\nexport function T({\n keyName,\n defaultValue,\n params,\n format,\n}: {\n keyName: string;\n defaultValue?: string;\n params?: Record<string, unknown>;\n format?: MessageFormat;\n}) {\n const { t } = useTranslate();\n return <>{t(keyName, defaultValue, params, { format })}</>;\n}\n"]}
|
package/lib/esm/records.d.ts
CHANGED
|
@@ -142,8 +142,9 @@ export interface TranslationEntryRecord {
|
|
|
142
142
|
/** Optional semantic organization for translations supplied with LINKED shapes. */
|
|
143
143
|
ofShape?: string;
|
|
144
144
|
ofProperty?: string;
|
|
145
|
+
ofResource?: string;
|
|
145
146
|
fromPackage?: string;
|
|
146
|
-
/**
|
|
147
|
+
/** Explicit app wording for a shape/property/resource/package declaration (AD-N). */
|
|
147
148
|
overridden?: boolean;
|
|
148
149
|
currentVersion?: TranslationKeyVersionRecord;
|
|
149
150
|
versions?: TranslationKeyVersionRecord[];
|
package/lib/esm/records.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/records.ts"],"names":[],"mappings":"","sourcesContent":["/** Review lifecycle shared by the portable runtime and authoring clients. */\nexport type TranslationState =\n | 'untranslated'\n | 'machine'\n | 'reviewed'\n | 'stale';\n\n/** Plain RPC-safe value for one language. Never contains a live Shape. */\nexport interface TranslationUnitRecord {\n language: string;\n text: string;\n state: TranslationState;\n /** Machine-provider provenance for the current value (`tm` for memory). */\n origin?: string;\n updatedAt?: string;\n keyVersionId?: string;\n}\n\n/** Plain immutable source/argument-contract record for Studio and RPC. */\nexport interface TranslationKeyVersionRecord {\n id: string;\n versionId: string;\n sourceLanguage: string;\n sourceText: string;\n format: 'simple' | 'icu';\n argumentSignature: string;\n contractHash: string;\n sourceHash: string;\n supersedes?: string;\n createdAt?: string;\n createdBy?: string;\n}\n\nexport type TranslationReleaseChannel = 'preview' | 'production';\nexport type TranslationReleaseStatus =\n | 'draft'\n | 'published'\n | 'superseded'\n | 'retired';\n\n/** Plain graph metadata for a schema-v2 translation release. */\nexport interface TranslationReleaseRecord {\n id: string;\n releaseId: string;\n appId: string;\n branchId: string;\n buildId?: string;\n channel: TranslationReleaseChannel;\n status: TranslationReleaseStatus;\n contractSetHash: string;\n manifestHash: string;\n hotfixSequence: number;\n qualitySummary?: string;\n createdAt: string;\n publishedAt?: string;\n supportedUntil?: string;\n supersedes?: string;\n}\n\n/** Lifecycle of one authored value (Plan 017 AD-P). */\nexport type TranslationRevisionStatus =\n | 'applied' // a direct edit, recorded as history\n | 'proposed' // awaiting a reviewer (human author)\n | 'suggested' // awaiting a reviewer (machine author)\n | 'accepted'\n | 'rejected'\n | 'superseded';\n\n/** Plain RPC-safe view of one revision (history entry / pending value). */\nexport interface TranslationRevisionRecord {\n id: string;\n key: string;\n language: string;\n text: string;\n status: TranslationRevisionStatus;\n author?: string;\n authorKind: 'human' | 'machine';\n mtProvider?: string;\n basedOnText?: string;\n note?: string;\n createdAt?: string;\n decidedAt?: string;\n decidedBy?: string;\n keyVersionId?: string;\n /** Current unit diverged after this proposal was authored. */\n conflicted?: boolean;\n currentText?: string;\n}\n\nexport interface TranslationProposalDecision {\n revision: TranslationRevisionRecord;\n unit?: TranslationUnitRecord;\n}\n\nexport type TranslationMemoryMatchKind = 'exact' | 'carry-forward';\n\n/**\n * One reviewed unit that can seed the current key version. Exact source\n * matches may pretranslate as machine/TM; changed source text is an explicit\n * same-key carry-forward review.\n */\nexport interface TranslationMemoryMatchRecord {\n unitId: string;\n key: string;\n language: string;\n text: string;\n keyVersionId: string;\n sourceText: string;\n sourceHash: string;\n contractHash: string;\n kind: TranslationMemoryMatchKind;\n updatedAt?: string;\n}\n\n/** Searchable reviewed unit exposed by the explicit Translation Memory browser. */\nexport interface TranslationMemoryRecord {\n unitId: string;\n key: string;\n language: string;\n text: string;\n keyVersionId: string;\n sourceText: string;\n sourceHash: string;\n contractHash: string;\n updatedAt?: string;\n}\n\nexport interface TranslationMemoryPretranslateCandidate {\n key: string;\n language: string;\n unitId: string;\n sourceKey: string;\n text: string;\n}\n\nexport interface TranslationMemoryPretranslateReport {\n language: string;\n eligible: number;\n translated: number;\n candidates: TranslationMemoryPretranslateCandidate[];\n}\n\n/** Termbase entry behavior (Plan 017 B2-1). */\nexport type GlossaryTermType = 'prefer' | 'require' | 'keep' | 'forbid';\n\n/** Plain RPC-safe termbase entry (steers MT + checks; Plan 014 AD-L / 017 B2). */\nexport interface GlossaryTermRecord {\n id: string;\n term: string;\n /** prefer = translate as `translation`; keep = do-not-translate; forbid = never use. */\n termType: GlossaryTermType;\n /** Preferred translation (prefer entries). */\n translation?: string;\n /** Replacement wording (forbid entries — alternative-spelling policing). */\n useInstead?: string;\n /** Target language this applies to; empty = all languages. */\n language?: string;\n /** Exact-casing match (proper nouns / all-caps styling). */\n caseSensitive?: boolean;\n description?: string;\n}\n\n/** Plain RPC-safe editor/runtime view of a key and its language values. */\nexport interface TranslationEntryRecord {\n key: string;\n namespace: string;\n sourceText: string;\n description?: string;\n kind: 'ui' | 'content';\n format: 'simple' | 'icu';\n /** Optional semantic organization for translations supplied with LINKED shapes. */\n ofShape?: string;\n ofProperty?: string;\n fromPackage?: string;\n /**
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/records.ts"],"names":[],"mappings":"","sourcesContent":["/** Review lifecycle shared by the portable runtime and authoring clients. */\nexport type TranslationState =\n | 'untranslated'\n | 'machine'\n | 'reviewed'\n | 'stale';\n\n/** Plain RPC-safe value for one language. Never contains a live Shape. */\nexport interface TranslationUnitRecord {\n language: string;\n text: string;\n state: TranslationState;\n /** Machine-provider provenance for the current value (`tm` for memory). */\n origin?: string;\n updatedAt?: string;\n keyVersionId?: string;\n}\n\n/** Plain immutable source/argument-contract record for Studio and RPC. */\nexport interface TranslationKeyVersionRecord {\n id: string;\n versionId: string;\n sourceLanguage: string;\n sourceText: string;\n format: 'simple' | 'icu';\n argumentSignature: string;\n contractHash: string;\n sourceHash: string;\n supersedes?: string;\n createdAt?: string;\n createdBy?: string;\n}\n\nexport type TranslationReleaseChannel = 'preview' | 'production';\nexport type TranslationReleaseStatus =\n | 'draft'\n | 'published'\n | 'superseded'\n | 'retired';\n\n/** Plain graph metadata for a schema-v2 translation release. */\nexport interface TranslationReleaseRecord {\n id: string;\n releaseId: string;\n appId: string;\n branchId: string;\n buildId?: string;\n channel: TranslationReleaseChannel;\n status: TranslationReleaseStatus;\n contractSetHash: string;\n manifestHash: string;\n hotfixSequence: number;\n qualitySummary?: string;\n createdAt: string;\n publishedAt?: string;\n supportedUntil?: string;\n supersedes?: string;\n}\n\n/** Lifecycle of one authored value (Plan 017 AD-P). */\nexport type TranslationRevisionStatus =\n | 'applied' // a direct edit, recorded as history\n | 'proposed' // awaiting a reviewer (human author)\n | 'suggested' // awaiting a reviewer (machine author)\n | 'accepted'\n | 'rejected'\n | 'superseded';\n\n/** Plain RPC-safe view of one revision (history entry / pending value). */\nexport interface TranslationRevisionRecord {\n id: string;\n key: string;\n language: string;\n text: string;\n status: TranslationRevisionStatus;\n author?: string;\n authorKind: 'human' | 'machine';\n mtProvider?: string;\n basedOnText?: string;\n note?: string;\n createdAt?: string;\n decidedAt?: string;\n decidedBy?: string;\n keyVersionId?: string;\n /** Current unit diverged after this proposal was authored. */\n conflicted?: boolean;\n currentText?: string;\n}\n\nexport interface TranslationProposalDecision {\n revision: TranslationRevisionRecord;\n unit?: TranslationUnitRecord;\n}\n\nexport type TranslationMemoryMatchKind = 'exact' | 'carry-forward';\n\n/**\n * One reviewed unit that can seed the current key version. Exact source\n * matches may pretranslate as machine/TM; changed source text is an explicit\n * same-key carry-forward review.\n */\nexport interface TranslationMemoryMatchRecord {\n unitId: string;\n key: string;\n language: string;\n text: string;\n keyVersionId: string;\n sourceText: string;\n sourceHash: string;\n contractHash: string;\n kind: TranslationMemoryMatchKind;\n updatedAt?: string;\n}\n\n/** Searchable reviewed unit exposed by the explicit Translation Memory browser. */\nexport interface TranslationMemoryRecord {\n unitId: string;\n key: string;\n language: string;\n text: string;\n keyVersionId: string;\n sourceText: string;\n sourceHash: string;\n contractHash: string;\n updatedAt?: string;\n}\n\nexport interface TranslationMemoryPretranslateCandidate {\n key: string;\n language: string;\n unitId: string;\n sourceKey: string;\n text: string;\n}\n\nexport interface TranslationMemoryPretranslateReport {\n language: string;\n eligible: number;\n translated: number;\n candidates: TranslationMemoryPretranslateCandidate[];\n}\n\n/** Termbase entry behavior (Plan 017 B2-1). */\nexport type GlossaryTermType = 'prefer' | 'require' | 'keep' | 'forbid';\n\n/** Plain RPC-safe termbase entry (steers MT + checks; Plan 014 AD-L / 017 B2). */\nexport interface GlossaryTermRecord {\n id: string;\n term: string;\n /** prefer = translate as `translation`; keep = do-not-translate; forbid = never use. */\n termType: GlossaryTermType;\n /** Preferred translation (prefer entries). */\n translation?: string;\n /** Replacement wording (forbid entries — alternative-spelling policing). */\n useInstead?: string;\n /** Target language this applies to; empty = all languages. */\n language?: string;\n /** Exact-casing match (proper nouns / all-caps styling). */\n caseSensitive?: boolean;\n description?: string;\n}\n\n/** Plain RPC-safe editor/runtime view of a key and its language values. */\nexport interface TranslationEntryRecord {\n key: string;\n namespace: string;\n sourceText: string;\n description?: string;\n kind: 'ui' | 'content';\n format: 'simple' | 'icu';\n /** Optional semantic organization for translations supplied with LINKED shapes. */\n ofShape?: string;\n ofProperty?: string;\n ofResource?: string;\n fromPackage?: string;\n /** Explicit app wording for a shape/property/resource/package declaration (AD-N). */\n overridden?: boolean;\n currentVersion?: TranslationKeyVersionRecord;\n versions?: TranslationKeyVersionRecord[];\n units: Record<string, TranslationUnitRecord>;\n}\n"]}
|