Speak your users'
language.
Every string in the app and the admin is a typed Paraglide message. A new language is one JSON file, and anything you have not translated yet falls back to English.
messages/es.jsonsame app, one file each
From one file to every screen.
Declare it
One line in project.inlang/settings.json tells the whole workspace Spanish exists.
"locales": ["en", "es"]
Translate at your pace
Fill messages/es.json, plain JSON a translator can own. Ship at 60% done; the missing keys render in English until they arrive.
Even future features speak it
Packs merge their own copy into your catalog on install, so new features across all six apps arrive translatable, never hardcoded.
messages/es.json
One file per language. The whole product follows.
Nothing to wire. The catalog is already there, and every screen reads from it.
"greeting":
"teams_page_title":
"invite_cta":
- Dashboard
- Teams
- Billing
Teams
Invite a memberStrings that fail the build, not the user.
Your copy behaves like code: checked, versioned, impossible to half-ship.
A new market is a translation job
All copy lives in one catalog. Hand over a file, not engineering time.
one copy catalog
Broken copy can't ship
A missing key stops the build, not the button.
the build fails, not the page
Half-done still ships
Untranslated keys fall back to English.
Falls back toenPacks arrive translated
Every pack merges its copy into your catalog.
Merges intomessages/en.jsonMenus translate too
Navigation and settings screens stay translatable.
Coverssidebar · settings
- 1Register the locale
"locales": ["en", "es"]
One line in the project settings.
- 2Translate at your pacemessages/es.json82%translatedfalls back to en
Plain JSON a translator can own. Ship at 82%: the rest stays English.
- 3Every screen speaks itesappadminpacks
The app, the admin and every pack you install later.
any
Language you want, not a picker list
locales is your array in project.inlang/settings.json. There is no supported-languages table.
Español日本語DeutschpolskiУкраїнськаPortuguês1 file
To add a whole language
messages/<locale>.json beside the English one. Your locale files are never touched by installs.
messages/pl.json
app
admin
packs
0
Hardcoded strings in any pack
Install merges each pack's messages into en.json, and re-running compose produces no diff.
teams packmergedbilling packmergednotifications packmerged
One JSON file.
The whole product follows.
Feature packs to grow with
Every pack ships real source code: frontend, backend, and admin surfaces where the feature needs them. Add them when you need them, one command each.
Questions, answered
Ship in their language.
Start from the free starter, add locale files as your users arrive, and keep every string typed along the way.
any locale / typed messages / english fallback