Skip to content

Translate the settings pages: profile, connections, organization, users (DE, IT) - #1332

Merged
helpcodeai merged 1 commit into
HelpCode-ai:mainfrom
sapatmohit:feat/i18n-settings
Oct 29, 2026
Merged

helpcodeai merged 1 commit into
HelpCode-ai:mainfrom
sapatmohit:feat/i18n-settings

Conversation

@sapatmohit

Copy link
Copy Markdown
Contributor

Summary

Sixth area of #1271, first of three PRs: the settings sidebar and the Profile, Connections, Organization and Users settings pages in German and Italian. No behaviour changes, and Accept-Language: en-US renders exactly what it rendered before.

Changes

  • app/settings/layout.tsx and lib/navigation.ts: the settings sidebar (labels, descriptions, the "Organization" section title) and the page title. Each settings item and the titled section now carry an id, like the main nav's NavItem. The English label/description stay in lib/navigation.ts, because the command palette still uses them.
  • app/settings/page.tsx (Profile):
    • the profile card, email preferences, skill learning, change password;
    • connected accounts and sign-in methods, with their toasts and confirm dialogs;
    • MCP server authentication (the mode names and the env variable notes), MCP API keys;
    • the danger zone and the delete account dialog.
  • app/settings/connections/page.tsx: the connected AI clients, their reach, the change/revoke buttons, the server picker and its messages.
  • app/settings/organization/page.tsx: the organization card, the six feature toggles, the "Sign everyone out" card and dialog, the danger zone and delete dialog, and "My Organizations" with the create form.
  • app/settings/users/page.tsx: the header and seat count, the invite form, the bulk skill learning and memory bar, the table (headers, tooltips, status badges, selects, actions), the sign-out dialog, the confirm dialogs, the messages and the footer.
  • Message colours: the Profile and Organization pages picked red or green with msg.startsWith('Error'), message.includes('success') and createMessage.includes('created'), which only work in English. They now use a separate error flag.
  • Plurals: the English strings that used (s) or user${n !== 1 ? 's' : ''} keep their exact wording; German and Italian use proper plural forms.
  • Dates (last used, joined, created, invitation dates) now follow the UI language, as in the earlier PRs. A loop variable named t on the Connections page became target.
  • messages/{en,de,it}.json: new namespaces settingsNav (17 keys), settingsProfile (88), settingsConnections (20), settingsOrg (63) and settingsUsers (93).

Left in English on purpose:

  • Text from the server: error messages, the invitation result message and the blocking-organization error.
  • EnterpriseNotice, including the title and body the Users page passes to it, with the other billing and licensing components (as with TrialLimitNotice).
  • Role names ADMIN, EDITOR and VIEWER, as on the accept-invite page. DELETE, which you type to confirm, stays as the word the check compares against.
  • Technical names: the OAuth grant names, the OAuth endpoint labels (Discovery, Authorize, Token, Register), MCP_AUTH_MODE and its values, MCP_BEARER_TOKEN, MCP_API_KEY, mcp_….
  • The command palette's settings entries: shared chrome, still an open question in Translate the rest of the admin UI (DE, IT) #1271.

Self-hosted vs Cloud: frontend only, with no backend, database or ee/ change.

Translations

German and Italian aren't my native languages, so please review those strings. I kept the tone and terms from the earlier PRs: German with Sie, Italian with tu, "Workspace", "KI-Client" / "client AI", "Gedächtnis" / "Memoria", "Knowledge Graph". Strings I'm least sure about:

  • "Skill learning": "Skill-Lernen" / "Apprendimento delle skill".
  • "Capture user intent": "Absicht der Benutzer erfassen" / "Acquisisci l'intento dell'utente".
  • "Danger Zone": "Gefahrenzone" / "Zona pericolosa".
  • Opt-out: "widersprochen" (German) and "ha rinunciato" (Italian) for the "opted out" badge.
  • Memory access levels: "Kein Zugriff / Firmengedächtnis lesen / Persönlich / Beitragen" and "Nessun accesso / Lettura della memoria aziendale / Personale / Contributo".
  • "Switch" (to another organization): "Wechseln" / "Passa a questa".
  • Italian participles for a signed-out user ("è stato disconnesso") use the masculine form, as the earlier pages do.
German Italian
Profile
Connections
Organization
Users

Type

  • New feature

Testing

3 new tests in tests/e2e/i18n.spec.ts, with mocked server info, users, an invitation, the edition, memory status and AI client connections:

  • de-DE: the settings sidebar, the Profile page and the Users page (seat count, table, badges, footer, invite form) render in German.
  • it-IT: the Organization page (including the sign-out dialog) and the Connections page (including the server picker and its plural connector counts) render in Italian.
  • en-US: all four pages and the sidebar stay exactly as before, including the footer and the rich-text notes.

The key-parity test from #1248 covers the new keys. I also checked that every German and Italian message parses and uses the same placeholders and tags as the English one.

Directory Command Result
packages/frontend npm run lint 0 errors, 46 warnings (same as main, none new)
packages/frontend npx tsc --noEmit -p tsconfig.json pass
packages/frontend npm run build pass
packages/frontend npm run test:e2e 300 passed, incl. the 3 new ones

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

  • Added/updated tests
  • Tested manually. I checked the four pages in German and Italian in the browser with mocked API data (the screenshots above), not against a live backend.

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 was rewritten by next dev locally and is left out, as AGENTS.md asks.

Related Issues

Part of #1271 (Settings and admin, first of three PRs). The area is bigger than expected (about 6,700 lines), so I'd split it in three:

  1. this PR: the settings sidebar, Profile, Connections, Organization, Users;
  2. /settings/roles, /settings/admin, /settings/license (and activate), /settings/identity-providers (with recovery codes, role mappings and SCIM);
  3. /admin/users, /admin/settings, /admin/roles.

After that, only knowledge graph and memory are left.

@helpcodeai helpcodeai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @sapatmohit, reviewed. Only strings, t() calls and message keys change: the same API calls, the same confirm() prompts, and the typed DELETE / organization-name checks still compare against the untranslated value. Key sets match across en/de/it, the ICU plural/select forms are correct, and replacing the startsWith('Error') / includes('success') colouring with an explicit error flag is a real fix. Merging; the next settings PR can open.

@helpcodeai
helpcodeai merged commit 9746e65 into HelpCode-ai:main Oct 29, 2026
15 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 29, 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