Compiler-based i18n library that emits tree-shakable translations, leading to up to 70% smaller i18n bundle sizes.
Documentation · Quick Start · Report Bug
Used in production by
...and more
Trusted by framework authors
SvelteKit's official i18n integration
Part of TanStack's CI pipeline
// messages/en.json
{
"greeting": "Hello {name}!"
}import { m } from "./paraglide/messages.js";
m.greeting({ name: "World" }); // "Hello World!" — fully typesafeThe compiler generates typed message functions. Your bundler tree-shakes unused messages. Expect up to 70% smaller i18n bundle sizes compared to runtime i18n libraries (e.g. 47 KB vs 205 KB).
| Smaller i18n Bundle | Up to 70% smaller i18n bundle size than runtime i18n libraries. |
| Tree-Shakable | Unused messages are eliminated by your bundler. |
| Fully Typesafe | Autocomplete for message keys and parameters. Typos become compile errors. |
| Framework Agnostic | Works with React, Vue, Svelte, Solid, TanStack, or vanilla JS/TS. |
| Built-in i18n Routing | URL-based locale detection and localized paths out of the box. |
| Built on inlang | Integrates with Sherlock (VS Code extension), Fink (translation editor), and more. |
React ·
Vue ·
TanStack Start ·
SvelteKit ·
React Router ·
Astro ·
Vanilla JS/TS
Tip
Paraglide is ideal for any Vite based app. Setup is just one plugin and Vite's tree-shaking eliminates unused messages automatically. Get started →
npx @inlang/paraglide-js initThe CLI sets up everything:
- Creates your message files
- Configures your bundler (Vite, Webpack, etc.)
- Generates typesafe message functions
Then use your messages:
import { m } from "./paraglide/messages.js";
import { setLocale, getLocale } from "./paraglide/runtime.js";
// Use messages (typesafe, with autocomplete)
m.hello_world();
m.greeting({ name: "Ada" });
// Get/set locale
getLocale(); // "en"
setLocale("de"); // switches to GermanParaglide compiles an inlang project into tree-shakable message functions. Your bundler eliminates unused messages at build time.
┌────────────────┐
│ Inlang Project │
└───────┬────────┘
│
▼
┌────────────────────────┐
│ Paraglide Compiler │
└───────────┬────────────┘
│
▼
┌──────────────────────────┐
│ ./paraglide/messages.js │
│ ./paraglide/runtime.js │
└──────────────────────────┘
Watch: How Paraglide JS works in 6 minutes →
Paraglide supports locale-aware formatting via declaration formatters:
plural(Intl.PluralRules) for plural and ordinal categoriesnumber(Intl.NumberFormat) for numbers, currency, compact notation, and moredatetime(Intl.DateTimeFormat) for dates/times with locale-aware output
Gender and custom selects are supported via the variants system.
// Pluralization example
m.items_in_cart({ count: 1 }); // "1 item in cart"
m.items_in_cart({ count: 5 }); // "5 items in cart"
// Works correctly for complex locales (Russian, Arabic, etc.)Message format is plugin-based — use the default inlang format, or switch to i18next, JSON, or ICU MessageFormat via plugins. If your team relies on ICU MessageFormat 1 syntax, use the inlang-icu-messageformat-1 plugin.
Formatting Docs → · Pluralization & Variants Docs →
| Feature | Paraglide | i18next | react-intl |
|---|---|---|---|
| i18n bundle size | Up to 70% smaller via tree-shaking | ❌ Ships all messages | ❌ Ships all messages |
| Tree-shakable | ✅ | ❌ | ❌ |
| Typesafe | ✅ | Partial | ❌ |
| Framework agnostic | ✅ | Wrappers needed | React only |
| i18n routing | ✅ Built-in | ❌ | ❌ |
"Paraglide JS is by far the best option when it comes to internationalization. Nothing better on the market."
Ancient-Background17 · Reddit
"Just tried Paraglide JS. This is how i18n should be done! Totally new level of DX."
Patrik Engborg · @patrikengborg
"I was messing with various i18n frameworks and must say Paraglide was the smoothest experience. SSG and SSR worked out of the box."
Dalibor Hon · Discord
"I migrated from i18next. Paraglide reduced my i18n bundle from 40KB to ~2KB."
Paraglide is built on the open inlang format. Works with:
| Tool | Description |
|---|---|
| Sherlock | VS Code extension for inline translation editing |
| CLI | Machine translate from the terminal |
| Fink | Translation editor for non-developers |
| Parrot | Manage translations in Figma |
Explore the inlang ecosystem →
- Getting Started
- Framework Guides (React Router, SvelteKit, Astro, etc.)
- Message Syntax & Pluralization
- Formatting (Number/Date)
- Routing & SSR
- API Reference
We welcome contributions! See CONTRIBUTING.md for guidelines.
MIT — see LICENSE