--- title: 'Entry I18n' --- # Entry I18n ## Scope - Entry-level i18n collections in project t1 - Create flow for collections that store one language per entry - Draft language selection before the first save ## Prerequisites - Run in mock mode only - Use project t1 - Collections: - articles_i18n for default-language create flow - articles_i18n_picklang for explicit language picker flow - articles_i18n_nested for nested languageField/groupField tests ## Test Cases | ID | Description | Expected Result | Priority | | --- | --- | --- | --- | | EI18N-06 | Open /entries/new for articles_i18n | Draft language switcher is visible, default language is preselected, hidden system fields stay hidden | High | | EI18N-07 | Change draft language before first save | Selected draft language becomes active and remains active after save | High | | EI18N-08 | Create from collection without usable default language | Language picker appears before navigation and selected language is prefilled in the draft | High | | EI18N-08b | Duplicate an existing translated entry from EntryView | New draft keeps the source language active and visible translatable fields are prefilled from the source entry | High | | EI18N-09 | Run AI translate on an existing target-language entry | Best sibling source is picked by content score and language order, translatable fields update, non-translatable fields stay unchanged | High | | EI18N-24 | Use the Nova icon inside the create-language menu | The normal row still creates a copy, the Nova action creates the target language and immediately starts translation from the currently open source entry | High | | EI18N-13 | Edit a normal field in an existing translated entry | TranslationBar state stays stable and no extra sibling list GET is triggered while typing | High | | EI18N-12 | Press Ctrl+L on an existing translated entry | Entry view navigates to the next sibling language instead of only flashing the shortcut highlight | High | | EI18N-25 | Create translation from existing entry navigates to create mode with pre-filled fields | After clicking a target language in the create menu, the browser navigates to /entries/new?lang=; required fields from the source entry are preserved, non-required clearFields are emptied | High | | EI18N-26 | Create translation with unsaved changes shows dirty guard first | If the source entry has unsaved changes, a discard dialog appears before navigating to create mode | Medium | | EI18N-60 | Nested i18n: details.lang and details.translationGroup are hidden from form | The object field "details" is visible but the sub-fields "lang" and "translationGroup" are not rendered | High | | EI18N-61 | Nested i18n: regular fields are visible | title, slug, summary, body are visible and editable | High | | EI18N-62 | Nested i18n: TranslationBar shows language tabs | TranslationBar renders with DE active, EN/FR siblings visible | High | | EI18N-63 | Nested i18n: create translation from existing entry | Creating a translation navigates to create mode with pre-filled fields, details.lang is set to the target language | High | ## Edge Cases - Direct deeplink to /entries/new should still get a usable default if one exists - Collections without a default language must not silently create the wrong language - Duplicating an EN or FR entry must not reopen the draft in the collection default language and hide the copied values in another language tab - When multiple sibling source entries have equal content, the earlier configured language should win as deterministic fallback - The Nova action in the create menu must keep the source pinned to the currently open language entry, even if another sibling would score higher globally - Ctrl+L must not be swallowed by field-i18n logic when the collection only uses entry-level i18n - Unsaved typing in non-language fields must not re-request sibling translations for the current translation group - Nested i18n config (languageField inside an object field): the parent object stays visible but system sub-fields (lang, translationGroup) are filtered out in FieldRenderer - Creating a translation in nested config: clone must correctly handle dotted clearField paths (e.g. empty nested title/body) - Unterbrochener Create-Mode (Benutzer navigiert weg vor dem Speichern) muss keine verwaisten POSTs hinterlassen — der create-mode Clone-Flow erzeugt erst beim expliziten Speichern einen POST ## Accessibility - Language picker must be a modal dialog with focus trap and ESC close - Draft language controls must stay keyboard accessible - Existing-entry language switching via Ctrl+L must remain keyboard accessible and trigger real navigation