Skip to content

feat(admin): German Privacy settings page and access log - #438

Merged
github-actions[bot] merged 1 commit into
mainfrom
auto/admin-i18n-privacy
Nov 9, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
auto/admin-i18n-privacy

Conversation

@grumpy-miner

@grumpy-miner grumpy-miner commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Board card: Admin UI multi-language (PVTI_lADOElDmdM4Bn50jzhCKGsA)

Slice 7 of the card (slice 1 #432: catalog, German shell, language picker; 2 #433: settings tabs, Account profile and password; 3 #434: sign-in methods, two-factor, sessions; 4 #435: availability and companies; 5 #436: Developers page; 6 #437: API keys and webhooks). Draft card, so no Closes.

Research

  • Code: after feat(admin): German API keys and webhooks cards on the Developers page #437 the Account and Developers pages are German, but Settings > Privacy is fully English: the page itself (app/admin/privacy/page.tsx) and the AccessLogSection under it. Both show relative ages through relativeTime ("2h ago", "5m ago"), which has no locale.
  • Competitors (carried from slices 1-6): Personio, Teamtailor and Greenhouse treat the recruiter UI language as a per-user setting and translate whole screens. For a GDPR settings screen, German admins expect the GDPR's own German terms (verantwortliche Stelle, Auskunft, Berichtigung, Löschung), which the copy below uses.
  • User pain points (carried): mixed-language screens are the recurring complaint in Personio community threads. Privacy is the settings page a German customer is most likely to hand to a data protection officer, so it is the next most useful one to finish.

Plan and scope

  • privacy.* keys (en + de) for every label, hint, retention option ("1 Monat", "12 Monate", "Standard - 6 Monate"), the retention note, the last purge line, CV scanning and SMTP states, buttons and fallback errors.
  • accessLog.* keys for the title, description, filters, column headers, action words, API key / removed teammate actor names, CSV link, empty state, Show more.
  • time.* keys plus relativeAge() in lib/time.ts (the unit and count behind relativeTime, which now reuses it with identical output) and formatAge(t, iso, now) in lib/i18n/locale.tsx; German reads "vor 5 Min.", "vor 2 Std.", "vor 4 T.".
  • language.partial (en + de) now lists the Privacy page.

In scope: the above. Out of scope (next slices): Branding, Hiring, Emails, Team, Billing settings pages, the other admin screens, server-side storage of the language, locale-aware ages on other screens (they keep relativeTime and can switch to formatAge), candidate surfaces (card D3). Server error messages, env var names and placeholder example addresses stay untranslated.

Copy notes: formal "Sie", "Bewerberinnen und Bewerber" as in earlier slices; no en or em dashes.

Acceptance (this slice):

  • With Deutsch picked, Settings > Privacy and its access log render in German, including retention options, the purge note, status messages and relative ages.
  • English is unchanged: every existing English test passes unmodified.
  • New keys exist in both locales (typecheck + messages.test.ts parity and placeholders).

Testing

  • Cloud container: pnpm typecheck OK, pnpm lint 0 errors (3 pre-existing warnings), pnpm test 128 files / 1254 tests passed (+10).
  • New tests: PrivacySettingsPage in German (labels, retention options, retention note, "Letzte Löschung: vor 2 Std.", SMTP/scan copy, notice link, save status, purge never ran), AccessLogSection in German (filters, headers, action words, API key and removed teammate, "vor 5 Min." / "vor 1 Std." / "vor 4 T.", Mehr anzeigen, empty state), relativeAge units.
  • Same deterministic edit script run in the push clone; script md5 and git diff | md5sum identical on both sides (2efd6c8f...).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RPybysqu7n4L5GsM2mD7yT

Status (run 2026-11-09 15:35 UTC)

All checks green, merged by auto-merge. The card's acceptance (admin fully in German) is still not met, so the card goes back to Ready for the next slice: the Branding, Hiring, Emails, Team and Billing settings pages, the other admin screens, server-side storage of the language and locale-aware dates/ages on the remaining screens.

Slice 7 of the board card "Admin UI multi-language"
(PVTI_lADOElDmdM4Bn50jzhCKGsA): Settings > Privacy reads its copy from
the catalog (data controller, retention, own policy, CV scanning, email
delivery, save) and so does the access log under it (filters, headers,
action words, empty state). Relative ages ("5m ago") get a catalog
wording through relativeAge + formatAge, so German shows "vor 5 Min.".
English is unchanged outside a LocaleProvider.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RPybysqu7n4L5GsM2mD7yT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant