Posez votre question et obtenez un résumé du document en referencant cette page et le Provider AI de votre choix
Historique des versions
- Version initialev7.0.001/11/2025
Le contenu de cette page a été traduit à l'aide d'une IA.
Voir la dernière version du contenu original en anglaisSi vous avez une idée d’amélioration pour améliorer cette documentation, n’hésitez pas à contribuer en submitant une pull request sur GitHub.
Lien GitHub de la documentationCopier le Markdown du doc dans le presse-papiers
Comment internationaliser votre application Next.js avec next-intl en 2026
Table des matières
Qu'est-ce que next-intl ?
next-intl est une bibliothèque d'internationalisation (i18n) populaire conçue spécifiquement pour le App Router de Next.js. Elle offre un moyen fluide de créer des applications Next.js multilingues avec un excellent support TypeScript et des optimisations intégrées.
Si vous préférez, vous pouvez également consulter le guide next-i18next, ou utiliser directement Intlayer.
Voir la comparaison dans next-i18next vs next-intl vs Intlayer.
Pour comprendre d'où viennent ces bibliothèques, lisez l'histoire de l'i18n en JavaScript.
Ce que dit le benchmark à propos de next-intl sur Next.js
Avant d'implémenter les traductions, il est essentiel de comprendre le profil de performance de next-intl. Le benchmark i18n évalue la même application Next.js de 10 pages et 10 locales avec différentes configurations et bibliothèques, afin de mesurer le poids réel du bundle, la fuite de chaînes et le coût d'hydratation.
Métrique
Chargement JSON dynamique
Charge les traductions à la volée
JSON scopé (espaces de noms)
Espaces de noms de traduction par page
Quelle est cette métrique ?
La taille totale compressée en gzip du bundle de la bibliothèque d’internationalisation. Elle n’inclut que le fournisseur et la logique de récupération de contenu après tree-shaking et minification.
Pourquoi est-ce important ?
Une taille de bibliothèque plus petite réduit la charge utile JavaScript initiale, ce qui accélère le téléchargement et le temps d’exécution sur le client.
Voir comme
Chiffres clés pour next-intl sur Next.js (gzip) :
Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement
| Configuration | Taille de la bibliothèque | JS moyen par page | Fuite autre locale | Fuite autre page |
|---|---|---|---|---|
| Base (sans i18n) | - | 141.0 Ko | 0.0% | 0.0% |
next-intl | 14.7 Ko | 153.6 Ko | 4.2% | 89.8% |
@intlayer/next-intl (compatibilité) | 8.0 Ko | 148.7 Ko | 0.0% | 0.0% |
next-intlayer (Intlayer natif) | 5.5 Ko | 141.3 Ko | 0.0% | 0.0% |
Ce qu'il faut retenir :
- Évitez les catalogues de messages globaux : dans les configurations standard où tous les messages sont chargés dans les layouts racine, ~89.8% du contenu traduit envoyé au navigateur appartient à d'autres pages. Utiliser
pick(messages, ['namespace'])par route supprime cette fuite, mais demande une maintenance manuelle. - Poids du runtime : le runtime
next-intlajoute ~14.7 Ko gzip à chaque page. Pour les applicationsnext-intlexistantes, l'adaptateur de compatibilité@intlayer/next-intlconserve les mêmes hooks (useTranslations,useFormatter, etc.) tout en réduisant le runtime à ~8.0 Ko avec 0% de fuite.next-intlayeren natif réduit encore l'empreinte à 5.5 Ko.
Consultez l'ensemble des données : Rapport de benchmark Next.js, et le dépôt du benchmark.
Comparaison des fonctionnalités sur Next.js
Comment next-intl se compare à next-i18next et Intlayer sur les fonctionnalités dont un projet Next.js App Router a généralement besoin :
Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement
| Fonctionnalité | next-intlayer (Intlayer) | next-intl | next-i18next |
|---|---|---|---|
| Traductions proches des composants | ✅ Contenu colocalisé avec chaque composant | ❌ JSON centralisé | ❌ JSON centralisé |
| Intégration TypeScript | ✅ Types stricts générés automatiquement | ✅ Bonne, via augmentation d'AppConfig | ⚠️ Basique |
| Détection des traductions manquantes | ✅ Erreurs TypeScript et avertissements au build | ⚠️ Repli à l'exécution | ⚠️ Repli à l'exécution |
| Contenu riche (JSX, Markdown) | ✅ Prise en charge directe | ⚠️ Balises via t.rich, pas de Markdown | ⚠️ Balises via <Trans> |
| Traduction par IA | ✅ Votre propre fournisseur et clé API, avec contexte d'app | ❌ Non | ❌ Non |
| Éditeur visuel / CMS | ✅ Éditeur visuel local + CMS optionnel | ❌ Via des plateformes externes | ❌ Via des plateformes externes |
| Routage localisé | ✅ Intégré (Next.js et Vite) | ✅ Segment [locale] intégré | ✅ Intégré |
| Pluralisation | ✅ Basée sur l'énumération | ✅ ICU | ✅ Basée sur des suffixes (_one, _other) |
| Formatage (dates, nombres, devises) | ✅ Formateurs basés sur Intl | ✅ useFormatter | ✅ Basé sur Intl |
| Formats de contenu | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ .json, .js, .ts | ⚠️ .json |
| ICU MessageFormat | ✅ Via format: "icu" | ✅ Natif | ⚠️ Via i18next-icu |
| Aides SEO (hreflang, sitemap) | ✅ Aides pour métadonnées, sitemap et robots.txt | ✅ Bon | ✅ Bon |
| Server Components | ✅ Accès direct dans tout Server Component | ⚠️ Passer t ou await getTranslations() par composant | ⚠️ Passer t à travers l'arbre de composants |
| Tree-shaking par composant | ✅ Au moment du build (Babel / SWC) | ⚠️ Manuel, avec pick() par route | ⚠️ Manuel, avec des namespaces par route |
| Chargement différé | ✅ Par locale et par dictionnaire | ✅ Par locale, namespaces gérés à la main | ✅ Par locale, namespaces gérés à la main |
| Taille du runtime (gzip, benchmark) | 4.9 Ko | 14.7 Ko | 19.7 Ko |
| Traductions manquantes en CI | ✅ npx intlayer test | ⚠️ Non intégré | ⚠️ Non intégré, saveMissing à l'exécution |
| Écosystème / communauté | ⚠️ Plus modeste, en forte croissance | ✅ Élevé | ✅ Très élevé |
Les tailles de runtime proviennent du benchmark Next.js. Pour une analyse détaillée, lisez next-i18next vs next-intl vs Intlayer.
Pratiques à suivre
Avant de plonger dans l’implémentation, voici quelques bonnes pratiques à suivre :
- Définir les attributs HTML
langetdir
Dans votre layout, calculezdiren utilisantgetLocaleDirection(locale)et définissez<html lang={locale} dir={dir}>pour une accessibilité et un SEO appropriés. - Séparer les messages par namespace
Organisez les fichiers JSON par locale et namespace (par exemple,common.json,about.json) afin de ne charger que ce dont vous avez besoin. - Minimiser la charge côté client
Sur les pages, envoyez uniquement les namespaces nécessaires àNextIntlClientProvider(par exemple,pick(messages, ['common', 'about'])). - Préférer les pages statiques
Utilisez autant que possible des pages statiques pour de meilleures performances et un meilleur SEO. - I18n dans les composants serveur
Les composants serveur, comme les pages ou tous les composants non marqués commeclient, sont statiques et peuvent être pré-rendus lors de la compilation. Nous devrons donc leur passer les fonctions de traduction en tant que props. - Configurer les types TypeScript
Pour vos locales afin d’assurer la sécurité des types dans toute votre application. - Proxy pour la redirection
Utilisez un proxy pour gérer la détection de la locale et le routage, et rediriger l’utilisateur vers l’URL préfixée par la locale appropriée. - Internationalisation de vos métadonnées, sitemap, robots.txt
Internationalisez vos métadonnées, sitemap, robots.txt en utilisant la fonctiongenerateMetadatafournie par Next.js pour garantir une meilleure découverte par les moteurs de recherche dans toutes les locales. - Localiser les liens
Localisez les liens en utilisant le composantLinkpour rediriger l’utilisateur vers l’URL préfixée par la locale appropriée. Il est important d’assurer la découverte de vos pages dans toutes les locales. - Automatisez les tests et les traductions
L’automatisation des tests et des traductions permet de gagner du temps dans la maintenance de votre application multilingue.
Consultez notre documentation listant tout ce que vous devez savoir sur l’internationalisation et le SEO : Internationalization (i18n) with next-intl.
Guide étape par étape pour configurer next-intl dans une application Next.js
Voir le Modèle d’Application sur GitHub.
Voici la structure du projet que nous allons créer :
Copier le code dans le presse-papiers
Installer les dépendances
Installez les paquets nécessaires en utilisant npm :
bashCopier le codeCopier le code dans le presse-papiers
- next-intl : La bibliothèque principale d'internationalisation pour Next.js App Router qui fournit des hooks, des fonctions serveur et des providers client pour gérer les traductions.
Configurer votre projet
Créez un fichier de configuration qui définit vos locales supportées et configure la gestion des requêtes de next-intl. Ce fichier sert de source unique de vérité pour votre configuration i18n et garantit la sécurité des types dans toute votre application.
Centraliser la configuration des locales évite les incohérences et facilite l'ajout ou la suppression de locales à l'avenir. La fonction
getRequestConfigs'exécute à chaque requête et charge uniquement les traductions nécessaires pour chaque page, permettant ainsi le découpage du code (code-splitting) et réduisant la taille du bundle.src/i18n.tsCopier le codeCopier le code dans le presse-papiers
Définir les routes dynamiques par locale
Configurez le routage dynamique pour les locales en créant un répertoire
[locale]dans votre dossier app. Cela permet à Next.js de gérer le routage basé sur la locale où chaque locale devient un segment de l'URL (par exemple,/en/about,/fr/about).L'utilisation de routes dynamiques permet à Next.js de générer des pages statiques pour toutes les locales lors de la compilation, améliorant ainsi les performances et le SEO. Le composant layout définit les attributs HTML
langetdiren fonction de la locale, ce qui est crucial pour l'accessibilité et la compréhension par les moteurs de recherche.src/app/[locale]/layout.tsxCopier le codeCopier le code dans le presse-papiers
src/app/[locale]/about/page.tsxCopier le codeCopier le code dans le presse-papiers
Créez vos fichiers de traduction
Créez des fichiers JSON pour chaque locale et namespace. Cette structure vous permet d’organiser les traductions de manière logique et de ne charger que ce dont vous avez besoin pour chaque page.
Organiser les traductions par namespace (par exemple,
common.json,about.json) permet le découpage du code (code splitting) et réduit la taille du bundle. Vous ne chargez que les traductions nécessaires pour chaque page, ce qui améliore les performances.locales/en/common.jsonCopier le codeCopier le code dans le presse-papiers
locales/fr/common.jsonCopier le codeCopier le code dans le presse-papiers
locales/en/about.jsonCopier le codeCopier le code dans le presse-papiers
locales/fr/about.jsonCopier le codeCopier le code dans le presse-papiers
Utiliser les traductions dans vos pages
Créez un composant de page qui charge les traductions côté serveur et les transmet aux composants serveur et client. Cela garantit que les traductions sont chargées avant le rendu et évite les clignotements de contenu.
Le chargement des traductions côté serveur améliore le SEO et empêche le FOUC (Flash of Untranslated Content). En utilisant
pickpour envoyer uniquement les namespaces nécessaires au fournisseur client, nous minimisons la taille du bundle JavaScript envoyé au navigateur.src/app/[locale]/about/page.tsxCopier le codeCopier le code dans le presse-papiers
Utiliser les traductions dans les composants client
Les composants client peuvent utiliser les hooks
useTranslationsetuseFormatterpour accéder aux traductions et aux fonctions de formatage. Ces hooks lisent le contexte deNextIntlClientProvider.Les composants client ont besoin des hooks React pour accéder aux traductions. Les hooks
useTranslationsetuseFormatters'intègrent parfaitement avec next-intl et fournissent des mises à jour réactives lorsque la locale change.N'oubliez pas d'ajouter les namespaces requis aux messages client de la page (incluez uniquement les namespaces dont vos composants client ont réellement besoin).
src/components/ClientComponent.tsxCopier le codeCopier le code dans le presse-papiers
Utiliser les traductions dans les composants serveur
Les composants serveur ne peuvent pas utiliser les hooks React, ils reçoivent donc les traductions et les formateurs via des props de leurs composants parents. Cette approche maintient les composants serveur synchrones et leur permet d’être imbriqués à l’intérieur des composants client.
Les composants serveur qui pourraient être imbriqués sous des frontières client doivent être synchrones. En passant des chaînes traduites et des valeurs formatées en tant que props, nous évitons les opérations asynchrones et assurons un rendu correct. Pré-calculer les traductions et le formatage dans le composant parent de la page.
src/components/ServerComponent.tsxCopier le codeCopier le code dans le presse-papiers
Dans votre page/layout, utilisez
getTranslationsetgetFormatterdepuisnext-intl/serverpour pré-calculer les traductions et le formatage, puis passez-les en props aux composants serveur.Changer la langue de votre contenu
FacultatifPour changer la langue de votre contenu avec next-intl, affichez des liens sensibles à la locale qui pointent vers le même chemin tout en changeant la locale. Le provider réécrit automatiquement les URLs, vous n'avez donc qu'à cibler la route actuelle.
src/components/LocaleSwitcher.tsxCopier le codeCopier le code dans le presse-papiers
Utiliser le composant Link localisé
Facultatifnext-intlfournit un sous-packagenext-intl/navigationqui contient un composant Link localisé appliquant automatiquement la locale active. Nous l'avons déjà extrait pour vous dans le fichier@/i18n, vous pouvez donc l'utiliser ainsi :src/components/MyComponent.tsxCopier le codeCopier le code dans le presse-papiers
Accéder à la locale active dans les Server Actions
FacultatifLes Server Actions peuvent lire la locale courante en utilisant
next-intl/server. Cela est utile pour envoyer des emails localisés ou stocker les préférences de langue avec les données soumises.src/app/actions/get-current-locale.tsCopier le codeCopier le code dans le presse-papiers
getLocalelit la locale définie par le proxynext-intl, donc cela fonctionne partout sur le serveur : Route Handlers, Server Actions et fonctions edge.Internationalisez vos métadonnées
FacultatifLa traduction du contenu est importante, mais l'objectif principal de l'internationalisation est de rendre votre site web plus visible dans le monde. L'i18n est un levier incroyable pour améliorer la visibilité de votre site grâce à un SEO approprié.
Les métadonnées correctement internationalisées aident les moteurs de recherche à comprendre quelles langues sont disponibles sur vos pages. Cela inclut la définition des balises meta hreflang, la traduction des titres et descriptions, et la garantie que les URLs canoniques sont correctement définies pour chaque locale.
src/app/[locale]/about/layout.tsxCopier le codeCopier le code dans le presse-papiers
Internationalisez votre Sitemap
FacultatifGénérez un sitemap qui inclut toutes les versions locales de vos pages. Cela aide les moteurs de recherche à découvrir et indexer toutes les versions linguistiques de votre contenu.
Un sitemap correctement internationalisé garantit que les moteurs de recherche peuvent trouver et indexer toutes les versions linguistiques de vos pages. Cela améliore la visibilité dans les résultats de recherche internationaux.
src/app/sitemap.tsCopier le codeCopier le code dans le presse-papiers
Internationalisez votre fichier robots.txt
FacultatifCréez un fichier robots.txt qui gère correctement toutes les versions locales de vos routes protégées. Cela garantit que les moteurs de recherche n'indexent pas les pages d'administration ou de tableau de bord dans aucune langue.
Configurer correctement le fichier robots.txt pour toutes les locales empêche les moteurs de recherche d'indexer des pages sensibles lorsque vos routes diffèrent selon la locale.
src/app/robots.tsCopier le codeCopier le code dans le presse-papiers
Configurer un proxy pour le routage des locales
FacultatifCréez un proxy pour détecter automatiquement la locale préférée de l'utilisateur et le rediriger vers l'URL préfixée par la locale appropriée. next-intl fournit une fonction proxy pratique qui gère cela automatiquement.
Le proxy garantit que les utilisateurs sont automatiquement redirigés vers leur langue préférée lorsqu'ils visitent votre site. Il sauvegarde également la préférence de l'utilisateur pour les visites futures, améliorant ainsi l'expérience utilisateur.
src/proxy.tsCopier le codeCopier le code dans le presse-papiers
Configurer les types TypeScript pour la locale
FacultatifConfigurer TypeScript vous aidera à bénéficier de l'autocomplétion et de la sécurité de type pour vos clés.
Pour cela, vous pouvez créer un fichier global.ts à la racine de votre projet et y ajouter le code suivant :
global.tsCopier le codeCopier le code dans le presse-papiers
Ce code utilise l'augmentation de module pour ajouter les locales et les messages au type AppConfig de next-intl.
Automatisez vos traductions avec Intlayer
FacultatifIntlayer est une bibliothèque gratuite et open-source conçue pour assister le processus de localisation dans votre application. Alors que next-intl gère le chargement et la gestion des traductions, Intlayer aide à automatiser le flux de travail des traductions.
Gérer les traductions manuellement peut être chronophage et sujet à erreurs. Intlayer automatise les tests, la génération et la gestion des traductions, vous faisant gagner du temps et assurant la cohérence dans toute votre application.
Intlayer vous permet de :
Déclarer votre contenu où vous le souhaitez dans votre base de code
Intlayer permet de déclarer votre contenu où vous le souhaitez dans votre base de code en utilisant des fichiers.content.{ts|js|json}. Cela permettra une meilleure organisation de votre contenu, assurant une meilleure lisibilité et maintenabilité de votre base de code.Tester les traductions manquantes Intlayer fournit des fonctions de test qui peuvent être intégrées dans votre pipeline CI/CD ou dans vos tests unitaires. En savoir plus sur tester vos traductions.
Automatisez vos traductions, Intlayer propose une CLI et une extension VSCode pour automatiser vos traductions. Cela peut être intégré dans votre pipeline CI/CD. En savoir plus sur l'automatisation de vos traductions. Vous pouvez utiliser votre propre clé API et le fournisseur d'IA de votre choix. Il offre également des traductions contextuelles, voir remplir le contenu.
Connecter du contenu externe Intlayer vous permet de connecter votre contenu à un système de gestion de contenu externe (CMS). Pour le récupérer de manière optimisée et l’insérer dans vos ressources JSON. En savoir plus sur la récupération de contenu externe.
Éditeur visuel
Intlayer propose un éditeur visuel gratuit pour modifier votre contenu via une interface visuelle. En savoir plus sur l’édition visuelle de vos traductions.
Et plus encore. Pour découvrir toutes les fonctionnalités offertes par Intlayer, veuillez consulter la documentation sur l’intérêt d’Intlayer.
Pour des benchmarks de performance et des comparaisons détaillés, consultez :
Commentaires
Aucun commentaire pour le moment. Soyez le premier à partager vos pensées.
