@_linked/translation 0.8.1 → 0.9.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/lib/esm/authorization.js +8 -2
- package/lib/esm/authorization.js.map +1 -1
- package/lib/esm/data/translation.ttl +489 -0
- package/lib/esm/exchange.js +12 -2
- package/lib/esm/exchange.js.map +1 -1
- package/lib/esm/mt.js +6 -1
- package/lib/esm/mt.js.map +1 -1
- package/lib/esm/ontologies/translation.d.ts +4 -9
- package/lib/esm/ontologies/translation.js +5 -5
- package/lib/esm/ontologies/translation.js.map +1 -1
- package/lib/esm/ontologies/translation.register.js +2 -2
- package/lib/esm/ontologies/translation.register.js.map +1 -1
- package/lib/esm/package.d.ts +1 -1
- package/lib/esm/react.js +6 -1
- package/lib/esm/react.js.map +1 -1
- package/package.json +4 -4
- package/src/authorization.ts +9 -2
- package/src/data/translation.ttl +489 -0
- package/src/exchange.ts +11 -2
- package/src/mt.ts +6 -1
- package/src/ontologies/translation.register.ts +2 -2
- package/src/ontologies/translation.ts +6 -7
- package/src/react.tsx +6 -1
- package/lib/esm/data/translation.json +0 -8
- package/src/data/translation.json +0 -8
package/lib/esm/mt.js
CHANGED
|
@@ -8,8 +8,13 @@
|
|
|
8
8
|
* SDK imports — concrete providers live with the host application and are
|
|
9
9
|
* registered at boot.
|
|
10
10
|
*/
|
|
11
|
+
import { sharedState } from '@_linked/core/utils/sharedState';
|
|
11
12
|
import { analyzeMessage, compareMessageArguments, } from './message-format.js';
|
|
12
|
-
|
|
13
|
+
// On globalThis so a provider the host registers on one copy of this module is found by
|
|
14
|
+
// another copy.
|
|
15
|
+
const { providers } = sharedState('@_linked/translation', 'mt', () => ({
|
|
16
|
+
providers: new Map(),
|
|
17
|
+
}));
|
|
13
18
|
export function registerMtProvider(provider) {
|
|
14
19
|
providers.set(provider.key, provider);
|
|
15
20
|
}
|
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 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"]}
|
|
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 { sharedState } from '@_linked/core/utils/sharedState';\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\n// On globalThis so a provider the host registers on one copy of this module is found by\n// another copy.\nconst { providers } = sharedState('@_linked/translation', 'mt', () => ({\n providers: new Map<string, TranslationMtProvider>(),\n}));\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,12 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
rdfs: string;
|
|
6
|
-
translation: string;
|
|
7
|
-
};
|
|
8
|
-
"@graph": any[];
|
|
9
|
-
}>;
|
|
1
|
+
/** The package's ontology data, relative to this module (Turtle, copied into `lib/` by the build). */
|
|
2
|
+
export declare const dataFiles: string[];
|
|
3
|
+
/** Reads the package's ontology data (server only). */
|
|
4
|
+
export declare const loadData: () => Promise<string[]>;
|
|
10
5
|
/**
|
|
11
6
|
* Public ontology namespace for the translation package. First-party Linked
|
|
12
7
|
* ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createNameSpace } from '@_linked/core/utils/NameSpace';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { loadOntologyFiles } from '@_linked/core/ontology/loadOntologyFiles';
|
|
3
|
+
/** The package's ontology data, relative to this module (Turtle, copied into `lib/` by the build). */
|
|
4
|
+
export const dataFiles = ['../data/translation.ttl'];
|
|
5
|
+
/** Reads the package's ontology data (server only). */
|
|
6
|
+
export const loadData = () => loadOntologyFiles(import.meta.url, dataFiles);
|
|
7
7
|
/**
|
|
8
8
|
* Public ontology namespace for the translation package. First-party Linked
|
|
9
9
|
* ontologies live at `https://linked.cm/ont/{ontologySlug}/{localName}`, where
|
|
@@ -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 * (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"]}
|
|
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';\nimport { loadOntologyFiles } from '@_linked/core/ontology/loadOntologyFiles';\n\n/** The package's ontology data, relative to this module (Turtle, copied into `lib/` by the build). */\nexport const dataFiles = ['../data/translation.ttl'];\n\n/** Reads the package's ontology data (server only). */\nexport const loadData = () => loadOntologyFiles(import.meta.url, dataFiles);\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"]}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* From a sibling module the same import is ordinary and survives.
|
|
12
12
|
*/
|
|
13
13
|
import * as terms from './translation.js';
|
|
14
|
-
import { loadData, ns } from './translation.js';
|
|
14
|
+
import { dataFiles, loadData, ns } from './translation.js';
|
|
15
15
|
import { linkedOntology } from '../package.js';
|
|
16
|
-
linkedOntology(terms, ns, 'translation', loadData,
|
|
16
|
+
linkedOntology(terms, ns, 'translation', loadData, dataFiles);
|
|
17
17
|
//# sourceMappingURL=translation.register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translation.register.js","sourceRoot":"","sources":["../../../src/ontologies/translation.register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"translation.register.js","sourceRoot":"","sources":["../../../src/ontologies/translation.register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAC,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAE7C,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC","sourcesContent":["/**\n * Registers this ontology.\n *\n * Kept out of `translation.ts` because registration needs that module's whole export\n * namespace, and a module cannot import itself once a bundler is involved: Rollup\n * treats a static self-reference as a circular import and elides it, so the binding is\n * undefined at runtime and the consuming app dies at boot with `_this is not\n * defined`. `tsc` preserves it, which is why the pattern survived for as long as\n * packages were built with `tsc` alone.\n *\n * From a sibling module the same import is ordinary and survives.\n */\nimport * as terms from './translation.js';\nimport {dataFiles, loadData, ns} from './translation.js';\nimport {linkedOntology} from '../package.js';\n\nlinkedOntology(terms, ns, 'translation', loadData, dataFiles);\n"]}
|
package/lib/esm/package.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const linkedShape: {
|
|
2
2
|
<T extends typeof import("@_linked/core/shapes/Shape.js").Shape>(constructor: T): void;
|
|
3
3
|
<T extends typeof import("@_linked/core/shapes/Shape.js").Shape>(config?: import("@_linked/core/utils/Package").ShapeConfig): (constructor: T) => void;
|
|
4
|
-
}, linkedUtil: (constructor: any) => any, linkedOntology: (allFileExports: any, nameSpace: (term: string) => import("@_linked/core/utils/NodeReference.js").NodeReferenceValue, suggestedPrefixAndFileName: string, loadDataFunction?: () => Promise<
|
|
4
|
+
}, linkedUtil: (constructor: any) => any, linkedOntology: (allFileExports: any, nameSpace: (term: string) => import("@_linked/core/utils/NodeReference.js").NodeReferenceValue, suggestedPrefixAndFileName: string, loadDataFunction?: () => Promise<unknown>, dataSource?: string | string[]) => void, registerPackageExport: (exportedObject: any) => void, packageExports: any, packageName: string, getPackageShape: (name: string) => import("@_linked/core/shapes/Shape.js").ShapeConstructor | undefined;
|
package/lib/esm/react.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { sharedState } from '@_linked/core/utils/sharedState';
|
|
2
3
|
import { languageFallbacks, } from './languages.js';
|
|
3
4
|
import { createContext, startTransition, useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore, } from 'react';
|
|
4
5
|
import { directionFor, pseudoExpand, pseudoLocalize, translate, } from './core/messages.js';
|
|
@@ -23,7 +24,11 @@ import { directionFor, pseudoExpand, pseudoLocalize, translate, } from './core/m
|
|
|
23
24
|
*/
|
|
24
25
|
export const TRANSLATION_PREVIEW_EVENT = 'linked:translation-preview';
|
|
25
26
|
const EMPTY_MESSAGES = {};
|
|
26
|
-
|
|
27
|
+
// The context object is kept on globalThis: a context created per copy of this module would
|
|
28
|
+
// leave a consumer in one copy blind to a provider from the other (it gets the null default).
|
|
29
|
+
const { TranslationContext } = sharedState('@_linked/translation', 'react.contexts', () => ({
|
|
30
|
+
TranslationContext: createContext(null),
|
|
31
|
+
}));
|
|
27
32
|
export function TranslationProvider({ children, languages: initialLanguages, loadLanguages, defaultLanguage = 'en', format = 'simple', loadMessages, storageKey = 'linked.lang', }) {
|
|
28
33
|
var _a, _b;
|
|
29
34
|
const [remoteLanguages, setRemoteLanguages] = useState();
|
package/lib/esm/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sharedState } from '@_linked/core/utils/sharedState';\nimport {\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\n// The context object is kept on globalThis: a context created per copy of this module would\n// leave a consumer in one copy blind to a provider from the other (it gets the null default).\nconst { TranslationContext } = sharedState('@_linked/translation', 'react.contexts', () => ({\n TranslationContext: createContext<TranslationContextValue | null>(null),\n}));\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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@_linked/translation",
|
|
3
3
|
"description": "LINKED translation management — graph-native i18n keys + units, Tolgee-compatible client, CDN delivery.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.0",
|
|
5
5
|
"packageManager": "npm@12.2.0",
|
|
6
6
|
"linkedPackage": true,
|
|
7
7
|
"type": "module",
|
|
@@ -90,8 +90,8 @@
|
|
|
90
90
|
}
|
|
91
91
|
},
|
|
92
92
|
"dependencies": {
|
|
93
|
-
"@_linked/core": "^2.
|
|
94
|
-
"@_linked/server-utils": "^1.
|
|
93
|
+
"@_linked/core": "^2.37.1",
|
|
94
|
+
"@_linked/server-utils": "^1.15.0",
|
|
95
95
|
"@formatjs/icu-messageformat-parser": "3.5.21",
|
|
96
96
|
"fflate": "^0.8.2",
|
|
97
97
|
"intl-messageformat": "12.1.3"
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
}
|
|
110
110
|
},
|
|
111
111
|
"devDependencies": {
|
|
112
|
-
"@_linked/cli": "^1.
|
|
112
|
+
"@_linked/cli": "^1.54.0",
|
|
113
113
|
"@changesets/changelog-github": "^1.0.0",
|
|
114
114
|
"@changesets/cli": "^3.0.0",
|
|
115
115
|
"@testing-library/dom": "^10.4.1",
|
package/src/authorization.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { sharedState } from '@_linked/core/utils/sharedState';
|
|
2
|
+
|
|
1
3
|
export type TranslationAuthoringAction =
|
|
2
4
|
| 'manage'
|
|
3
5
|
| 'review'
|
|
@@ -16,7 +18,11 @@ export type TranslationAuthorizationResolver = (
|
|
|
16
18
|
request: TranslationAuthorizationRequest,
|
|
17
19
|
) => Promise<boolean>;
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
// On globalThis so a second copy of this module sees the resolver the host configured on the
|
|
22
|
+
// first; a copy that cannot see it would deny every author.
|
|
23
|
+
const state = sharedState('@_linked/translation', 'authorization', () => ({
|
|
24
|
+
resolver: undefined as TranslationAuthorizationResolver | undefined,
|
|
25
|
+
}));
|
|
20
26
|
|
|
21
27
|
/**
|
|
22
28
|
* Host hook: the host decides who may read and author an app's translations
|
|
@@ -29,7 +35,7 @@ let resolver: TranslationAuthorizationResolver | undefined;
|
|
|
29
35
|
export function configureTranslationAuthorization(
|
|
30
36
|
next?: TranslationAuthorizationResolver,
|
|
31
37
|
): void {
|
|
32
|
-
resolver = next;
|
|
38
|
+
state.resolver = next;
|
|
33
39
|
}
|
|
34
40
|
|
|
35
41
|
/**
|
|
@@ -39,6 +45,7 @@ export function configureTranslationAuthorization(
|
|
|
39
45
|
export async function canAuthorTranslation(
|
|
40
46
|
request: TranslationAuthorizationRequest,
|
|
41
47
|
): Promise<boolean> {
|
|
48
|
+
const resolver = state.resolver;
|
|
42
49
|
if (!resolver) return false;
|
|
43
50
|
try {
|
|
44
51
|
return (await resolver(request)) === true;
|