Repository navigation
Scrumooth v2.1 Release: Multi-Language Support (i18n) - English, Deutsch, Español, Français, Italiano #40
orbivort
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Tags:
releasei18ninternationalizationmulti-languagev2.1Table of Contents
Introduction
Scrumooth is a self-hosted Agile Scrum Lifecycle Management tool used by teams around the world, lightweight, easy-to-use, and faithful to the Scrum Guide. The entire interface — from dashboards and sprint boards to email notifications and error messages — was available only in English. For distributed teams and non-English-speaking organizations, this created an unnecessary barrier to adoption.
With v2.1, Scrumooth introduces full internationalization (i18n) across both the frontend and backend. Every user-facing string — UI labels, form validations, API error messages, email templates, and in-app notifications — is now translatable and delivered in the user's preferred language.
This is a significant milestone: it makes Scrumooth truly accessible to global teams, allowing each team member to work in their native language while collaborating on the same projects. A Product Owner in Berlin can navigate the backlog in Deutsch, while a Developer in Madrid views sprint tasks in Español - all within the same team workspace.
What's New in v2.1.0
As documented in the CHANGELOG under [2.1.0] - 2026-07-30:
This release delivers:
en), Deutsch (de), Español (es), Français (fr), Italiano (it)Supported Languages
Scrumooth v2.1.0 ships with five fully translated locales:
enen-USdede-DEeses-ESfrfr-FRitit-ITEnglish (
en) is the default and fallback locale. If a translation key is missing in the user's selected language, the system gracefully falls back to English.The architecture is designed to make adding new languages straightforward. A complete onboarding playbook for new locales is documented in the i18n Architecture guide.
How Multi-Language Support Works
Scrumooth's i18n implementation is full-stack, meaning translations happen independently on both the frontend and backend. This section explains the architecture in a way that's useful for both non-technical and technical readers.
High-Level Overview
For Non-Technical Readers
Here's what happens when you open Scrumooth:
For Technical Readers
The i18n system is built on i18next v24+ and spans three packages: frontend, backend, and shared.
Frontend (React + Vite)
public/locales/{lng}/{ns}.jsonscrumooth_localecookie (fallback:navigator)common,auth,dashboard,backlog,sprint,daily-scrum,impediments,increments,sprint-review,retrospective,reports,team,settings,notifications,errors,validationi18n/types.ts)useI18nStore) holds the current locale, persists tolocalStorage, and writes thescrumooth_localecookie so the backend can read itBackend (Express.js)
import ... with { type: 'json' })errors,validation,notifications,emails,retrospectivesrequestT(request translator): reads the locale fromAsyncLocalStorage(per-request context) and callsi18nInstance.t(key, { lng: locale, ...options })req.user.locale)Accept-Languageheader (RFC 4647/9110 compliant, viaresolve-accept-language)en)i18nInstance.getFixedT(locale, ns)with an explicit locale from the user record, since they run outside the HTTP request lifecycleShared Package (
@scrumooth/shared)SUPPORTED_LOCALES,DEFAULT_LOCALE,LOCALE_LABELS,LOCALE_BCP47_MAPnormalizeLocale()— strips region subtags (de-AT->de), falls back toenfor unsupported basesisRTL(),getDirection()— RTL support infrastructurecookieConfig.ts— single source of truth for thescrumooth_localecookie attributes (shared by frontend store, i18next detector, and backend middleware)How to Use Multi-Language Support
Switching Language in the UI
Language Detection on First Visit
If you've never visited Scrumooth before (no
scrumooth_localecookie), the system checks your browser's language settings:Persistent Preferences
localStorage(scrumooth.locale) + cookie (scrumooth_locale)User.localein database) + cookieWhen you log in, Scrumooth syncs your server-stored language preference to your current browser. If you change languages while logged in, the preference is saved to your profile via a profile update API call, so it follows you to other devices and browsers.
What Gets Translated
Everything user-facing is translated:
For Developers: Configuration & Code Examples
This section provides code examples and configuration guidance for developers working with or extending Scrumooth's i18n system.
Frontend: i18n Initialization
The i18next instance is configured in
packages/frontend/src/i18n/config.ts:The initialization is called at app startup in
App.tsx:Frontend: Using Translations in Components
Use the
useTranslationhook fromreact-i18next. Keys are type-safe — the TypeScript compiler validates them against the English JSON resources.Key features:
useTranslation('auth')loads theauthnamespacet('login.signInTo', { app: 'Scrumooth' })renders"Sign in to {{app}}"->"Sign in to Scrumooth"login.placeholder.firstName)_one/_othersuffixes based on countFrontend: The Language Switcher Component
The
LanguageSwitchercomponent (packages/frontend/src/components/common/LanguageSwitcher/) is mounted in the sidebar user dropdown:Frontend: The Zustand i18n Store
The
useI18nStore(packages/frontend/src/i18n/useI18nStore.ts) manages locale state:Backend: Request-Scoped Translation
The backend uses
requestTto translate strings within the HTTP request lifecycle. The locale is resolved by middleware and propagated viaAsyncLocalStorage:Usage in error-handling middleware:
Backend: Locale Resolution Middleware
The
localeResolvermiddleware determines the language for each request:Backend: Background Jobs & Emails
For code running outside the request lifecycle (emails, scheduled notifications), use
getFixedTwith an explicit locale:Translation File Structure
Frontend locale files live in
packages/frontend/public/locales/:Backend locale files live in
packages/backend/src/locales/:Example translation JSON (
en/common.json):{ "language": "Language", "selectLanguage": "Select language", "welcomeBack": "Welcome back", "loading": "Loading...", "attendeesSection": { "attendanceCount": "{{count}} attendees", "attendanceCount_one": "{{count}} attendee" } }Adding a New Language
To add a new locale (e.g., Portuguese —
pt):Create locale directories:
packages/frontend/public/locales/pt/— copy all 16 namespace JSON files fromen/packages/backend/src/locales/pt/— copy all 5 namespace JSON files fromen/Register the locale in
packages/shared/src/constants/index.ts:Translate all values in the JSON files (replace English strings with Portuguese translations). Mark incomplete translations with
"__pending__"— thependingGuardpost-processor will display a localized fallback in production.Validate:
Add BCP-47 mapping in
LOCALE_BCP47_MAP:A complete onboarding playbook with a worked example (using
pt) is available in the i18n Architecture document.i18n Quality Assurance & CI Integration
Scrumooth includes a comprehensive suite of i18n tooling to maintain translation quality. These scripts run in CI and as pre-commit hooks:
pnpm run i18n:checkpnpm run i18n:check:strict__pending__sentinel valuespnpm run i18n:extractpnpm run i18n:extract:checkt()keys used in code exist in locale JSONpnpm run i18n:completenesspnpm run i18n:completeness:strictpnpm run i18n:glossarypnpm run i18n:pseudopnpm run i18n:sortPre-commit hook: Any committed locale JSON file automatically triggers
i18n:sortandi18n:checkvialint-staged, ensuring formatting and key parity are maintained.Release workflow: The
prepare-release.ymlGitHub Action runsi18n:check:strictbefore creating a release PR, blocking releases with incomplete translations.Acknowledgments
The multi-language support feature was developed by the Orbivort team as a major milestone in making Scrumooth accessible to global teams.
We acknowledge:
Scrumooth is an open-source project licensed under the Apache License 2.0. We welcome contributions — whether it's adding a new language, improving existing translations, or enhancing the i18n infrastructure. If you'd like to contribute a translation for a language not yet supported, please open a discussion or issue in the GitHub repository.
Feedback & Discussion
We want to hear from you! This release is a major step toward making Scrumooth a truly global platform, and your feedback shapes what comes next.
Share Your Experience
i18n. Include the locale, the screen/feature, and the expected vs. actual translation.Planned Future Improvements
Questions?
Drop a comment below or start a new discussion in the Announcements category. We respond to all questions.
References
Scrumooth is a self-hosted Agile Scrum Lifecycle Management System. Copyright 2026 Orbivort. Licensed under the Apache License, Version 2.0.
All reactions