Source-managed translations
Each CMS content type can use independently edited language entries (the default) or source-managed translations. Configure this under Content → Translations → Translation workflow by content type. The source language is configurable; it is not necessarily English. Collections and singletons use the same workflow.
Source-managed lists show source entries. Their Translations panel shows each target's publication and update status, with links to read-only previews. Ordinary entry writers, including Automation changesets, cannot edit generated targets. Switch the policy explicitly to independent mode before making independent edits, changing languages, deleting a managed content type or regrouping its entries.
Enabling an existing site
Link translations to their published source through native translation groups first. Resolve unpublished target drafts before activation; enabling source management refuses to discard them. Assign every schema field a rule:
| Rule | Refresh behavior |
|---|---|
| Translate | Export text for rewriting and validate its replacement. |
| Copy from source | Copy facts, media, numbers or other shared values. |
| Keep locale-specific | Retain the target's existing URL, slug or localized value. |
Slug fields must remain locale-specific. Configure initial values for new variants
by locale and field path; templates support {locale} and {source.slug} (or
another scalar source path). Existing values always take precedence. Missing
initial values block a new variant with an explanation in the queue.
Activation changes policy and editor organization only. It does not alter entries, publications, URLs, native translation groups or their histories, and does not queue a mass refresh. Existing variants show Existing — source revision untracked until an actual refresh establishes provenance.
Manual AI rewriting
- Edit and publish the source. Changed publications queue target updates; saving drafts and publishing an unchanged revision do not. Existing target publications remain public while updates are prepared.
- Open Translation updates, select up to 25 requests and download JSON.
- Give the file to your translation tool. Rewrite each
context.fieldsvalue intocontext.target.locale, filling the correspondingtranslationsvalue. Preserve placeholders, including repeated placeholders, and supported HTML. Change onlytranslations; leave identities, hashes and context intact. - Review the text and use Import and publish. Every item must validate before any item is published. A null or missing translated field is incomplete.
The import uses normal CMS publication, history, audit and deployment events. Source, policy, group and target changes invalidate stale requests; an identical retry returns the original result without publishing again. A different result for an already accepted request is rejected. Policy changes supersede pending work; use the source's Refresh translations of this publication action to request fresh work after configuring rules or for an existing publication.
Unpublishing the source atomically unpublishes its generated variants and cancels pending requests. Republishing queues refreshes; it does not silently republish the old translations. New variants become linked members after successful import.
This release does not call translation providers. External AI tools and future provider adapters can consume the same private queue/export/import contract. Public build clients continue reading the existing CMS Content API and v1 native translation groups; no private policy or queue data is exposed there.
Private Automation API
Use a site-bound Automation bearer token, or an owner token with an explicit
site selector. CMS content:read tokens cannot access this API.
| Method and path | Scope | Input |
|---|---|---|
GET /api/v1/automation/translations |
workspace:read |
Optional status, locale, source entry ID, schema ID, after cursor |
GET /api/v1/automation/translations/export |
workspace:read |
ids: comma-separated request IDs (1–25) |
POST /api/v1/automation/translations/import |
workspace:write |
Completed exported JSON, at most 2 MiB |
The equivalent physical-host actions are automation.translations.queue,
automation.translations.export and automation.translations.import at /api/.
Queue responses include next_after; pass it unchanged as after. Responses are
private and uncached. Read and propose-only tokens cannot import. CMS users need
content editing permission to export and publication permission to import.
The batch format is dynostatic.translation-batch, version 1. Exported items
contain request_id, request_sha256, captured context, and translations.
Context carries the source publication revision/hash, policy/group revisions,
target draft revision/content version, locale and source field map. Validation
rejects unknown or protected fields, unsafe formatting and altered placeholders.
Malformed batches return 400; stale/conflicting requests return 409. Neither
partially applies a batch. Always re-export current work after a conflict.
The versioned configuration resource is cms.translation_policy, serialized as
dynostatic.cms-translation-policy v1. Workspace files live under
cms/translation-policies/{id}.json. Normal revision preconditions and website
serialization apply. Policies are opt-in per schema; no Battaglini-specific rules
or English-specific assumptions exist in the core.
Persistence and verification
Migration 202610180001 adds policy and durable request tables without rewriting
the immutable 202610110001 baseline. Current backups include both tables;
immediately-prior baseline backups remain restorable and leave these tables empty.
Focused PHP 8.5 integration checks cover upgrade/replay, collection and singleton refresh, permission denial, stale inputs, atomic rollback, retries, source unpublication, new variants, competing website writers and current/prior backup restore. Three-browser checks cover source-only lists, read-only targets, status, batch controls and mobile layout. These are workflow acceptance, not a complete release certification of every supported runtime/database combination.