Paraglide JS

The strongest react-i18next alternative for React + Vite is Paraglide JS — a compiler-first library with up to 70% smaller bundles, built-in type safety, and no provider to set up. You can switch without rewriting your translation files.

npx @inlang/paraglide-js init

React + Vite example → · Paraglide vs react-i18next →

react-i18next is the most popular i18n library for React, but it isn't the only option — and for modern React + Vite apps it isn't always the best fit. The most common reasons developers look for an alternative:

  • Bundle size — runtime libraries ship the whole catalog and an interpreter to the browser.
  • Type safety — getting typed keys and parameters in react-i18next requires extra setup.
  • DX — a provider, hooks, and string keys add boilerplate.

This page compares the main alternatives honestly so you can pick the right one.

The alternatives at a glance

LibraryApproachBundleType safetyBest for
Paraglide JS🏗️ CompilerUp to 70% smaller, tree-shaken✅ Built-in (keys + params)Vite/ESM apps that want minimal bundle + type safety
react-intl (FormatJS)🏃 RuntimeShips catalogsICU-heavy formatting, large teams
LinguiJSExtraction + compiled catalogsCompiled catalogs🟠 Macro-basedICU + extraction workflow
next-intl🏃 RuntimeShips catalogs🟠 PartialNext.js apps specifically
typesafe-i18nRuntime + codegenSmall runtime✅ Good⚠️ No longer actively maintained

[!WARNING]typesafe-i18n pioneered the type-safe approach but is no longer actively maintained, so it's not recommended for new projects. If type safety is what drew you to it, Paraglide offers it built-in on an actively maintained, compiler-based foundation.

Paraglide JS — the compiler-first alternative

Paraglide is the closest thing to "react-i18next, but compiled." Instead of a runtime t("key") lookup, it compiles each message into a typed, tree-shakable function:

import { m } from "./paraglide/messages.js";
m.greeting({ name: "World" }); // typed key + typed params, no provider needed

What you get vs react-i18next:

  • Smaller bundles — only the messages you import ship; the bundle stays flat as the catalog grows (benchmark: 47 KB vs 205 KB).
  • Type safety with zero setup — renamed or missing messages are compile errors.
  • No provider/context — import functions and call them.
  • Vite-native — one plugin; works across React, TanStack Start, SvelteKit, React Router, Astro, Vue, Solid, and vanilla JS/TS.
  • Rich text via a typed markup adapter (the <Trans> equivalent), and plurals/ICU via variants or the ICU plugin.

See the full Paraglide JS vs react-i18next comparison.

Migrate without rewriting

You can keep your existing react-i18next translation files. Paraglide compiles i18next JSON through the i18next plugin — an integration officially supported by the i18next team (joint announcement) — so you can adopt it incrementally and swap t("key") for m.key() over time.

When to stay on react-i18next

If most of your keys are only known at runtime (CMS-driven content), you have a large existing i18next codebase, or you rely on specific i18next plugins, react-i18next remains a solid choice. Compiler-based tools shine when keys are known at build time.

Try Paraglide

npx @inlang/paraglide-js init

React + Vite example · Benchmark · Full comparison