Skip to content
better-i18n.com

There is one SDK per framework, and installing it is a single package plus a provider. Pick the row that matches your stack.

StackInstall
Next.js (App or Pages Router)npm i @better-i18n/next
Vite + Reactnpm i @better-i18n/use-intl @better-i18n/vite
TanStack Startnpm i @better-i18n/use-intl
Remix or Shopify Hydrogennpm i @better-i18n/remix
Expo / React Nativenpm i @better-i18n/expo
Flutterflutter pub add better_i18n
iOS / SwiftBetterI18n via Swift Package Manager
Node backend (Hono, Express, Fastify)npm i @better-i18n/server
Anything elsenpm i @better-i18n/core

All of them do the same job: fetch your published translations from the CDN at runtime, cache them, and hand your app a t(). They differ only in how they hook into that framework's rendering — which is why there is no single "the SDK" to install.

What you configure #

Every SDK needs the same two values, and nothing else to get started:

  • Projectyour-org/your-project, the same string the dashboard shows
  • Source language — the language your keys are written in

Everything else has a default. Published translations are served from a public CDN, so the browser bundle carries no credentials of any kind.

The three-step shape #

  1. Install the package for your stack from the table above
  2. Wrap your app in that SDK's provider, passing your project
  3. Replace hardcoded strings with t("your.key")

Framework-specific walkthroughs, with the actual provider code:

Packages that are not translation SDKs #

Four packages share the @better-i18n scope but do a different job. Installing one of these when you wanted translations is a common wrong turn:

PackageWhat it is for
@better-i18n/sdkContent CMS client — fetches content models and entries, not UI strings
@better-i18n/contentContent analytics tracking
@better-i18n/adminServer-side admin: manage projects, keys, translations programmatically
@better-i18n/cliCommand line: scan for hardcoded strings, publish, check publish status

Which one if you use two frameworks #

A monorepo with a Next.js web app and an Expo app installs both @better-i18n/next and @better-i18n/expo. They can point at the same project, or at separate projects if the copy genuinely differs — separate projects mean separate keys and separate coverage.

Do I need an SDK at all #

No. The CDN is plain JSON over HTTPS, so you can fetch it yourself and skip every package on this page — see How It Works for the URL shape. The SDKs exist for caching, SSR without a flash of untranslated content, and locale switching without a reload. If you only need the strings, fetch the file.