The main publish menu now shows opt-in switches for each target language with unpublished changes. Default-locale-only publishing stays the default — flip a locale switch when you are ready to ship that translation.
What changed
Scoped publishing (default locale only) was deliberate — a site-wide Publish should not silently push draft German or Spanish variants live. The fix is not to abandon that guardrail; it is to surface per-language publish in the main menu where you already ship source content.When a target language has pending changes, the publish dropdown shows a switch under Page content with the same N changes pill the source rows use. Enable the locales you want, click Publish, done. Monolingual sites and locales with nothing pending see no new UI.
Why it works this way
Opt-in by default — translation switches start off. Plain Publish still means source language only.
Isolated locale passes — Aveiro publishes each selected locale in its own pass, so broken MDX in one language does not block another.
One publish path — locale publish is only in the header menu now (the duplicate bottom button in the language panel is gone). Each switch publishes page variants and site text for that locale.
We also fixed a React hooks ordering bug in the Translations readiness card that could show An error occurred when opening the tab in some states.
For API callers
No endpoint changes. POST /api/v1/sites/{siteId}/publish still accepts optional locale_scope (default, all, or a locale list). Omitted means default locale only — the same contract the dashboard mirrors with switches. See Publish site API.