While developing an international website, there is a requirement to develop a website in multiple languages depending on the region or user-selected language. In this situation, using the react-i18next library, we can translate the website content into multiple languages.
First, we need to install the required npm packages in your project directory.
npm install i18next react-i18next --save
Also need to import another package i18next-xhr-backend . This package is used to store the translations of content in different files with respect to the different languages. So it is easy to add new languages. If you want to add a new language then just add the translations file for that language in the project directory.
We create the translation files for different languages which we want to support on our website like English, German, Chinese etc.
We put that translation file in our public/assets/i18n/translations folder. In this folder, we create different json files for different languages.
First, we need to identify the language specific strings in our application which we need to change with respect to language.
For example, we create the translation file for default English language is src/assets/translations/en.json,
{ "intro.label": "Hello", "thankyou.label": "Thank you", "details.label": "is an internationalization-framework which offers a complete solution to localize your product from web to mobile and desktop:is an internationalization-framework which offers a complete solution to localize your product from web to mobile and desktop", "Advantages.label": "Advantages", "Advantagesdetails.label": "Flexibility to use other packages: Flexibility to use other packages" }
For German language src/assets/translations/de.json,
{ "intro.label": "Einführung", "thankyou.label": "Thank you", "details.label": "is an internationalization-framework which offers a complete solution to localize your product from web to mobile and desktop:", "Advantages.label": "Vorteile", "Advantagesdetails.label": "Flexibilität zur Verwendung anderer Pakete" }
For Chinese language src/assets/translations/zh-HK.json,
{ "intro.label": "介绍", "thankyou.label": "谢谢", "details.label": "是一个国际化框架,提供了一个完整的解决方案来将您的产品从Web本地化到移动和台式机:是一个国际化框架,提供了一个完整的解决方案来将产品从Web本地化到Web到移动设备和桌面", "Advantages.label": "优点", "Advantagesdetails.label": "使用其他软件包的灵活性:使用其他软件包的灵活性" }
For Arabic language src/assets/translations/ar.json,
{ "intro.label": "مقدمة", "thankyou.label": "شكرا جزيلا", "details.label": "هو إطار تدويل يوفر حلاً كاملاً لترجمة منتجك من الويب إلى الهاتف المحمول وسطح المكتب: هو إطار التدويل الذي يوفر حلاً كاملاً لترجمة منتجك من الويب إلى الهاتف المحمول وسطح المكتب", "Advantages.label": "مزايا", "Advantagesdetails.label": "المرونة في استخدام الحزم الأخرى: المرونة في استخدام الحزم الأخرى" }
i18next configuration
First we create an i18n.js file in the src directory. The 118n.js file contains following configurations,
import i18n from "i18next"; import Backend from "i18next-xhr-backend"; import { initReactI18next } from "react-i18next"; i18n .use(Backend) .use(initReactI18next) .init({ lng: "en", //default language fallbackLng: "en", //when specified language translations not present //then fallbacklang translations loaded. debug: true, backend: { /* translation file path */ loadPath: "/assets/i18n/{{ns}}/{{lng}}.json", }, /* can have multiple namespace, in case you want to divide a huge translation into smaller pieces and load them on demand */ ns: ["translations"], defaultNS: "translations", keySeparator: false, interpolation: { escapeValue: false, formatSeparator: ",", }, react: { wait: true, }, }); export default i18n;
There are multiple ways to load translations in the component you can refer https://react.i18next.com/latest/using-with-hooks
Here we give an example for using hook (useTranslation) and HOC (withTranslation).
While using functional components you can use the useTranslation hook. In your functional component, it gets the t function and i118n instance. t function is used to translate your content and i18n is used to change the language.
Lets create a component introduction with its content,
import React from "react"; import { useTranslation } from "react-i18next"; const Introduction = () => { const { t, i18n } = useTranslation(); return ( <div> <div style={{ textAlign: "center", fontWeight: "500" }}> {t("intro.label")} </div> {t("details.label")} </div> ); }; export default Introduction;
with translation is a higher-order component that gives function and i18n instance as props of the component. For more reference follow https://react.i18next.com/latest/withtranslation-hoc
import React from "react"; import { withTranslation } from "react-i18next"; const Advantages = ({ t }) => { return ( <div> {t("thankyou.label")} {t("Advantages.label")} {t("Advantagesdetails.label")} </div> ); }; export default withTranslation()(Advantages);
After this, we need to pass the local name to the changeLanguage method of the i18n instance. We can pass the locale name of the language in which we want to show the content of our website. For that, we create a language selector component through which users can change the language.
import React from "react"; import { useTranslation } from "react-i18next"; const LanguageSelector = () => { const { t, i18n } = useTranslation(); const changeLanguage = (event) => { i18n.changeLanguage(event.target.value); }; return ( <div onChange={changeLanguage}> <input type="radio" value="en" name="language" defaultChecked /> English <input type="radio" value="zh-hk" name="language" /> Chinese <input type="radio" value="de" name="language" /> German <input type="radio" value="ar" name="language" /> Arabic </div> ); }; export default LanguageSelector;
Here is our app.js file
import React, { Component, Suspense } from "react"; import "./App.css"; import "./i18n"; import Introduction from "./Hello"; import Advantages from "./ThankYou"; import LanguageSelector from "./LanguageSelector"; const App = () => { return ( <div> <Suspense fallback={null}> <LanguageSelector /> <Introduction /> <Advantages /> </Suspense> </div> ); }; export default App;
While the translation file is loading or it takes time to load at that time withTranslation and useTranslation both will trigger the Suspense. If you don’t want to use Suspense then you can set useSuspense parameter to false. E.g
const { t, i18n } = useTranslation( { useSuspense: false });
Or
const ExtendedComponent = withTranslation()(MyComponent); <ExtendedComponent useSuspense={false} />
So you have added German, Chinese, Arabic language support for your website. Similarly, you can add multiple language support by adding a translation file for that language.
In this article we added German, Chinese, Arabic language support for your website. Similarly, you can add multiple language support by adding a translation file for that language. Want to add multiple language support in your international website? Hire our react js developers who are expertise in such development.
How to Effectively Hire and Manage a Remote Team of Developers.
Download NowMindbowser played a crucial role in helping us bring everything together into a unified, cohesive product. Their commitment to industry-standard coding practices made an enormous difference, allowing developers to seamlessly transition in and out of the project without any confusion....
CEO, MarketsAI
I'm thrilled to be partnering with Mindbowser on our journey with TravelRite. The collaboration has been exceptional, and I’m truly grateful for the dedication and expertise the team has brought to the development process. Their commitment to our mission is...
Founder & CEO, TravelRite
The Mindbowser team's professionalism consistently impressed me. Their commitment to quality shone through in every aspect of the project. They truly went the extra mile, ensuring they understood our needs perfectly and were always willing to invest the time to...
CTO, New Day Therapeutics
I collaborated with Mindbowser for several years on a complex SaaS platform project. They took over a partially completed project and successfully transformed it into a fully functional and robust platform. Throughout the entire process, the quality of their work...
President, E.B. Carlson
Mindbowser and team are professional, talented and very responsive. They got us through a challenging situation with our IOT product successfully. They will be our go to dev team going forward.
Founder, Cascada
Amazing team to work with. Very responsive and very skilled in both front and backend engineering. Looking forward to our next project together.
Co-Founder, Emerge
The team is great to work with. Very professional, on task, and efficient.
Founder, PeriopMD
I can not express enough how pleased we are with the whole team. From the first call and meeting, they took our vision and ran with it. Communication was easy and everyone was flexible to our schedule. I’m excited to...
Founder, Seeke
Mindbowser has truly been foundational in my journey from concept to design and onto that final launch phase.
CEO, KickSnap
We had very close go live timeline and Mindbowser team got us live a month before.
CEO, BuyNow WorldWide
If you want a team of great developers, I recommend them for the next project.
Founder, Teach Reach
Mindbowser built both iOS and Android apps for Mindworks, that have stood the test of time. 5 years later they still function quite beautifully. Their team always met their objectives and I'm very happy with the end result. Thank you!
Founder, Mindworks
Mindbowser has delivered a much better quality product than our previous tech vendors. Our product is stable and passed Well Architected Framework Review from AWS.
CEO, PurpleAnt
I am happy to share that we got USD 10k in cloud credits courtesy of our friends at Mindbowser. Thank you Pravin and Ayush, this means a lot to us.
CTO, Shortlist
Mindbowser is one of the reasons that our app is successful. These guys have been a great team.
Founder & CEO, MangoMirror
Kudos for all your hard work and diligence on the Telehealth platform project. You made it possible.
CEO, ThriveHealth
Mindbowser helped us build an awesome iOS app to bring balance to people’s lives.
CEO, SMILINGMIND
They were a very responsive team! Extremely easy to communicate and work with!
Founder & CEO, TotTech
We’ve had very little-to-no hiccups at all—it’s been a really pleasurable experience.
Co-Founder, TEAM8s
Mindbowser was very helpful with explaining the development process and started quickly on the project.
Executive Director of Product Development, Innovation Lab
The greatest benefit we got from Mindbowser is the expertise. Their team has developed apps in all different industries with all types of social proofs.
Co-Founder, Vesica
Mindbowser is professional, efficient and thorough.
Consultant, XPRIZE
Very committed, they create beautiful apps and are very benevolent. They have brilliant Ideas.
Founder, S.T.A.R.S of Wellness
Mindbowser was great; they listened to us a lot and helped us hone in on the actual idea of the app. They had put together fantastic wireframes for us.
Co-Founder, Flat Earth
Ayush was responsive and paired me with the best team member possible, to complete my complex vision and project. Could not be happier.
Founder, Child Life On Call
The team from Mindbowser stayed on task, asked the right questions, and completed the required tasks in a timely fashion! Strong work team!
CEO, SDOH2Health LLC
Mindbowser was easy to work with and hit the ground running, immediately feeling like part of our team.
CEO, Stealth Startup
Mindbowser was an excellent partner in developing my fitness app. They were patient, attentive, & understood my business needs. The end product exceeded my expectations. Thrilled to share it globally.
Owner, Phalanx
Mindbowser's expertise in tech, process & mobile development made them our choice for our app. The team was dedicated to the process & delivered high-quality features on time. They also gave valuable industry advice. Highly recommend them for app development...
Co-Founder, Fox&Fork