Skip to content

feat(i18n): add multi-language support (English + Simplified Chinese)#19

Merged
xuelin-cell merged 10 commits intomainfrom
feat/i18n-multilingual-support
Mar 28, 2026
Merged

feat(i18n): add multi-language support (English + Simplified Chinese)#19
xuelin-cell merged 10 commits intomainfrom
feat/i18n-multilingual-support

Conversation

@an7tang
Copy link
Copy Markdown
Collaborator

@an7tang an7tang commented Mar 28, 2026

Summary

  • Add internationalization infrastructure using react-i18next with namespaced JSON translation files
  • Extract all hardcoded UI strings across 14 components into translation keys with English and Simplified Chinese (简体中文)
  • Language switcher in Settings > General tab, persists to both localStorage and backend config.json

Changes

  • Backend: Added language field to AppConfig dataclass and config API endpoint
  • Frontend infrastructure: i18n.ts init, useSettings language support, ServerConfig.language
  • 16 translation files: 8 namespaces (common, settings, sidebar, welcome, chat, search, misc, onboarding) x 2 languages
  • 14 components updated: SettingsModal, Sidebar, WelcomeScreen, ChatInput, ChatArea, SearchModal, InputSettingsMenu, FolderPicker, ModelPicker, RightPanel, MessageBubble, RestartRequiredModal, OnboardingWizard, VMSetupFloater

Adding a new language

  1. Copy src/locales/en/ to src/locales/{locale}/ and translate values
  2. Import in src/i18n.ts and add to resources
  3. Add entry to LANGUAGES array in SettingsModal.tsx

Test plan

  • Build passes (npm run build)
  • Default language is English, all text renders correctly
  • Switch to 简体中文 in Settings > General > Language — all UI updates
  • Refresh page — language persists (localStorage)
  • Check config.jsonlanguage field updated
  • Switch back to English — all text reverts
  • Onboarding wizard flow works in both languages

an7tang and others added 10 commits March 27, 2026 23:24
Troubleshooting and checklist docs are no longer needed.
Rename the display brand name across the frontend UI — page title,
sidebar, welcome screens, onboarding wizard, and Electron error dialog.
Internal package names, storage keys, and code identifiers unchanged.
Cowork is now the primary experience. Chat mode is hidden by default
and only appears when explicitly enabled via a toggle in Settings >
Sandbox, which also requires an E2B API key.

- Default mode changed from "chat" to "cowork" (frontend + backend)
- Added chat_enabled flag to SandboxConfig
- Mode toggle in header hidden unless chat_enabled && e2b_api_key set
- URL routing guards redirect /chat to /cowork when Chat unavailable
- Onboarding wizard no longer shows E2B setup (legacy feature)
- Settings sandbox tab: VM card first, Chat Mode card with toggle
- Brand color updated to red gradient matching new logo
Swap the old favicon SVG for the new uniai.png brand logo in the
sidebar header.
- WelcomeScreen: translate mounting/preparing status messages
- OnboardingWizard, SettingsModal: remove Chinese from restart-detection regex
- vmSetup: remove Chinese from restart regex and WSL status labels
Add 12 skill packages (data-insight-report, deep-research, doc,
email-mail-master, excel-xlsx, find-skills, frontend-dev, mcp-builder,
pdf, pptx-plus-linux, skill-creator, web-design-guidelines) to both
examples/ and public/ directories. Update .gitignore to track these
bundled skills.
…nnectable streams

Agent responses now run as background asyncio tasks that write SSE events
into a per-conversation buffer. This fixes the crash when users refresh
during streaming (RuntimeError: aclose() on running generator) and enables
reconnecting to in-flight streams after page refresh.

Key changes:
- Add StreamManager with ConversationStream (event buffer + fan-out)
- Extract _generate_events() from event_stream(), run via background task
- Add GET /api/chat/{id}/stream endpoint for reconnecting subscribers
- Frontend auto-reconnects to active streams on page load via subscribeToStream()
- Include server-side timestamps in SSE events for accurate thinking durations on replay
- Make STREAM_START idempotent to handle duplicate events during replay
…inese

Add internationalization infrastructure using react-i18next with namespaced
JSON translation files. All hardcoded UI strings across 14 components are
extracted into translation keys. Language setting persists in both localStorage
(for instant load) and backend config.json (for cross-device sync).

Adding a new language requires only: (1) copy en/ locale folder, (2) translate
values, (3) register in i18n.ts, (4) add to LANGUAGES array in SettingsModal.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@xuelin-cell xuelin-cell merged commit 2fd64cb into main Mar 28, 2026
16 checks passed
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.

2 participants