Réagir-intl multi-langue de l'app: évolution des langues et des traductions de stockage
J'ai pu réagir-routeur application et souhaitez ajouter i18n. Dans réagissent-intl exemple composant racine enveloppé dans IntlProvider:
ReactDOM.render(
<IntlProvider locale="en">
<App />
</IntlProvider>,
document.getElementById('container')
);
Mais il y a un seul endroit. Comment mettre à jour l'app pour ajouter d'autres langues et comment est la meilleure façon de stocker les traductions?
Vous devez vous connecter pour publier un commentaire.
Que j'ai rencontré le même problème et c'est ce que j'ai trouvé:
Pour changer de langue, j'ai utilisé la solution fournie ici, qui est essentiellement la liaison IntlProvider à ReduxStore avec la fonction de connexion. Aussi n'oubliez pas d'inclure la clé de re-rendre les composants sur le changement de langue. C'est, fondamentalement, tout le code:
C'est ConnectedIntlProvider.js, tout se lie par défaut IntlProvider(attention, la clé prop qui est absent dans le commentaire original sur github)
Et puis dans votre point d'entrée du fichier:
Prochaine chose à faire est de simplement mettre en œuvre réducteur pour la gestion locale et de rendre l'action des créateurs de changer de langue sur demande.
Que la meilleure façon de stocker des traductions - j'ai trouvé beaucoup de discussions sur ce sujet et la situation semble être assez confus, honnêtement, je suis assez dérouté que les décideurs de réagir-intl se concentrer autant sur la date et le numéro de formats et d'oublier au sujet de la traduction. Donc, je ne sais pas absolument la bonne façon de le gérer, mais c'est ce que je fais:
Créer un dossier "locales" et à l'intérieur de créer des tas de fichiers comme "en.js", "fi.js", "ru.js", etc. Fondamentalement, toutes les langues que vous travaillez avec.
Dans chaque fichier d'exportation d'objet json avec des traductions comme ceci:
Autres fichiers ont exactement la même structure, mais avec des chaînes traduites à l'intérieur.
Puis dans le réducteur qui est responsable de la modification de la langue d'importation de tous les états à partir de ces fichiers et de les charger dans redux magasin dès que l'action pour le changement de langue est distribué. Votre composant créé à l'étape précédente va propager les modifications à IntlProvider et de nouveaux paramètres régionaux aura lieu. Sortie sur la page à l'aide de
<FormattedMessage>
ouintl.formatMessage({id: 'app.header.title'})}
, pour en savoir plus sur leur github wiki.Ils ont quelques DefineMessages fonction de là, mais honnêtement, je n'arrivais pas à trouver une bonne information de la façon de l'utiliser, fondamentalement, vous pouvez l'oublier et être OK.
Avec un nouveau Contexte de l'API, je crois qu'il n'est pas nécessaire d'utiliser redux maintenant:
IntlContext.jsx
Principal App.jsx composant:
LanguageSwitch.jsx
J'ai créé un référentiel qui illustre cette idée.
Et aussi codesandbox exemple.