Nov 28, 2024

Implementing Right-to-Left (RTL) Support in Expo Without Restarting the App

Learn how to implement Right-to-Left (RTL) support in React Native apps seamlessly, without restarting. Step-by-step guide for multilingual user experience.

Author

Tarun Bhagchand SoniTarun Bhagchand SoniSenior Software Engineer - II
Implementing Right-to-Left (RTL) Support in Expo Without Restarting the App

Let us Implement Right-To-Left(RTL) in react native to expand accessibility and add international language support.

Languages like languages like Arabic, Hebrew, or Persian are read out RTL,

Even while React Native natively supports RTL, it takes careful consideration to handle it effectively without requiring app restarts.

This tutorial shows how we can add RTL support without restarting your React Native application.

Why Is RTL Important?

RTL languages are used predominantly in more than 20 countries, and adding support for them may greatly enhance user experience. Your program will be flexible and easy to use for users with varying language preferences if you can guarantee smooth transitions between Left-to-Right (LTR) and RTL layouts.

Prerequisites

- Basic knowledge of React Native.

- A React Native project set up (React Native CLI or Expo).

- `i18n-js `for translations.

- `react-i18next` and `i18next` for additional features.

Step-by-Step Implementation

Step 1: Install Dependencies

Install the following dependencies:

npm install i18n-js react-i18next i18next

Step 2: Set Up Translations

Create a `locales` folder in your project root directory and add your translation files. For example, create a `locales` folder and add `english.json`, `arabic.json`, `german.json` files.

// english.json
{
  "hello": "Hello",
  "welcome": "Welcome"
}

// arabic.json
{
  "hello": "مرحبا",
  "welcome": "مرحبا"
}

// german.json
{
  "hello": "Hallo",
  "welcome": "Willkommen"
}

Step 3. Enable RTL in Your Project

React Native’s `I18nManager` module allows you to enable RTL layout direction. Use the following code to toggle RTL support:


import { I18nManager } from 'react-native';
import { useState } from 'react';
import YourAppComponent from './YourAppComponent';

const App = () => {
  const [key, setKey] = useState(0); // Track changes to force re-render.

  const toggleRTL = () => {
    // Toggle RTL support
    I18nManager.allowRTL(!I18nManager.isRTL);
    I18nManager.forceRTL(!I18nManager.isRTL);
    setKey((prevKey) => prevKey + 1); // Force a re-render to apply layout changes.
  };

  return <YourAppComponent key={key} toggleRTL={toggleRTL} />;
};

export default App;

Step 4. Trigger Layout Changes Without Restart

By updating the `key` prop of the root component, you force a re-render of the app. This approach allows the layout to change without needing a full restart, which is crucial for maintaining a seamless user experience.

Step 5. Adjust Styles for RTL Compatibility

Ensure that your styles are RTL-aware by using `start` and `end` instead of `left` and `right` in your layout definitions:

const styles = {
  container: {
    flexDirection: 'row', // Switch to 'row-reverse' automatically in RTL.
    justifyContent: 'space-between',
    paddingStart: 10, // Aligns with start regardless of direction.
    paddingEnd: 10,
  },
};

React Native handles many components automatically when RTL is enabled, but review any custom components for directional dependencies.

Step 6. Set up your `i18n.js` file:

import english from '@/locales/english.json';
import arabic from '@/locales/arabic.json';
import german from '@/locales/german.json';
import { I18n } from 'i18n-js';
import * as Localization from 'expo-localization';

const i18n = new I18n({
  en: english,
  de: german,
  ar: arabic,
});

const deviceLocales = Localization.getLocales();
i18n.locale = deviceLocales[0]?.languageCode || 'en';
i18n.enableFallback = true;

const isRTL = deviceLocales[0]?.textDirection === 'rtl';

export { isRTL };

export default i18n;

Final Thoughts

Implementing RTL support without restarting your React Native app improves the user experience, making your app more adaptable for multilingual audiences. Using the `key` prop technique for re-rendering is a straightforward method that avoids app reloads and enhances performance.

By following these steps, you can ensure that your React Native app is ready for global use, supporting both LTR and RTL languages dynamically and seamlessly.

Subscribe to Our Newsletter

RELATED ARTICLES

More from the engineering frontline.

Dive deep into our research and insights on design, development, and the impact of various trends to businesses.
The Bug That Doesn't Show Up in Code Review: Why Your Flutter Web App Reloads on Safari
The Bug That Doesn't Show Up in Code Review: Why Your Flutter Web App Reloads on Safari
A real-world look at how oversized images can trigger Safari reloads and iOS crashes in Flutter apps and how smarter image decoding prevents them.
From Prompting to Process: What Changed When Flutter Shipped Agent Skills
From Prompting to Process: What Changed When Flutter Shipped Agent Skills
This blog explores how Flutter Agent Skills improve AI-assisted development by combining official framework workflows with project-specific guidance for more consistent development.
Why Everything Your AI Builds Looks the Same
Why Everything Your AI Builds Looks the Same
This blog explores why AI-generated interfaces often look alike and explains how design systems, product context, and reusable engineering practices help teams build distinctive, scalable
How We Built the Missing Bridge from Code to Figma
Technology

Jul 10, 2026

How We Built the Missing Bridge from Code to Figma
This blog explores how AI-generated React apps get turned into fully editable, designer-ready Figma files by reading React Fiber instead of the DOM.
Building a Resilient Hybrid-Cloud Network with WireGuard HA, Route-Based Failover, and Deep Observability
Technology

Jun 27, 2026

Building a Resilient Hybrid-Cloud Network with WireGuard HA, Route-Based Failover, and Deep Observability
A practical breakdown of building resilient AWS-to-on-premises connectivity with WireGuard HA, active-standby failover, and deep packet-forwarding observability.
We Built a 114-Second AWS-to-Azure Failover. Here’s What We Learned
Technology

Jun 19, 2026

We Built a 114-Second AWS-to-Azure Failover. Here’s What We Learned
A practical guide to building a 114-second multi-cloud disaster recovery failover between AWS and Azure — what we built, what broke, and what we learned.
Cloud-Native and Cloud-Agnostic Are Not Ideologies; They Are Business-Stage Decisions
Technology

Jun 12, 2026

Cloud-Native and Cloud-Agnostic Are Not Ideologies; They Are Business-Stage Decisions
This blog explains how organizations can balance speed, scalability, and operational flexibility as they grow from startup to enterprise scale.

The Right Conversation Can Save You Six Months.

Whether you’re navigating AI adoption, modernizing legacy systems, or scaling a product - we start by listening. No pitch deck. No template. A real conversation.