Initial: Tibi-Doku auf Starlight-Basis (Nova-Theme, Docker-Stack, Sync-Skripte)

This commit is contained in:
apairon committed 2026-10-16 11:43:04 +00:00
commit 58502aa3c8
78 files changed
+22860

No files matched your search

@@ -0,0 +1,58 @@
---
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=<target>; 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