Promptless AI is here soon - Production-ready contextual code. Don't just take our word for it. Know more
Know More

Taking React Apps Global: A Comprehensive Guide to React Intl

No items found.

Kesar Bhimani

August 10, 2023

Kesar Bhimani

August 10, 2023

As a developer, I've come across various tools and libraries that have made my development journey easier and more efficient. One such library is React Intl. React Intl is a comprehensive library that provides React components and an API to format dates, numbers, and strings, including pluralization and handling translations.

When I first started using React Intl in my React apps, I was amazed by how it simplified the process of internationalizing my applications. It allowed me to easily display my React app in the user's preferred language, which is a crucial aspect of creating user-friendly applications.

The beauty of the React Intl library lies in its ability to seamlessly integrate with your existing React components. When I import React Intl into my React project, I can effortlessly use it in conjunction with my existing React components.

Advanced Setup of React Intl

The setup of React Intl in a React project is a straightforward process. However, there are some advanced aspects that I've found to be incredibly useful.

Installation and Configuration

To install React Intl in a new React project, I run the following command in my project directory:

Once installed, I import React Intl into my app component. Here's an example of how I do this:

Setting up the IntlProvider

The IntlProvider is a provider component that makes the React Intl library available to all the components in my React app. I usually set up the IntlProvider in my app component, like so:

In the above code, I'm setting the locale to English and providing the English translations from my language files. The messages prop expects an object where the keys are the same as the ids I use in my FormattedMessage components.

The setup of the IntlProvider also involves handling the user's preferred language. I usually get the user's preferred language from the navigator object, like so:

Then, I use this locale to set the messages prop of the IntlProvider:

In the above code, I'm dynamically setting the messages based on the user's preferred language. This allows my React app to display in the user's preferred language right from the start.

Messages and Formatting

React Intl provides several components and an API to handle messages and formatting in a React app. In my experience, understanding these features is crucial to effectively internationalizing a React app.

Defining Messages

In React Intl, messages are defined in JSON files. Each language supported by the React app has its own JSON file. Here's an example of how I define messages in a JSON file:

In the above code, app.greeting and app.farewell are message ids. The {name} part is a placeholder that can be replaced with a dynamic value.

Message Descriptor

In React Intl, a message descriptor is an object that describes a message. It includes properties like id, defaultMessage, and description. Here's an example of a message descriptor:

In the above code, app.greeting is the id of the message, Hello, {name}! is the default message that will be displayed if no translation is available, and Greeting to welcome the user is a description of the message.

Formatting Messages

React Intl provides the FormattedMessage component to format and display messages. Here's an example of how I use this component in my React app:

In the above code, I'm using the id prop to specify the message id and the values prop to replace the {name} placeholder with a dynamic value.

Advanced Localization with React Intl

React Intl is not just about translating text, but also about providing a full localization experience. This includes handling plural forms, dates, times, and numbers according to the user's preferred language and locale settings.


React Intl provides the FormattedPlural component to handle plural forms in different languages. Here's how I use it:

In the above code, FormattedPlural will display "item" if the count is one, and "items" otherwise. This component takes into account the plural rules of the current locale.

Handling Dates and Times

React Intl provides the FormattedDate and FormattedTime components to format dates and times according to the user's preferred language and locale settings. Here's how I use these components:

In the above code, FormattedDate and FormattedTime will display the date and time in a format that is appropriate for the current locale.

Number Formatting

React Intl provides the FormattedNumber component to format numbers according to the user's preferred language and locale settings. Here's how I use this component:

In the above code, FormattedNumber will display the value as a currency in US dollars. This component takes into account the number formatting rules of the current locale.

Advanced Features of React Intl

React Intl comes packed with several advanced features that make it a powerful tool for internationalizing React apps. Let's delve into some of these features.

Rich Text Formatting

React Intl allows for rich text formatting within translated messages. This is particularly useful when you need to include HTML tags in your messages. Here's how I use this feature:

In the above code, the <bold> tags in the defaultMessage are replaced by <strong> tags, resulting in bold text.

Using HTML in Messages

React Intl provides the FormattedHTMLMessage component to include HTML in messages. However, I advise caution when using this feature due to potential security implications. Here's how I use this component:

In the above code, the <strong> tags in the defaultMessage are rendered as HTML, resulting in bold text.

Custom Formats

React Intl allows you to define and use custom formats. This is particularly useful when you need to format dates, times, and numbers in a specific way. Here's how I define and use a custom date format:

In the above code, I'm defining a custom date format named "short" and using it in the FormattedDate component.

Testing with React Intl

In my experience, testing is an integral part of developing robust and reliable React applications. When using React Intl, there are certain aspects you need to consider to effectively test your components.

Unit Testing

When unit testing components that use React Intl, I usually wrap them in an IntlProvider to provide the necessary context. Here's how I do it:

In the above code, I'm rendering MyComponent within an IntlProvider to make sure it has access to the React Intl context.

Integration Testing

For integration testing, I usually set up a custom render function that wraps my components in an IntlProvider. This allows me to test the interaction between my components and React Intl. Here's how I set up my custom render function:

In the above code, customRender allows me to specify the locale and messages for each test.

Performance Considerations

When working with React Intl, it's important to consider the performance implications. This includes optimizing the bundle size and lazy loading locale data.

Bundle Size Optimization

React Intl can add a significant amount of data to your JavaScript bundle. To optimize the bundle size, I usually only import the locales that I need. Here's how I do it:

In the above code, I'm only importing the English and French locale data, which reduces the size of my JavaScript bundle.

Lazy Loading of Locale Data

To further optimize performance, I often lazy load the locale data. This means that the data for a specific locale is only loaded when it's needed. Here's how I lazy load locale data:

In the above code, the locale data is loaded asynchronously, which means it doesn't block the rendering of my React app.

Best Practices with React Intl

Organizing Locale Data

I usually organize my locale data in a structured manner. I create a separate directory for locale data and within it, I create separate JSON files for each supported language. This makes it easy to manage and update translations.

Fallback and Error Handling

It's important to handle cases where translations for a specific message id or locale are missing. React Intl provides a defaultMessage prop that can be used as a fallback. I always ensure to provide a defaultMessage for every FormattedMessage and FormattedHTMLMessage component.

In the above code, if a translation for the message id app.greeting is not found, the defaultMessage will be used.

Conclusion: Powering Up React Development with React Intl and WiseGPT

In my journey as a developer, I've found that React Intl is a powerful tool for internationalizing React applications. It provides a comprehensive set of features that allow for a high degree of flexibility when creating user interfaces. Moreover, its performance optimization features ensure that your application remains fast and responsive.

While React Intl simplifies the process of internationalizing your React applications, there are other aspects of React development that can be made more efficient as well. For instance, dealing with APIs can often be a tedious process, involving manual API requests, response parsing, and error management strategies.

This is where tools like WiseGPT come into play. Developed by DhiWise, WiseGPT is a plugin that generates code for APIs in your React project. It mirrors your coding style and auto-creates models and functions, eliminating the need for manual API requests and response parsing.

What's interesting about WiseGPT is that it aligns well with the philosophy of React Intl. Just like React Intl simplifies internationalization, WiseGPT simplifies working with APIs. Both tools aim to make your development process smoother and more efficient, allowing you to focus on what truly matters - building great user experiences.

So, as you explore the capabilities of React Intl and delve deeper into creating internationalized React applications, I'd also recommend trying out WiseGPT. It could significantly enhance your development workflow, just like React Intl has done for internationalization. After all, in the world of development, efficiency, and productivity go hand in hand with the quality of the end product.

Frequently asked questions

Frequently asked questions

No items found.