React Native
Set up the ReRune React Native SDK to connect native i18next rendering to published translations, persistent cache, and runtime variants.
Requirements: React Native 0.74+, React 18.2+, i18next 23.2.3+, react-i18next 14+, AsyncStorage in your app
Package referenceExplore React Native localizationOn this page
Install and prepare native storage
Terminal
npm install @rerune/react-native@1.9.0 i18next react-i18nextTerminal · AsyncStorage, installed by your app
# Expo
npx expo install @react-native-async-storage/async-storage
# React Native CLI (on React Native 0.74 and 0.75, install @react-native-async-storage/async-storage@^2)
npm install @react-native-async-storage/async-storage
cd ios && pod installSince SDK 1.9.0, your app installs AsyncStorage itself. In Expo, run npx expo install @react-native-async-storage/async-storage. With the React Native CLI, run npm install @react-native-async-storage/async-storage, adding @^2 on React Native 0.74 and 0.75 or with Kotlin older than 2.1.0, then cd ios && pod install. ReRune supports 1.23.1 and later 1.x, 2.1.2 and later 2.x, and 3.1.1 and later. Rebuild your development or release client; Expo Go needs no rebuild. Translation updates cannot install native modules.
Keep local translation resources for first-run offline behavior. Configure i18next with the languages and namespaces your application needs. OTA updates target the translation namespace. On Hermes, add @formatjs/intl-pluralrules and import its polyfill, with the data of every language your app or the dashboard publishes, first in your entry file. Without it, plurals show the wrong form, with or without ReRune.
Before you upgrade
SDK 1.9.0 has breaking changes. In React and React Native, ReRune.setup returns the client synchronously: remove await, and await client.ready only where native initialization is asynchronous. In Angular, ReRune.provide is now ReRune.setup and must be registered at the application root. React Native apps install @react-native-async-storage/async-storage themselves. A key missing from the user's language now falls back to your i18next fallbackLng (Angular: the engine's fallback language) instead of the dashboard main language. The default request timeout is 15 seconds. Apps on ^1.8.0 receive 1.9.0 automatically, so pin ~1.8.0 until you migrate. As before, if one published translation does not fit the text built into your app, the SDK skips that whole language update and keeps showing the previous one. Translations are downloaded from https://cdn.rerune.io; if your site uses a Content Security Policy or a network allowlist, allow that address. Translations with placeholders do not work with i18next ICU plugins.
Initialize once before mounting
Use the same nativeOptions shape shown in the React chapter, including your existing resources, fallback language, and interpolation settings. Replace native i18next initialization with one ReRune.setup call at module scope in its own module, for example src/i18n.ts, and export the client. React Native setup starts the AsyncStorage restore and the update check right away, so do not create the client in a useState initializer.
TypeScript · src/
import { ReRune } from '@rerune/react-native'
export const client = ReRune.setup({
otaPublishId: '<READ_ONLY_OTA_PUBLISH_ID>',
}, nativeOptions)TSX · root provider
import { ReRuneProvider } from '@rerune/react-native'
<ReRuneProvider client={client} defaultNS="translation">
<App />
</ReRuneProvider>TSX · native component
import { Text } from 'react-native'
import { useTranslation } from 'react-i18next'
export function App() {
const { t } = useTranslation()
return <Text>{t('headline')}</Text>
}Language selection and cached text
Keep the application language selection in your existing i18next flow. Use the SDK runtime locale information when offering dashboard-managed languages. ReRune downloads only the languages the app shows and their fallbacks. When your app sets supportedLngs, list your dashboard languages there too: a dashboard-only language outside it is not downloaded. A component that reads another language through getFixedT or the lng option needs i18n.loadLanguages first.
AsyncStorage can retain successfully fetched content across restarts. If a built-in store write fails, the SDK can still apply the update in session memory; that fallback does not survive a restart. Clearing application storage also removes cached data. Test a fresh offline installation separately from an offline restart after a successful persisted update.
Platform reference
The linked Expo example pins SDK 1.9.0 and demonstrates native startup, runtime languages, variants, and manual refresh. Use the package README for the version-specific API reference. Example font and artwork dependencies are not SDK requirements.