Skip to content

feat(admin): German Branding settings page and custom domain card - #439

Open
grumpy-miner wants to merge 2 commits into
mainfrom
auto/admin-i18n-branding
Open

grumpy-miner wants to merge 2 commits into
mainfrom
auto/admin-i18n-branding

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 8 of the card (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; 7 #438: Privacy page and access log). Draft card, so no Closes.

Research

  • Code: after feat(admin): German Privacy settings page and access log #438 Settings > Branding is the first settings tab and still fully English: app/admin/branding/page.tsx (logo, brand color with the AA badge, corner radius, careers page, save, live preview) and components/CustomDomainCard.tsx under it (claim, TXT record, verify, plan notes). The DnsRow copy label was built by lower-casing the English row label (Copy TXT ${label.toLowerCase()}), which cannot be translated, so it now takes an explicit copyLabel.
  • Competitors (carried from slices 1-7): Personio, Teamtailor and Greenhouse treat the recruiter UI language as a per-user setting and translate whole screens, including branding/career-site settings. Teamtailor and Personio keep the career-site preview in the career site's own language, not the admin's, which matches what we do with the preview here.
  • User pain points (carried): mixed-language screens are the recurring complaint in Personio community threads. For custom domains, the DNS step is where users get stuck; the German copy keeps the exact record, the copy buttons and the "provider appends the zone" hint, so the guidance is not lost in translation.

Plan and scope

  • branding.* keys (en + de): heading, logo card (hint, upload/replace/remove, size error, status messages), brand color (hint, picker/hex labels, AA badge, invalid hex), corner radius and its three options, careers page and its copy button/error, save, preview landmark, caption and timer note.
  • customDomain.* keys (en + de): title, hint, loading/failed, verified / pending DNS badges, add/verify/remove buttons and their notices and fallback errors, Team plan and Upgrade link, TXT intro, Type/Name/Value rows, copy labels, zone hint, ownership and downgrade notes.
  • language.partial (en + de) now lists the Branding page.

In scope: the above. Out of scope (next slices): Hiring, Emails, Team, Billing settings pages, the other admin screens, server-side storage of the language, locale-aware dates/ages on other screens, candidate surfaces (card D3). The live preview's sample candidate copy ("Work at ...", job titles, "Apply for this position") stays English on purpose: it shows the candidate page, which is not translated. Server error messages stay as the server sends them.

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

Acceptance (this slice):

  • With Deutsch picked, Settings > Branding and its custom domain card render in German, including badges, radius options, TXT record rows and status/error messages.
  • 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 / 1260 tests passed (+6).
  • New tests: BrandingPage in German (cards, radius options, copy button, preview landmark and caption, candidate copy kept, invalid hex + save confirmation, oversized logo error), CustomDomainCard in German (add flow with TXT rows, copy labels, Verifizieren/Entfernen; downgraded verified domain with upgrade link; load failure).
  • Same deterministic edit script run in the push clone; script md5 (34a843cf...) and git diff | md5sum (8b2151b0...) identical on both sides.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RPybyvB18ZuCx4qeFqU5UK

Status (run 2026-11-09 ~17:00 UTC) - blocked, needs the owner

CI (all 7 jobs), E2E and the auto-merge workflow are green and auto_merge is enabled, but GitHub has not merged: the ruleset requires the cla-assistant check, and the cla workflow (pull_request_target) ends in startup_failure with no jobs on both pushes (runs 42652861327 at 16:15 UTC and again at 16:34 UTC after an empty re-trigger commit). The same workflow last succeeded at 15:16 UTC on #438; cla.yml and the repo's Actions permissions (all actions allowed, no SHA pinning) are unchanged, so this looks like a GitHub-side or settings issue the agent cannot see through the API. A startup_failure run cannot be re-run via the API (403). Not merged by hand and the workflow not edited, per the task rules. To unblock: open the run page for the startup error, or comment recheck on this PR, or merge once the check is green. The card is set to In review.

Slice 8 of the board card "Admin UI multi-language"
(PVTI_lADOElDmdM4Bn50jzhCKGsA): Settings > Branding reads its copy from
the catalog (logo, brand color with the AA check, corner radius, careers
page, save, live preview caption) and so does the custom domain card
under it (states, TXT record rows, copy buttons, plan notes). The
preview's sample candidate copy stays English, as candidate pages are
not translated yet. English is unchanged outside a LocaleProvider.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RPybyvB18ZuCx4qeFqU5UK
@github-actions
github-actions Bot enabled auto-merge (squash) November 9, 2026 16:15
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