← All posts

Self-Hosted Wardrowbe Now Speaks 8 Languages

Wardrowbe Team4 min read
Seven well-dressed friends from different countries laughing together on a leather sofa, above the headline Now Speaks 8 Languages and the Wardrowbe logo

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

LanguageLocaleNative Name
EnglishenEnglish
GermandeDeutsch
FrenchfrFrançais
ItalianitItaliano
Japaneseja日本語
Koreanko한국어
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.

Start Free TrialSee Pricing

Keep Reading

Cloud vs Self-Hosted: Which Wardrowbe Is Right for You?

An honest breakdown of Wardrowbe Cloud vs self-hosting. Cost, setup time, privacy, AI models, and who each option is actually built for.

Passkeys and Your Data: How Wardrowbe Keeps Both Safe

Passkeys replace passwords with biometric login. Combined with zero data collection, here's how Wardrowbe protects your wardrobe and your privacy.

Best Self-Hosted Wardrobe Apps in 2026

Compare self-hosted wardrobe organizer apps that keep your clothing data private. Deploy on your own server with Docker.