Skip to content

Translate the auth and onboarding pages (DE, IT) - #1272

Merged
helpcodeai merged 2 commits into
HelpCode-ai:mainfrom
sapatmohit:feat/i18n-auth-onboarding
Oct 26, 2026
Merged

helpcodeai merged 2 commits into
HelpCode-ai:mainfrom
sapatmohit:feat/i18n-auth-onboarding

Conversation

@sapatmohit

Copy link
Copy Markdown
Contributor

Summary

First area of #1271 (the follow-up to #1008, split as agreed in #1008 (comment)): the auth and onboarding pages in German and Italian. It builds on #1248 and #1257. No behaviour changes, and Accept-Language: en-US renders exactly what it rendered before.

Changes

  • app/login/page.tsx: everything that Translate the sign-in form and add a language switcher #1257 left in English. That covers registration (self-hosted and the Cloud sign-up), the password checklist and the client-side checks, the social consent line, the "Verify your email" code step, "Check your inbox", "Trial activated", the licence choice, "Check your email" and "Activate license" steps, and the plan hand-off toasts. Strings that registration shared with sign-in now read from signIn.* for both modes, since their English was the same.
  • components/auth-trust.tsx: the Cloud sign-up's trust panel and the line under the sign-in card. Both are only used on /login.
  • app/forgot-password, app/reset-password, app/verify-email, app/accept-invite, app/welcome, app/start-trial: all page text.
  • lib/card-trial.ts: formatTrialEnd takes an optional locale, en-GB by default, so the existing callers don't change. /start-trial passes the UI language, so German reads "7. Oktober 2026". English still reads "7 October 2026".
  • messages/{en,de,it}.json: new namespaces signUp, planHandoff, verifyCode, checkInbox, trialActivated, licenseSetup, trust, forgotPassword, resetPassword, verifyEmail, acceptInvite, welcome and startTrial. That's 222 keys each. Sentences that wrap links or bold text use t.rich with tags (<terms>, <privacy>, <strong>, <brand>, <link>), so each language can order the sentence its own way.

A few things are worded as whole sentences now instead of pieced together from JSX fragments. This matters most on /start-trial: each variant (with or without a date, trial or billed today) is one key, so German and Italian don't have to follow English word order. The English output is the same text.

Two fallbacks moved from state into render: "No verification token provided" and "No invitation token provided". This keeps t out of the effects that spend single-use tokens, so a language change can never re-run them. The text and when it shows are unchanged.

Left in English on purpose:

  • Server and API error messages, as agreed in 🎃 Set up i18n in the frontend and translate the sidebar and sign-in form (DE, IT) #1008.
  • PlanPicker on /start-trial. It's shared with the licence wall, so it fits better with the settings and licence area.
  • On /welcome, the starter pack and the "what you need" line under each connector (setupNeeds). They're built from connector catalog data, so they fit with the connectors area.
  • The number format of the live stats in the trust panel ("200,000+").

Self-hosted vs Cloud: frontend only, with no backend, database or ee/ change. The Cloud-only screens (Cloud sign-up, trust panel, trial activated, /start-trial) are translated the same way as the self-hosted ones.

Translations

German and Italian aren't my native languages, so please review those strings. I kept the tone of #1248, #1257 and the guides: German with Sie, Italian with tu. I used the terms already in the guides and message files: "Workspace", "Connectors" / "connettori", "Audit-Log" / "registro di audit", "Marktplatz" / "marketplace", "Testphase" / "prova gratuita". Strings I'm least sure about:

  • "Tarif" for plan (DE): I could also see "Plan" or "Abo".
  • "DSGVO · AVV inklusive" for "GDPR · DPA included" (DE): "AVV" is the usual German term for a DPA. Please check that it matches what you offer.
  • Italian gender: "Benvenuto" on /welcome and "Sei stato invitato" on /accept-invite use the masculine form, which is the common default. Happy to switch to a neutral wording if you prefer.
  • /welcome heading without a name: English says "Connect your first tool, friend." In German and Italian I dropped "friend" ("Verbinden Sie Ihr erstes Tool." / "Collega il tuo primo strumento."), because it reads oddly there.
  • "Kostenlos testen →" for "Start free trial →" (DE): this is the Cloud sign-up button, so it's worth a second look.
German Italian
Registration
Cloud sign-up
/start-trial
/welcome
/forgot-password
/accept-invite (no token)

Type

  • New feature

Testing

9 new tests in tests/e2e/i18n.spec.ts:

  • de-DE:
    • Registration renders in German, including the password checklist and the client-side "weak password" error.
    • The Cloud sign-up and its trust panel render in German.
    • /forgot-password renders in German.
    • /verify-email without a token renders in German.
    • /welcome renders in German.
    • /start-trial renders in German, with the trial end date as "Kostenlos bis 31. Oktober 2026".
  • it-IT:
    • /reset-password renders in Italian, including the "passwords don't match" check.
    • /accept-invite without a token renders in Italian.
  • en-US: registration and /reset-password stay exactly as before.

In card-trial.spec.ts, formatTrialEnd is checked with de and it, next to the existing English assertions.

The key-parity test from #1248 covers the new keys.

Directory Command Result
packages/frontend npm run lint 0 errors, 51 warnings (52 on main; none new)
packages/frontend npx tsc --noEmit -p tsconfig.json pass
packages/frontend npm run build pass
packages/frontend npm run test:e2e 279 passed, incl. the 9 new ones

With main's lockfile, the dev server logs "Incompatible React versions" (root react-dom 19.2.7, frontend react 19.3.1) on the 404 fallback. It's the same on main and doesn't affect the tests.

The backend isn't touched, so I didn't rerun its suite.

  • Added/updated tests
  • Tested manually

Checklist

  • My code follows the existing code style
  • I have tested my changes locally
  • I have updated documentation (if applicable). Not needed: CONTRIBUTING's "Translating the UI" section already covers new namespaces.
  • All existing tests pass (frontend; backend unchanged)
  • This PR has a descriptive title

packages/frontend/AGENTS.md and next-env.d.ts were rewritten by next dev locally and are left out, as AGENTS.md asks.

Related Issues

Part of #1271 (auth and onboarding)

@helpcodeai
helpcodeai enabled auto-merge (squash) October 26, 2026 09:03
@helpcodeai
helpcodeai merged commit 044df6a into HelpCode-ai:main Oct 26, 2026
14 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 26, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants