Internationalisation
- Pas tous les utilisateurs de votre application parlent français.
- On doit « softcoder » tout le texte de l’application pour l’afficher dans la langue de l’utilisateur.
-
Ce n’est pas seulement le texte qui doit être localisé mais aussi :
- Les dates
- L’heure
- Les montants d’argent
- Les pourcentages
- Le singulier et le pluriel des mots
- Les guillemets
React et l’internationalisation
- Plusieurs modules existent pour internationaliser React
- Dans ce cours, nous allons utiliser React-Intl
Pour installer React-Intl :
Manuel
Installation minimale dans React
- Créer un dossier lang sous src
- Créer un fichier json nommé fr.json
-
Ajoutez vos clés de traductions comme ceci :
-
Important de bien nommer les clés, pour donner le plus de contexte possible à l’équipe de traduction. Par exemple, le texte à l’intérieur d’un input pourrait avoir la clé suivante :
Code minimal
App.tsx
import Exemples from '../Exemples';
import { createIntl, IntlProvider } from 'react-intl';
import Francais from '../../lang/fr.json';
import Anglais from '../../lang/en.json';
import { useState } from 'react';
function App() {
const [locale, setLocale] = useState('fr');
const [messages, setMessages] = useState(Francais);
const intl = createIntl({
locale: locale,
messages: messages,
});
return (
<>
<IntlProvider locale={locale} messages={messages}>
<Exemples intl={intl} />
</IntlProvider>
</>
);
}
export default App;
Message traduit simple
Manuel
Message avec variable
app.tsx
<FormattedMessage
id="app.clics.label"
defaultMessage="Titre"
values={{ nombreclics: count }}
/>
Pour traduire du texte avec la possibilité de pluriel
lang/fr.json
{
"app.clics.pluriel.label": "{nombreclics, plural,=0 {Il n'y a pas eu de clic} one {Il y a eu un clic} other {Il y a eu {nombreclics} clics}}"
}
app.tsx
<FormattedMessage
id="app.clics.pluriel.label"
defaultMessage="Titre"
values={{ nombreclics: count }}
/>
Manuel
Pour formater une date dans le format de la langue cible
app.tsx
const maintenant = new Date();
<FormattedDate
value={maintenant}
year="numeric"
month="long"
day="2-digit"
/>
Manuel
Pour formatter l’heure dans le format de la langue cible
app.tsx
const maintenant = new Date();
const heure = maintenant.getTime();
<FormattedTime value={heure} />
<br />
<FormattedTime value={heure} timeZone="America/Vancouver" />
Manuel
Pour formater une devise (monétaire)
app.tsx
const prix = 12.35;
<FormattedNumber
value={prix}
style="currency"
currency="CAD"
currencyDisplay="symbol"
/>
Manuel
Pour formater un pourcentage
Pour formater un message d'erreur
app.tsx
const intl = createIntl({
locale: locale,
messages: messages,
});
const messageErreur = intl.formatMessage({
id: 'app.erreur.message',
defaultMessage: 'Une erreur est survenue',
});
CodeSandbox
Sélecteur de langue
Maintenant que le texte est traduit, voici ce qu'il faut faire pour changer la langue dynamiquement :
- Créer un contexte pour la langue
- Ajouter une fonction pour changer la langue dans le contexte
- Créer un provider pour le contexte
- Utiliser le contexte dans le composant qui aura le sélecteur
- Créer un sélecteur de langue et appeler la fonction pour changer la langue
Note
Je laisse ce point sans démonstration, un petit défi pour l'exercice qui s'en vient!