editor: German catalog and layout pass #226

Closed
opened 2026-10-12 14:22:49 +02:00 by dominik.polakovics · 0 comments

Summary

Ship the editor in German: a complete de catalog for every key the i18n runtime (#225) uses, including every server error code (#224), plus a layout pass so the longer German strings fit the chrome.

Current behavior

After #225 the editor has a translation runtime, a complete English catalog and language resolution from Accept-Language, but only one catalog. A request with Accept-Language: de renders English.

Desired behavior

  • A de.json next to en.json with every key translated: UI strings, plural forms (key.one / key.other), and the server.* namespace for every exported error code, with the same {name} placeholders as the English entry.
  • The register follows the glossary rule recorded by #225: impersonal phrasing wherever German allows it ("Seite löschen?", "Noch nicht veröffentlicht"), formal "Sie" where a sentence must address the user (unsaved-changes warnings and the like), never "du". The glossary file gains the agreed terms so later strings stay consistent: at least Publish → Veröffentlichen, Pending changes → Ausstehende Änderungen, Discard → Verwerfen, Undo → Rückgängig, Page → Seite, Section → Bereich, Element → Element, Media library → Mediathek, Draft → Entwurf, Translation → Übersetzung, Unused content → Nicht verwendete Inhalte, Live site → Live-Website, Save → Speichern.
  • The parity test from #225 covers de.json: every used key, every server code, nothing unused.
  • The German smoke test renders the shell with Accept-Language: de and asserts a translated string and html[lang="de"].
  • A layout pass over the surfaces where German runs about a third longer: the module rail, the docheader's action buttons and language switch, status chips and pills, dialog buttons, the insert dialog's tiles, the tree pane's legend and filter, form field labels. Where a string overflows or wraps badly, fix the CSS (wrapping, min widths, ellipsis) rather than shortening the German into jargon. Attach before/after screenshots of the affected screens to the PR.

Decisions

  • German catalog in its own issue — so a German-speaking reviewer can review the translation in isolation from the mechanical extraction. Decided 2026-10-12.
  • Impersonal, formal "Sie" as fallback, never "du" — the editor is a tool developers hand to their clients.
  • Server error codes are translated in the client catalog; the server stays English.
  • Site-authored labels (elements, fields, page types, modules) are not translated here; the scaffold's English labels are a separate, untriaged follow-up.
  • The [Translate to <label>:] content marker stays English.

Key interfaces

  • The i18n module from #225: catalog files, the glossary file, the parity and smoke tests.
  • The exported server-code registry from #224.
  • web/src/styles.css and component styles for the layout fixes.

Acceptance criteria

  • de.json passes the parity test: complete, no unused keys, all server codes.
  • Every German string follows the register rule; the glossary lists the agreed terms.
  • The German smoke test passes.
  • With the browser set to German, every screen of the editor on testdata/site and testdata/multilingual-site renders German, including a validation error under a field, an operation refusal in the error strip, the pending-changes list and the publish flow.
  • No clipped or overflowing text on the surfaces listed above at a 1280px-wide window and at the narrowest width the editor supports; screenshots attached.

How to verify

  • make test; make build.
  • harness serve --site testdata/multilingual-site with the browser's language set to German; walk every module, open each dialog, trigger a field error and a conflict (rename a page to an existing slug).
  • Compare the screenshots against the English ones for layout regressions.

Assumptions to check

  • That Intl.PluralRules for de returns only one and other — it does, but confirm the catalog never needs a third form.
  • That the German date and relative-time output from Intl is acceptable in the undo info and source values, or whether a custom relative-time key set is needed.

Out of scope

  • Any language beyond German.
  • Translating site-authored labels or the scaffold's shipped element and page-type labels.
  • Changes to the runtime, the resolution order or the server.

Blocked by

## Summary Ship the editor in German: a complete `de` catalog for every key the i18n runtime (#225) uses, including every server error code (#224), plus a layout pass so the longer German strings fit the chrome. ## Current behavior After #225 the editor has a translation runtime, a complete English catalog and language resolution from `Accept-Language`, but only one catalog. A request with `Accept-Language: de` renders English. ## Desired behavior - A `de.json` next to `en.json` with every key translated: UI strings, plural forms (`key.one` / `key.other`), and the `server.*` namespace for every exported error code, with the same `{name}` placeholders as the English entry. - The register follows the glossary rule recorded by #225: impersonal phrasing wherever German allows it ("Seite löschen?", "Noch nicht veröffentlicht"), formal "Sie" where a sentence must address the user (unsaved-changes warnings and the like), never "du". The glossary file gains the agreed terms so later strings stay consistent: at least Publish → Veröffentlichen, Pending changes → Ausstehende Änderungen, Discard → Verwerfen, Undo → Rückgängig, Page → Seite, Section → Bereich, Element → Element, Media library → Mediathek, Draft → Entwurf, Translation → Übersetzung, Unused content → Nicht verwendete Inhalte, Live site → Live-Website, Save → Speichern. - The parity test from #225 covers `de.json`: every used key, every server code, nothing unused. - The German smoke test renders the shell with `Accept-Language: de` and asserts a translated string and `html[lang="de"]`. - A layout pass over the surfaces where German runs about a third longer: the module rail, the docheader's action buttons and language switch, status chips and pills, dialog buttons, the insert dialog's tiles, the tree pane's legend and filter, form field labels. Where a string overflows or wraps badly, fix the CSS (wrapping, min widths, ellipsis) rather than shortening the German into jargon. Attach before/after screenshots of the affected screens to the PR. ## Decisions - German catalog in its own issue — so a German-speaking reviewer can review the translation in isolation from the mechanical extraction. Decided 2026-10-12. - Impersonal, formal "Sie" as fallback, never "du" — the editor is a tool developers hand to their clients. - Server error codes are translated in the client catalog; the server stays English. - Site-authored labels (elements, fields, page types, modules) are not translated here; the scaffold's English labels are a separate, untriaged follow-up. - The `[Translate to <label>:] ` content marker stays English. ## Key interfaces - The i18n module from #225: catalog files, the glossary file, the parity and smoke tests. - The exported server-code registry from #224. - `web/src/styles.css` and component styles for the layout fixes. ## Acceptance criteria - [ ] `de.json` passes the parity test: complete, no unused keys, all server codes. - [ ] Every German string follows the register rule; the glossary lists the agreed terms. - [ ] The German smoke test passes. - [ ] With the browser set to German, every screen of the editor on `testdata/site` and `testdata/multilingual-site` renders German, including a validation error under a field, an operation refusal in the error strip, the pending-changes list and the publish flow. - [ ] No clipped or overflowing text on the surfaces listed above at a 1280px-wide window and at the narrowest width the editor supports; screenshots attached. ## How to verify - `make test`; `make build`. - `harness serve --site testdata/multilingual-site` with the browser's language set to German; walk every module, open each dialog, trigger a field error and a conflict (rename a page to an existing slug). - Compare the screenshots against the English ones for layout regressions. ## Assumptions to check - That `Intl.PluralRules` for `de` returns only `one` and `other` — it does, but confirm the catalog never needs a third form. - That the German date and relative-time output from Intl is acceptable in the undo info and source values, or whether a custom relative-time key set is needed. ## Out of scope - Any language beyond German. - Translating site-authored labels or the scaffold's shipped element and page-type labels. - Changes to the runtime, the resolution order or the server. ## Blocked by - #224 - #225
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Cloonar/deckle#226
No description provided.