One App Many Languages: With i18n Build Global App

By:

Manamohan Sethi

10 Apr 2025

So you’ve built an awesome app. It's fast, clean, and everyone around you loves it. But then someone from another country tries it and goes,

“Umm… where’s my language?”

And that’s when i18n (short for internationalization) shows up like a superhero. Let’s break it down.

What is i18n Anyway?

The word internationalization has 18 letters between the i and the n, hence the cool abbreviation: i18n.

It’s basically about prepping your app to support:

  • Multiple languages

  • Different date/time formats

  • Various number/currency styles

  • Right-to-left (RTL) layouts if needed

Think of it as setting the stage for your app to perform on a global stage.

Bonus tip:

i18n ≠ l10n

(l10n = localization)

Why Bother?

English isn’t everyone’s cup of tea. Or espresso. Or masala chai.

By adding i18n you can:

  • Reach more users

  • Make your app feel personal

  • Show cultural respect

  • Win hearts across borders

Implementing i18n

Here’s what you generally do:

1. Extract Your Strings

Stop hardcoding text like:

<h1>Welcome to my app</h1>

Instead, do this:

<h1>{t('welcome_message')}</h1>

2. Set Up a Translation Library

Most of you use react-i18next. It’s solid, flexible, and supports detection, lazy loading, and more.

Install it:

npm install i18next react-i18next i18next-browser-languagedetector

🔗 Official i18next Documentation
🔗 react-i18next GitHub Repo
🔗 i18next-browser-languagedetector GitHub Repo

3. Create Translation Files

en.json

{"welcome_message": "Welcome to my app" }

fr.json

{"welcome_message": "Bienvenue dans mon application" }

4. Initialize i18n

Set it up in something like i18n.js:

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';

i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  .init({
      resources: {
        en: { translation: require('./en.json') },
        fr: { translation: require('./fr.json') },
      },
      fallbackLng: 'en',
      interpolation: { escapeValue: false },
    });

Then import that i18n.js once in your app (like in index.js or App.js).

📘 Setup Guide – react-i18next
🔧 i18next Configuration Options

5. Use the Translations

In your components:

import { useTranslation } from 'react-i18next';
const MyComponent = () => {
  const { t } = useTranslation();
  return <h1>{t('welcome_message')}</h1>;
};

6. Add a Language Switcher (Optional but Nice)

<button onClick={() => i18n.changeLanguage('en')}>🇬🇧</button>
<button onClick={() => i18n.changeLanguage('fr')}>🇫🇷</button>

Tips

  • Lazy load languages. It will keep bundle size small.

  • If your app gets big, use namespaces.

  • Handle plurals and interpolation ({count} items left)

  • For RTL support: toggle CSS direction based on language

Conclusion

Internationalization can sound fancy but honestly, it’s just about thinking for a wider range of users, and try to make your users feel at home.
No matter if your app is for reading books, selling sneakers, or building space rockets, making it multilingual is one of the most powerful upgrades you can do.

FAQ

Q. What is the difference between i18n and l10n?

A. With i18n (internationalization) you make your app ready to support multiple languages. Whereas i10n (localization) is the adaptation of your app’s content for specific areas.

Q. Which libraries are best for i18n in React?

A. Libraries like react-i18next, FormatJS, and LinguiJS, with react-i18next are the most widely used beacause they are simple and powerful.

🔗 FormatJS Official Site
🔗 LinguiJS Documentation

Q. Does i18n affect app performance?

A. If you are not handling it properly, it can. For a smooth performance you can use lazy loading, avoid over-fetching translation files, and organize strings properly.

So you’ve built an awesome app. It's fast, clean, and everyone around you loves it. But then someone from another country tries it and goes,

“Umm… where’s my language?”

And that’s when i18n (short for internationalization) shows up like a superhero. Let’s break it down.

What is i18n Anyway?

The word internationalization has 18 letters between the i and the n, hence the cool abbreviation: i18n.

It’s basically about prepping your app to support:

  • Multiple languages

  • Different date/time formats

  • Various number/currency styles

  • Right-to-left (RTL) layouts if needed

Think of it as setting the stage for your app to perform on a global stage.

Bonus tip:

i18n ≠ l10n

(l10n = localization)

Why Bother?

English isn’t everyone’s cup of tea. Or espresso. Or masala chai.

By adding i18n you can:

  • Reach more users

  • Make your app feel personal

  • Show cultural respect

  • Win hearts across borders

Implementing i18n

Here’s what you generally do:

1. Extract Your Strings

Stop hardcoding text like:

<h1>Welcome to my app</h1>

Instead, do this:

<h1>{t('welcome_message')}</h1>

2. Set Up a Translation Library

Most of you use react-i18next. It’s solid, flexible, and supports detection, lazy loading, and more.

Install it:

npm install i18next react-i18next i18next-browser-languagedetector

🔗 Official i18next Documentation
🔗 react-i18next GitHub Repo
🔗 i18next-browser-languagedetector GitHub Repo

3. Create Translation Files

en.json

{"welcome_message": "Welcome to my app" }

fr.json

{"welcome_message": "Bienvenue dans mon application" }

4. Initialize i18n

Set it up in something like i18n.js:

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';

i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  .init({
      resources: {
        en: { translation: require('./en.json') },
        fr: { translation: require('./fr.json') },
      },
      fallbackLng: 'en',
      interpolation: { escapeValue: false },
    });

Then import that i18n.js once in your app (like in index.js or App.js).

📘 Setup Guide – react-i18next
🔧 i18next Configuration Options

5. Use the Translations

In your components:

import { useTranslation } from 'react-i18next';
const MyComponent = () => {
  const { t } = useTranslation();
  return <h1>{t('welcome_message')}</h1>;
};

6. Add a Language Switcher (Optional but Nice)

<button onClick={() => i18n.changeLanguage('en')}>🇬🇧</button>
<button onClick={() => i18n.changeLanguage('fr')}>🇫🇷</button>

Tips

  • Lazy load languages. It will keep bundle size small.

  • If your app gets big, use namespaces.

  • Handle plurals and interpolation ({count} items left)

  • For RTL support: toggle CSS direction based on language

Conclusion

Internationalization can sound fancy but honestly, it’s just about thinking for a wider range of users, and try to make your users feel at home.
No matter if your app is for reading books, selling sneakers, or building space rockets, making it multilingual is one of the most powerful upgrades you can do.

FAQ

Q. What is the difference between i18n and l10n?

A. With i18n (internationalization) you make your app ready to support multiple languages. Whereas i10n (localization) is the adaptation of your app’s content for specific areas.

Q. Which libraries are best for i18n in React?

A. Libraries like react-i18next, FormatJS, and LinguiJS, with react-i18next are the most widely used beacause they are simple and powerful.

🔗 FormatJS Official Site
🔗 LinguiJS Documentation

Q. Does i18n affect app performance?

A. If you are not handling it properly, it can. For a smooth performance you can use lazy loading, avoid over-fetching translation files, and organize strings properly.

So you’ve built an awesome app. It's fast, clean, and everyone around you loves it. But then someone from another country tries it and goes,

“Umm… where’s my language?”

And that’s when i18n (short for internationalization) shows up like a superhero. Let’s break it down.

What is i18n Anyway?

The word internationalization has 18 letters between the i and the n, hence the cool abbreviation: i18n.

It’s basically about prepping your app to support:

  • Multiple languages

  • Different date/time formats

  • Various number/currency styles

  • Right-to-left (RTL) layouts if needed

Think of it as setting the stage for your app to perform on a global stage.

Bonus tip:

i18n ≠ l10n

(l10n = localization)

Why Bother?

English isn’t everyone’s cup of tea. Or espresso. Or masala chai.

By adding i18n you can:

  • Reach more users

  • Make your app feel personal

  • Show cultural respect

  • Win hearts across borders

Implementing i18n

Here’s what you generally do:

1. Extract Your Strings

Stop hardcoding text like:

<h1>Welcome to my app</h1>

Instead, do this:

<h1>{t('welcome_message')}</h1>

2. Set Up a Translation Library

Most of you use react-i18next. It’s solid, flexible, and supports detection, lazy loading, and more.

Install it:

npm install i18next react-i18next i18next-browser-languagedetector

🔗 Official i18next Documentation
🔗 react-i18next GitHub Repo
🔗 i18next-browser-languagedetector GitHub Repo

3. Create Translation Files

en.json

{"welcome_message": "Welcome to my app" }

fr.json

{"welcome_message": "Bienvenue dans mon application" }

4. Initialize i18n

Set it up in something like i18n.js:

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';

i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  .init({
      resources: {
        en: { translation: require('./en.json') },
        fr: { translation: require('./fr.json') },
      },
      fallbackLng: 'en',
      interpolation: { escapeValue: false },
    });

Then import that i18n.js once in your app (like in index.js or App.js).

📘 Setup Guide – react-i18next
🔧 i18next Configuration Options

5. Use the Translations

In your components:

import { useTranslation } from 'react-i18next';
const MyComponent = () => {
  const { t } = useTranslation();
  return <h1>{t('welcome_message')}</h1>;
};

6. Add a Language Switcher (Optional but Nice)

<button onClick={() => i18n.changeLanguage('en')}>🇬🇧</button>
<button onClick={() => i18n.changeLanguage('fr')}>🇫🇷</button>

Tips

  • Lazy load languages. It will keep bundle size small.

  • If your app gets big, use namespaces.

  • Handle plurals and interpolation ({count} items left)

  • For RTL support: toggle CSS direction based on language

Conclusion

Internationalization can sound fancy but honestly, it’s just about thinking for a wider range of users, and try to make your users feel at home.
No matter if your app is for reading books, selling sneakers, or building space rockets, making it multilingual is one of the most powerful upgrades you can do.

FAQ

Q. What is the difference between i18n and l10n?

A. With i18n (internationalization) you make your app ready to support multiple languages. Whereas i10n (localization) is the adaptation of your app’s content for specific areas.

Q. Which libraries are best for i18n in React?

A. Libraries like react-i18next, FormatJS, and LinguiJS, with react-i18next are the most widely used beacause they are simple and powerful.

🔗 FormatJS Official Site
🔗 LinguiJS Documentation

Q. Does i18n affect app performance?

A. If you are not handling it properly, it can. For a smooth performance you can use lazy loading, avoid over-fetching translation files, and organize strings properly.

Explore other blogs

Explore other blogs

let's get in touch

Have a Project idea?

Connect with us for a free consultation !

Confidentiality with NDA

Understanding the core business.

Brainstorm with our leaders

Daily & Weekly Updates

Super competitive pricing

let's get in touch

Have a Project idea?

Connect with us for a free consultation !

Confidentiality with NDA

Understanding the core business.

Brainstorm with our leaders

Daily & Weekly Updates

Super competitive pricing