Self-Hosted Wardrowbe Now Speaks 8 Languages

Back in March, when the cloud app went multilingual, I ended the post with a promise: the self-hosted version would be getting i18n support soon. "Soon" turned out to be four months, which is longer than I wanted, but it's merged now. The open-source Wardrowbe is fully translated into eight languages, and the translations ship inside the app itself. No cloud service, no external translation API, nothing phoning home. If you run Wardrowbe on your own hardware, it now speaks your language completely offline.
I Didn't Start This One
My favorite part of this release is that I didn't kick it off. A contributor opened a pull request that wired up next-intl and brought the first four locales with it. That PR sat as the foundation, and I built the rest on top: restructured the translation keys into per-feature namespaces, filled out the remaining languages, added a CI gate so translations can't silently rot, and made the backend remember your language on your account.
This is honestly the thing I hoped for when I open sourced the self-hosted version. Someone wanted a feature badly enough to start building it in thier own fork, and the project is better for it. If you're that person for some other feature, the door is open.
The Languages
| Language | Locale | Native Name |
|---|---|---|
| English | en | English |
| German | de | Deutsch |
| French | fr | Français |
| Italian | it | Italiano |
| Japanese | ja | 日本語 |
| Korean | ko | 한국어 |
| Chinese (Simplified) | zh-CN | 中文简体 |
| Chinese (Traditional) | zh-TW | 中文繁體 |
Fun detail: the self-hosted version got Italian before the cloud app did. The contributor who started the PR included it from day one, so for the moment the free version speaks one more language than the paid one. I'll catch the cloud app up eventually, but I like that the open-source side got there first.
What Actually Got Translated
Everything you see on screen. The strings are organized into 17 feature namespaces, things like wardrobe, outfits, suggest, settings, notifications, analytics, onboarding, and so on. That works out to roughly 1,000 strings per language, or around 7,500 translated strings across the seven non-English locales.
That includes the fiddly stuff that usually gets skipped: error messages, empty states, the constants like garment types and formality levels, plural forms, and date formatting. Not just the nav bar.
Switching Is One Click, and It Follows You
There's a language selector right in the header. Pick your language and the whole interface re-renders in it, each option shows the language's native name so you can find yours even if the current UI is in something you can't read.
Your choice is stored in a cookie for instant effect, and it's also saved to your user account on the backend. The server validates it against the supported list, so a broken value can't sneak in. Log in from another browser and your language comes with you.
Translations That Can't Rot
The part I care most about, because I've seen it go wrong in other projects: partial translations that decay over time. Someone adds a feature, forgets to translate the new strings, and six months later the German UI is 30% English.
That can't happen here. CI runs an i18n check on every pull request. The script flattens every locale's message files and compares them key by key against English: a missing key fails the build, an extra leftover key fails the build, and ICU placeholders are checked too, so a translation can't drop a {count} variable and crash at runtime. If a PR adds a string, it has to add it in all eight languages or it doesn't merge. Annoying in the moment, but it's the only way translation coverage stays at 100% without someone auditing it by hand.
Getting It
Pull the latest from GitHub, rebuild, and the language selector is in the header. Nothing to configure, no locale packs to download. If you're evaluating self-hosted wardrobe apps in general, the comparison post is still current.
And if your language isn't in the list yet, adding one is genuinely approachable: a folder of JSON files plus one line in the locale list, and the CI check will tell you exactly which keys you're missing. I'd love to see a few more show up as pull requests, though.
Ready to get dressed in 60 seconds?
Start your 14-day free trial. Card required, no charge until it ends.