Software localization has a reputation for being an afterthought. A company ships a product in English, it gains traction in a new market, and then someone scrambles to add translations six months later — usually with spotty coverage, inconsistent terminology, and the dreaded “Please restart the application to apply language changes” dialog.
We wanted to do this differently from the start. Today we’re announcing native German support in cji.email, built on a localization architecture that treats language as a first-class feature.
Live Switching, No Restart Required
The signature behavior of our localization implementation is live language switching. Change your language in Settings > General > Language Preferences and the entire UI updates immediately — no restart, no reload, no progress bar.
This is powered by the inlang Paraglide framework, which we chose specifically because of its approach to translation: rather than loading a JSON blob at runtime and doing string lookups, Paraglide compiles translations into typed functions that get imported directly by your components. The result is tree-shakeable, type-safe, and fast.
Our Svelte layout uses targeted reactivity to trigger re-renders when the active language changes. The 865 translation keys across the entire app swap out in a fraction of a second. There’s no perceptible flash or layout shift.
Compare that to Apple Mail or Thunderbird, where switching the system language and restarting the app is still the only way to see the interface in a different language. For a desktop application in 2026, the restart requirement is an unnecessary indignity.
Built for Scale, Not Just German
The architecture we’ve shipped isn’t just a German translation — it’s a localization system built to grow. We’ve organized our translation keys into per-surface modules: uiMessages, calendarMessages, rssMessages, and so on. Each module maps to a distinct part of the application.
This modularity does two things. First, it keeps the translation files maintainable — a translator working on calendar strings doesn’t need to navigate thousands of unrelated keys. Second, it enforces completeness: our build pipeline validates that every key present in the English source file has a corresponding entry in each supported language, so partial translations are caught at build time rather than discovered by users at runtime.
Both English and German are currently at 100% coverage across all modules. Every string in the app has been translated.
What “Native Support” Actually Means
We want to be specific about what we mean by native German support, because “we added German” can mean a lot of different things.
- Every visible string in the UI — menus, settings panels, tooltips, error messages, notifications — is translated.
- Date and time formatting follows German conventions (day-first dates, 24-hour clock by default).
- The language preference is stored per-user in your local config and persists across sessions.
- There are no English fallbacks for missing keys, because there are no missing keys.
What’s Next
German is the first non-English language in cji.email, but it won’t be the last. Because we’ve built a proper localization foundation — with a single source of truth for supported locales, a validation pipeline, and a modular key structure — adding new languages is straightforward.
Spanish, Italian, and Swedish are next on our list. If you’re a native speaker of any of these languages and you’re interested in contributing translations, reach out to us. We’d love the help.
Willkommen bei cji.email.