Translate a React or Next.js app with the i18n runtime you have
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.
# 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{
"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.
// 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,
}))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',
})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.
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%.
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.
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.