Skip to content

React Native localization for cross-platform app teams.

Use @rerune/react-native 1.9.0 for OTA translation delivery. Replace native i18next initialization and the root provider, keep translation hooks and resources, and use default AsyncStorage persistence.
ReRune projects list showing real localization projects in a workspace
ReRune dashboard showing localization workspace activity and project statusReRune dashboard showing localization workspace activity and project statusReRune dashboard showing localization workspace activity and project status
ReRune OTA demo mobile app landing screen with live localization status

Common challenge

Cross-platform teams need one localization workflow without giving up control over native release behavior.

Best fit

React Native teams that want shared project context, runtime variants, and OTA delivery through @rerune/react-native@1.9.0.

How ReRune helps

ReRune connects the public React Native SDK to the broader app localization strategy: one workspace for web, native, and cross-platform text with approved OTA delivery.

React Native specifics

The shared i18next model, adapted to a device runtime.

@rerune/react-native keeps the same i18next and react-i18next rendering model as the web package, but uses device persistence and has no browser SSR requirement.
  1. Keep existing i18next behavior

    Pass unchanged native options as the second argument to ReRune.setup(...), called once at module scope. Replace I18nextProvider with ReRuneProvider, preserve defaultNS, and keep native hooks, interpolation, plurals, language switching, and fallbacks. OTA targets the translation namespace.

  2. Restore through AsyncStorage

    AsyncStorage persistence is enabled by default. Your app installs AsyncStorage, and its native module must be in the app binary. With bundled resources, native initialization finishes during setup; cached or remote text arrives asynchronously over the native resources. Native HTTP loaders retain their own offline requirements.

  3. Expose dashboard languages in the app

    After a manifest fetch, availableLocales includes configured app locales and published dashboard locales. A language must have been fetched and cached before it can be selected offline without a bundled resource.

  4. Limit OTA to i18next-rendered UI

    Dashboard-only languages affect React Native UI rendered through i18next. Native platform strings, operating-system language listings, app-store metadata, new keys, and new code paths still require app work or a release.

SDK technical reference

React Native

@rerune/react-native 1.9.0 creates i18next from your native options and replaces the root provider. Keep translation calls and resources, with default AsyncStorage persistence.

Version-pinned guidance from the published package README. Follow the linked README for the complete API and current release notes.

Package
@rerune/react-native
Current release
1.9.0
Requirements
React Native 0.74+, React 18.2+, i18next 23.2.3+, react-i18next 14+, AsyncStorage in your app

Install command

npm install @rerune/react-native@1.9.0 i18next react-i18next

The linked example apps use SDK 1.9.0. They include native setup, language and variant controls, and manual refresh. Use the package README for the API reference.

Quick Start

@rerune/react-native@1.9.0

View on npm

Install command

npm install @rerune/react-native@1.9.0 i18next react-i18next

Keep native configuration

Keep your existing native options and JSON resources. These imports use example paths; keep your own paths and settings. The object can stay in your current startup or be inlined. No new file or exported options object is required. Both alternatives use these same options, including escapeValue: false.

Keep native configuration

import type { InitOptions } from 'i18next'
import en from './locales/en/translation.json'
import de from './locales/de/translation.json'

const nativeOptions = {
  lng: 'en',
  fallbackLng: 'en',
  ns: ['translation'],
  defaultNS: 'translation',
  resources: { en: { translation: en }, de: { translation: de } },
  interpolation: { escapeValue: false },
} satisfies InitOptions

Alternative setups: replace Before with After. Do not run both.

Replace initialization

Keep imports at module scope. The Before ReRune version awaits i18n.init in your async startup. ReRune.setup returns the client synchronously, so call it once at module scope. nativeOptions is your unchanged configuration above. Await client.ready only where native initialization is asynchronous. Run setup once, never during each render.

After ReRune

import { ReRune } from '@rerune/react-native'

export const client = ReRune.setup({
  otaPublishId: '<READ_ONLY_OTA_PUBLISH_ID>',
}, nativeOptions)

SDK 1.9.0 creates an isolated i18next instance and returns the client synchronously. Setup starts the AsyncStorage restore and the update check right away, so call it once at module scope in its own module, not in a useState initializer. First-run offline startup needs locally available resources; previously fetched OTA needs retained cache.

Replace the root provider

In your existing root, use i18n from the native startup after it resolves, or the client that setup returned. App is your existing component. Preserve defaultNS when used. ReRuneProvider includes native context; do not nest both providers. External translation or language-switching code can use client.i18n.

After ReRune

import { ReRuneProvider } from '@rerune/react-native'

<ReRuneProvider client={client} defaultNS="translation">
  <App />
</ReRuneProvider>

Install AsyncStorage in your app; it is the default persistence, and its native module must be in your app binary. A translation update cannot install it. OTA targets the literal translation namespace. A dashboard-only language outside native supportedLngs is not downloaded.
Existing instances, plugins, and attachment

For backend loaders, detectors, .use(...) plugins, or global-instance wiring, retain your app-owned i18n instance and pass it to ReRune.setup with the same nativeOptions. App-owned options keep their native defaults. For an instance that is already initialized or still initializing, omit the second argument; passing options again throws. With a backend loader or detector, await client.ready where you awaited i18n.init. Hooks outside ReRuneProvider need your existing global wiring. Native HTTP loaders keep their startup and offline requirements. SDK-created instances default escaping to false; explicit options win, and raw HTML still needs appropriate handling.

Setup with your existing instance

import { ReRune } from '@rerune/react-native'

export const client = ReRune.setup({
  i18n,
  otaPublishId: '<READ_ONLY_OTA_PUBLISH_ID>',
}, nativeOptions)

Keep your existing application component and native translation calls. This example reads the headline key from your resources.

Translation code stays the same

import { Text } from 'react-native'
import { useTranslation } from 'react-i18next'

export function App() {
  const { t } = useTranslation()
  return <Text>{t('headline')}</Text>
}

Removing ReRune

Restore both Before ReRune blocks with the same options and resources. Remove optional ReRune refresh, status, and variant controls, then uninstall the SDK. Keep i18next, react-i18next, and your plugin chain. Replace client.i18n references with your native instance. Native bundles or loaders must cover the messages you need: OTA and variants stop and ReRune’s cache is no longer consumed. Apply this source change and restart the app; unmounting a provider is not live rollback.

Uninstall the SDK

npm uninstall @rerune/react-native

Workflow

From app copy to release-ready localization.

ReRune connects translation management to the delivery path developers already use: dashboard work, AI assistance, CLI/API sync, and OTA updates where a supported SDK is installed.

Install the SDK

Connect the supported app runtime to a ReRune publish ID while keeping native or framework localization behavior in place.

Publish approved text

Approve translation changes in the workspace, then publish runtime updates without turning every text fix into a full store release.

Refresh visible copy

Let supported SDK hooks check for updates and refresh text when new approved localization payloads are available.

Keep fallbacks intact

When runtime updates are unavailable, the app keeps reading bundled resources so localization failures do not break the product.

Setup WizardAI Coding Agent

One command. A wizard sets the stage, your AI agent ships it.

Run the onboarding command from the root of your Git repository. The wizard inspects the app and confirms the plan with you, with no AI involved and nothing changed yet. Then it opens the coding agent you already use with a complete migration workflow.

Run inside your Git repository

curl -fsSL https://rerune.io/onboard.sh | sh

The script runs locally. ReRune does not receive your source code or list of installed agents.

Coding agent integrations

11 integrations: 4 available now, 7 planned.

  • Claude CodeReady
  • CodexReady
  • OpenCodeReady
  • PiReady
  • GitHub Copilot CLIPlanned
  • GoosePlanned
  • Qwen CodePlanned
  • Cursor AgentPlanned
  • Kiro CLIPlanned
  • Cline CLIPlanned
  • Factory DroidPlanned

Coverage

App-first does not mean mobile-only.

Start where localization creates release friction, then keep web, mobile, and cross-platform products in one shared workspace as your surface area grows.

Developer delivery

Sync through the CLI. Publish through OTA SDKs.

Use the ReRune CLI locally or in CI/CD to manage project translations, then deliver approved runtime updates through the SDK built for your app.

Companion CLI

Install the ReRune CLI

Use the ReRune CLI to sync, validate, and manage translations right from your terminal. Run syncs in CI/CD or locally whenever you need to push a new language.

Homebrew (macOS/Linux):

brew install BasalBit/tap/rerune
  • Downloadable builds for macOS, Linux, and Windows
  • Uses the API keys you generate in the dashboard
  • Fits scripted CI/CD workflows through CLI and API access
rerune

Connect the project

Create the project config and connect the repository to its ReRune workspace.

rerune pull

Pull approved updates

Bring current dashboard translations into the app or its build workflow.

rerune push

Push local changes

Send local translation updates back to ReRune for the team to manage and publish.

Questions

Questions teams ask before choosing a localization platform.

Contact the ReRune team

Share an idea, report a problem, or ask for help with ReRune.

Is ReRune React Native OTA support available now?

Yes. React Native OTA integration is publicly available as @rerune/react-native@1.9.0.

Does React Native use the same integration model as React?

Yes. Both replace native initialization with ReRune.setup(..., nativeOptions), which returns the client synchronously, and I18nextProvider with ReRuneProvider. Call setup once at module scope. Translation hooks stay unchanged. React Native apps install AsyncStorage themselves, and its native module must be in the app binary.

How does React Native localization work offline?

The package restores previously committed manifest and locale data from AsyncStorage. Bundled i18next resources remain the baseline when no matching cache is available or a network update cannot be applied.

Can React Native add dashboard languages at runtime?

Yes. After a manifest fetch, availableLocales lists every published dashboard language, and ReRune downloads a language when the app shows it. Offline selection requires that the app showed the language once while online.

Does ReRune update native iOS and Android strings in a React Native app?

No. The React Native package updates UI rendered through the app's i18next setup. Native platform strings, operating-system language listings, app-store metadata, and new code paths stay outside that runtime overlay.

Explore next

Go deeper into the developer, platform, and delivery workflows connected to this page.

OTA localization updates without making every copy fix a release.

Deliver published app text through ReRune OTA SDKs, preview enabled drafts in staging clients, and keep production caches isolated with fallback and rollback.

React localization that stays connected to product delivery.

Adopt React OTA localization with SDK 1.9.0. Replace startup wiring, preserve i18next translation calls, and restore native setup when removing ReRune.

App localization platform that starts with releases, not files.

App localization that starts with releases, not files. Manage app strings, coordinate translators, sync developer formats, and deliver approved text updates.

One workspace

Start with one product workflow and expand from there.

Create projects, manage keys, use AI assistance with context, sync through CLI/API, and publish approved runtime updates when your app uses a supported ReRune SDK.