A toolbox for your React Native app localization.
This library follows the React Native releases support policy.
It is supporting the latest version, and the two previous minor series.
$ npm install --save react-native-localize
# --- or ---
$ yarn add react-native-localizeDon't forget to run pod install after that !
If you're using Expo, you can specify the supported locales in your app.json or app.config.js using the config plugin.
This enables Android 13+ and iOS to display the available locales in the system settings, allowing users to select their preferred language for your app.
{
"expo": {
"plugins": [["react-native-localize", { "locales": ["en", "fr"] }]]
}
}Alternatively, if you want to define different locales for iOS and Android, you can use:
{
"expo": {
"plugins": [
[
"react-native-localize",
{
"locales": {
"android": ["en"],
"ios": ["en", "fr"]
}
}
]
]
}
}This package supports react-native-web. Follow their official guide to configure webpack.
import{getCurrencies,getLocales}from"react-native-localize";console.log(getLocales());console.log(getCurrencies());Prismy (a proud sponsor of this library react-native-localize setup? Here's how Prismy makes localization seamless:
- Customize tone (formal, informal, playful) per language.
- Automatically reuse existing translations.
- Use glossaries to keep terminology consistent (Prismy even generates them the initial one for you!)
No setup headaches. Just clean, context-aware translations, out of the box.
- Keep editing your source locale files like you always do.
- When you open a PR, Prismy:
- Detects missing translations
- (Optionally) adds a "Missing Translations" CI check
- Comments with a link to generate them in one click
- Kick off translations from the PR comment itself.
- Let PMs, designers, or translators tweak the wording via Prismy's web UI.
👉 Learn more at prismy.io
Returns the user preferred locales, in order.
typegetLocales=()=>Array<{languageCode: string;scriptCode?: string;countryCode: string;languageTag: string;isRTL: boolean;}>;import{getLocales}from"react-native-localize";console.log(getLocales());/* -> [ { countryCode: "GB", languageTag: "en-GB", languageCode: "en", isRTL: false }, { countryCode: "US", languageTag: "en-US", languageCode: "en", isRTL: false }, { countryCode: "FR", languageTag: "fr-FR", languageCode: "fr", isRTL: false },] */Returns number formatting settings.
typegetNumberFormatSettings=()=>{decimalSeparator: string;groupingSeparator: string;};import{getNumberFormatSettings}from"react-native-localize";console.log(getNumberFormatSettings());/* -> { decimalSeparator: ".", groupingSeparator: ",",} */Returns the user preferred currency codes, in order.
typegetCurrencies=()=>string[];import{getCurrencies}from"react-native-localize";console.log(getCurrencies());// -> ["EUR", "GBP", "USD"]Returns the user current country code (based on its device locale, not on its position).
typegetCountry=()=>string;import{getCountry}from"react-native-localize";console.log(getCountry());// -> "FR"Devices using Latin American regional settings will return "UN" instead of "419", as the latter is not a standard country code.
Returns the user preferred calendar format.
typegetCalendar=()=>|"gregorian"|"buddhist"|"coptic"|"ethiopic"|"ethiopic-amete-alem"|"hebrew"|"indian"|"islamic"|"islamic-umm-al-qura"|"islamic-civil"|"islamic-tabular"|"iso8601"|"japanese"|"persian";import{getCalendar}from"react-native-localize";console.log(getCalendar());// -> "gregorian"Returns the user preferred temperature unit.
typegetTemperatureUnit=()=>"celsius"|"fahrenheit";import{getTemperatureUnit}from"react-native-localize";console.log(getTemperatureUnit());// -> "celsius"Returns the user preferred timezone (based on its device settings, not on its position).
typegetTimeZone=()=>string;import{getTimeZone}from"react-native-localize";console.log(getTimeZone());// -> "Europe/Paris"Returns true if the user prefers 24h clock format, false if they prefer 12h clock format.
typeuses24HourClock=()=>boolean;import{uses24HourClock}from"react-native-localize";console.log(uses24HourClock());// -> trueReturns true if the user prefers metric measure system, false if they prefer imperial.
typeusesMetricSystem=()=>boolean;import{usesMetricSystem}from"react-native-localize";console.log(usesMetricSystem());// -> trueTells if the automatic date & time setting is enabled on the phone. Android only
typeusesAutoDateAndTime=()=>boolean|undefined;import{usesAutoDateAndTime}from"react-native-localize";console.log(usesAutoDateAndTime());// true or falseTells if the automatic time zone setting is enabled on the phone. Android only
typeusesAutoTimeZone=()=>boolean|undefined;import{usesAutoTimeZone}from"react-native-localize";console.log(usesAutoTimeZone());Returns the best language tag possible and its reading direction. Useful to pick the best translation available.
Note
It respects the user preferred languages list order (see explanations).
typefindBestLanguageTag=(languageTags: string[],)=>{languageTag: string;isRTL: boolean}|void;import{findBestLanguageTag}from"react-native-localize";console.log(findBestLanguageTag(["en-US","en","fr"]));// -> { languageTag: "en-US", isRTL: false }Opens the app language settings.
Warning
This feature is available only on Android 13+ and require configuring your app's supported locales.
typeopenAppLanguageSettings=()=>Promise<void>;import{openAppLanguageSettings}from"react-native-localize";openAppLanguageSettings("application").catch((error)=>{console.warn("Cannot open app language settings",error);});Examples with @formatjs/intl
Browse the files in the /example directory.
You can add / remove supported localizations in your Xcode project infos:
Because it's a native module, you need to mock this package.
The package provides a default mock you may import in your __mocks__ directory:
// __mocks__/react-native-localize.tsexport*from"react-native-localize/mock";// or "react-native-localize/mock/jest"This module is provided as is, I work on it in my free time.
If you or your company uses it in a production app, consider sponsoring this project 💰. You also can contact me for premium enterprise support: help with issues, prioritize bugfixes, feature requests, etc.

