Integrations/React & Next.js
icon-language

React & Next.js

Translate a React or Next.js app with the i18n runtime you have

Get started free

Overview

There is no MultiLocale runtime to add to a React app, and nothing from MultiLocale ends up in your bundle. The multilocale CLI writes one JSON dictionary per locale into your repository, and the i18n library you already use renders them — next-intl in a Next.js app, react-i18next in a Vite or Create React App one. Localization becomes a build-time file sync, so your routing, your message loading and the runtime you ship all stay exactly as they are. The CLI reads files as well as writes them, so an app that is already half-translated starts from the JSON it has instead of from an empty project.

Quick start

Install the CLI and pull the translation files

# The CLI is the only thing you install, and it is a devDependency
npm install --save-dev multilocale

# Create the account from the terminal — no browser needed
npx multilocale signup --email you@example.com --json

# Create the project and the locales it ships
npx multilocale projects create "my-app" --locales en,es,fr --default-locale en

# Push the JSON you already have, then pull every locale back down
npx multilocale import
npx multilocale download

multilocale.json — point download at your message folder

{
  "projectId": "YOUR_PROJECT_ID",
  "paths": ["messages/%lang%.json"]
}

Put it at the root of the repository. %lang% is replaced with each locale of the project; without this file download writes translations/<locale>.json instead.

Next.js — next-intl reads those files unchanged

// i18n/request.js — no MultiLocale import anywhere
import { getRequestConfig } from 'next-intl/server'

export default getRequestConfig(async ({ locale }) => ({
  messages: (await import(`../messages/${locale}.json`)).default,
}))

Vite or Create React App — react-i18next

import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import en from './translations/en.json'
import es from './translations/es.json'

i18n.use(initReactI18next).init({
  resources: { en: { translation: en }, es: { translation: es } },
  lng: 'en',
  fallbackLng: 'en',
})

Features

  • icon-arrow-right-filled

    Nothing added to your bundle

    The CLI is a devDependency. What ships is your own i18n runtime plus plain JSON — no MultiLocale code, no runtime fetch, no extra request on first paint.

  • icon-arrow-right-filled

    The file layout your framework already expects

    download writes one dictionary per locale wherever you point it: messages/en.json for next-intl, translations/en.json for react-i18next, or any pattern containing %lang%.

  • icon-arrow-right-filled

    Import what you already translated

    import reads the JSON already in your repository and creates the phrases from it, so an app that is partly translated does not start from an empty project.

  • icon-arrow-right-filled

    Machine translation into every locale

    A key added in the default locale is translated into the rest of the project locales, so download always has a complete file to write.