It's important to know how to deal with multiple kinds of users, and the one of the most important barriers is the language so it's very important that your project has some sort of internationalization. There are many forms implement Internationalization on you project, but the quickest and easiest i found was with i18next + react-i18n.
- Create your project (i use vite):
npm create vite@latest
- Add i18next + react-i18n to your project
npm install react-i18next i18next --save
- Create a folder called
liband create a file calledi18n.ts:
should look like this
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
i18n.use(initReactI18next).init({
resources: {},
lng: "en", // the default language you want on your project
});
- Create another folder on
srccalledlocale, there you can add your.jsonfiles, on this example i created two:en.jsonfor English andpt.jsonfor Portuguese:en.json
{
"translation":{
"header": "Our Header",
"footer": "Our Footer {{year}}"
}
}
pt.json
{
"translation":{
"header": "Nosso Cabeçalho",
"footer": "Nosso Rodape {{year}}"
}
}
should look like this
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
//Add the translation files
import enTranslations from "../locale/en.json";
import ptTranslations from "../locale/pt.json";
i18n.use(initReactI18next).init({
resources: {
en: { ...enTranslations },
pt: { ...ptTranslations },
},
lng: "en",
});
- Go on your
main.tsxfile and import the i18n.ts file:
import "./lib/i18n.ts";
- Let's add the
useTranslationhook:
const {
t,
i18n: { changeLanguage, language },
} = useTranslation();
- Create a useState just switch between the languages
const [currentLang, setCurrentLang] = useState(language); - Create a simple function to switch the languages
const switchLang = () => {
const newLang = currentLang === "en" ? "pt" : "en";
changeLanguage(newLang);
setCurrentLang(newLang);
};
- Change your App.tsx so we can test our theory!
Should look like this
return (
<>
<h1>{t("header")}</h1>
<button type="button" onClick={switchLang}>
Change Language manually
</button>
<footer>
<h1>{t("footer", { year: new Date().getFullYear() })}</h1>
</footer>
</>
);
- As you can see, to use the translation we have to pass the
tfromuseTranslationwith the tokens we created on our json languages.