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 initiale"v9.5.1026/09/2026
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 Lingui en 2026
Table des matières
Qu'est-ce que Lingui ?
Lingui est une bibliothèque d'internationalisation conçue autour des macros et de l'extraction de messages. Vous écrivez le texte source directement dans vos composants ( t`Hello` , <Trans>Hello</Trans>), lingui extract rassemble chaque message dans des catalogues (fichiers PO par défaut), et un chargeur les compile en JavaScript compact. Les messages utilisent le format ICU MessageFormat, et Lingui prend en charge les React Server Components dans l'App Router.
Ce guide configure Lingui dans un projet Next.js 16 App Router, avec :
- Des macros compilées par SWC, afin que Turbopack conserve toute sa rapidité.
- Des Server et Client Components partageant la même API
TransetuseLingui. - Un routage par locale via
proxy.ts:/aboutpour la locale par défaut,/fr/aboutpour les autres, et détection de la langue lors de la première visite. - Un rendu statique de chaque locale avec
generateStaticParams. - Un SEO multilingue complet :
generateMetadatatraduit, canonical,hreflangavecx-default, locales Open Graph, JSON-LD,sitemap.ts,robots.tset pages 404 localisées.
Vous recherchez une autre bibliothèque ? Consultez le guide next-intl, le guide next-i18next, ou le guide Next.js + Intlayer.
Vous utilisez TanStack Start ? Consultez le guide TanStack Start + Lingui. Vous comparez les bibliothèques ? Lisez Lingui vs Intlayer et next-i18next vs next-intl vs Intlayer.
Ce que dit le benchmark à propos de Lingui sur Next.js
Le benchmark i18n exécute la même application Next.js de 10 pages et 10 locales avec chaque bibliothèque majeure et mesure ce que le navigateur télécharge réellement.
Chargement JSON dynamique
Charge les traductions à la volée
JSON scopé (espaces de noms)
Espaces de noms de traduction par page
Benchmark de Performance I18n
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 @lingui/core@6.6.0 sur Next.js 16, mesurés le 2026-09-26 (gzip) :
Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement
| Configuration | Taille de la bibliothèque | JS par page | Fuite autre locale | Fuite autre page |
|---|---|---|---|---|
| Sans i18n (app de base) | - | 141.0 Ko | 0% | 0% |
| Lingui, un catalogue par locale | 72.1 Ko | 145.4 Ko | 2.8% | 89.9% |
@intlayer/lingui (compatibilité) | 10.7 Ko | 221.6 Ko | 50% | 90% |
next-intlayer (Intlayer natif) | 4.9 Ko | 141.5 Ko | 0% | 0% |
Ce qu'il faut retenir :
- Un catalogue unique par locale transmet tout de même les messages des autres pages au provider client. Conservez autant de texte que possible dans les Server Components, qui envoient du HTML rendu et non des catalogues.
- Le runtime Lingui pèse environ 72 Ko gzip. L'adaptateur de compatibilité
@intlayer/linguiréduit le runtime à environ 11 Ko, mais dans ce benchmark, la configuration de compatibilité Next.js envoie toujours des catalogues entiers à la page. L'API nativenext-intlayerest la configuration qui reste à la taille de l'application de base.
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 Lingui se compare à next-intl 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) | Lingui | next-intl |
|---|---|---|---|
| Traductions proches des composants | ✅ Contenu colocalisé avec chaque composant | ⚠️ Texte source dans les composants, catalogues centralisés | ❌ JSON centralisé |
| Intégration TypeScript | ✅ Types stricts générés automatiquement | ⚠️ Macros typées, catalogues de messages non typés | ✅ Bonne, via augmentation d'AppConfig |
| Détection des traductions manquantes | ✅ Erreurs TypeScript et avertissements au build | ⚠️ Repli à l'exécution sur le texte source | ⚠️ Repli à l'exécution |
| Contenu riche (JSX, Markdown) | ✅ Prise en charge directe | ✅ JSX dans <Trans>, pas de Markdown | ⚠️ Balises via t.rich, pas de Markdown |
| 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é | ❌ Écrivez votre propre proxy.ts | ✅ Segment [locale] intégré |
| Pluralisation | ✅ Basée sur l'énumération | ✅ ICU, macro <Plural> | ✅ ICU |
| Formats de contenu | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Via format: "icu" | ✅ Natif | ✅ Natif |
| Aides SEO (hreflang, sitemap) | ✅ Aides pour métadonnées, sitemap et robots.txt | ❌ Manuel | ✅ Bon |
| Server Components | ✅ Accès direct dans tout Server Component | ⚠️ setI18n dans chaque layout et page | ⚠️ await getTranslations() par composant |
| Tree-shaking par composant | ✅ Au moment du build (Babel / SWC) | ⚠️ Un catalogue par locale, l'extracteur par page est expérimental | ⚠️ Manuel, avec pick() par route |
| Taille du runtime (gzip, benchmark) | 4.9 Ko | 72.1 Ko | 14.7 Ko |
| Traductions manquantes en CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Non intégré |
| Écosystème / communauté | ⚠️ Plus modeste, en forte croissance | ✅ Mature | ✅ Élevé |
Les tailles de runtime proviennent du benchmark Next.js. Pour une analyse détaillée, lisez Lingui vs Intlayer.
Autres guides Next.js : next-intl, next-i18next et Intlayer.
Pratiques à suivre
- Définissez
langetdirsur<html>dans le layout[locale]. - Privilégiez les Server Components pour le texte : ils effectuent le rendu HTML sur le serveur et n'ont pas besoin du catalogue côté client.
- Appelez
initLingui(locale)dans chaque layout et page. Les layouts ne se réaffichent pas lors de la navigation, une page ne peut donc pas se reposer sur le fait que son layout ait défini la locale. - Conservez une URL par locale et pré-rendez chaque locale avec
generateStaticParams. - Traduisez vos métadonnées dans
generateMetadata, aveccanonical,hreflangetx-default. - Générez un sitemap multilingue et un robots.txt avec les conventions
sitemap.tsetrobots.ts. - Utilisez de vrais liens pour le sélecteur de langue, afin que les robots d'indexation découvrent chaque langue.
- Exécutez
lingui extracten CI pour qu'aucun nouveau message ne soit déployé sans traduction.
Consultez notre guide sur l'internationalisation et le SEO, le guide hreflang et la comparaison SEO multilingue Next.js.
Guide pas à pas pour configurer Lingui dans une application Next.js
Voici la structure de projet que nous allons créer :
Copier le code dans le presse-papiers
Installer les dépendances
bashCopier le codeCopier le code dans le presse-papiers
- @lingui/core / @lingui/react : runtime,
I18nProvider,setI18npour les Server Components, et les macros (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin : compile les macros dans le pipeline SWC de Next.js.
- @lingui/loader : compile les catalogues
.poà l'importation, de sorte quelingui compilen'est pas nécessaire. - @lingui/cli :
lingui extractpour rassembler les messages dans les catalogues.
@lingui/swc-pluginest un plugin WebAssembly lié à la version SWC de Next.js. Si le build échoue après une mise à niveau de Next.js, mettez à jour le plugin vers la version indiquée comme compatible dans son README.- @lingui/core / @lingui/react : runtime,
Centraliser votre configuration de locales
Un fichier unique définit les locales et les helpers d'URL. Le routage, les métadonnées, le sitemap et Lingui lisent tous depuis celui-ci.
src/i18n/config.tsCopier le codeCopier le code dans le presse-papiers
Configurer Lingui et Next.js
lingui.config.tsCopier le codeCopier le code dans le presse-papiers
Le plugin SWC compile les macros, et le chargeur compile les fichiers
.po, à la fois pour Turbopack (par défaut dans Next.js 16) et webpack :next.config.tsCopier le codeCopier le code dans le presse-papiers
Ajoutez les scripts d'extraction :
package.jsonCopier le codeCopier le code dans le presse-papiers
Charger les catalogues et créer les instances serveur
Les Server Components n'ont pas de contexte React, Lingui fournit donc
setI18npour enregistrer l'instance pour le rendu en cours. Ce module charge chaque catalogue une fois par processus serveur et crée une instanceI18npar locale. Il estserver-only: les catalogues des autres locales n'atteignent jamais le bundle client.src/i18n/appRouterI18n.tsCopier le codeCopier le code dans le presse-papiers
src/i18n/initLingui.tsCopier le codeCopier le code dans le presse-papiers
Pour que TypeScript accepte l'importation
.po, déclarez le module une fois :src/i18n/po.d.tsCopier le codeCopier le code dans le presse-papiers
Créer le provider client
Les Client Components lisent les traductions depuis un contexte React. Le provider reçoit le catalogue de la locale active depuis le layout serveur, et crée sa propre instance une seule fois.
src/components/LinguiClientProvider.tsxCopier le codeCopier le code dans le presse-papiers
Définir les routes de locale dynamiques
Le segment
[locale]contient le layout racine.generateStaticParamspré-rend chaque locale au moment du build, etdynamicParams = falserenvoie une 404 pour tout autre préfixe.src/app/[locale]/layout.tsxCopier le codeCopier le code dans le presse-papiers
Le provider client reçoit l'intégralité du catalogue de la locale active. C'est ce que le benchmark mesure sous l'appellation « fuite autre page ». Conserver le texte dans les Server Components limite ce dont le client a réellement besoin. Pour les grandes applications, l'extracteur par page expérimental de Lingui (
experimental.extractordanslingui.config.ts) découpe les catalogues par point d'entrée.Utiliser les traductions dans les Server Components
Les Server Components utilisent les mêmes macros que les Client Components.
initLinguidoit également s'exécuter dans la page, car un layout ne se réaffiche pas lors de la navigation entre ses pages.src/app/[locale]/about/page.tsxCopier le codeCopier le code dans le presse-papiers
Utiliser les traductions dans les Client Components
Les Client Components utilisent les mêmes imports. Les macros lisent l'instance depuis
LinguiClientProvider.src/components/Counter.tsxCopier le codeCopier le code dans le presse-papiers
Extraire et traduire vos messages
Lancez l'extraction. Lingui écrit chaque message trouvé dans
srcdans le catalogue de chaque locale :bashCopier le codeCopier le code dans le presse-papiers
Puis traduisez le
msgstrde chaque entrée :src/locales/fr/messages.poCopier le codeCopier le code dans le presse-papiers
src/locales/es/messages.poCopier le codeCopier le code dans le presse-papiers
Les balises
<0>maintiennent les éléments JSX d'un<Trans>en place, permettant aux traducteurs de les déplacer sans toucher au balisage.Configurer le proxy pour le routage par locale
FacultatifNext.js 16 a renommé
middleware.tsenproxy.ts. Le proxy implémente la stratégie de préfixe « selon le besoin » :/fr/aboutest servi tel quel ;/en/aboutredirige vers/about, afin que la locale par défaut ait une URL unique ;/aboutest réécrit en interne vers/en/about, sans modifier l'URL ;- une première visite sur
/redirige vers la langue préférée (cookie d'abord, puisAccept-Language).
src/i18n/negotiateLocale.tsCopier le codeCopier le code dans le presse-papiers
src/proxy.tsCopier le codeCopier le code dans le presse-papiers
Changer la langue de votre contenu
FacultatifusePathnamerenvoie l'URL vue par le navigateur (/aboutou/fr/about). Supprimez la locale, puis construisez le lien de chaque langue. Le sélecteur affiche de vrais liens afin que les robots puissent atteindre chaque version linguistique, et le cookie mémorise le choix explicite.src/components/LocaleSwitcher.tsxCopier le codeCopier le code dans le presse-papiers
Créer un composant de lien localisé
Facultatifsrc/components/LocalizedLink.tsxCopier le codeCopier le code dans le presse-papiers
Il fonctionne également depuis les Server Components, car il effectue son rendu à l'intérieur de
LinguiClientProvider:tsxCopier le codeCopier le code dans le presse-papiers
Internationaliser vos métadonnées
FacultatifChaque version linguistique peut se positionner de manière autonome, à condition que chaque page expose :
- un
titleet unedescriptiontraduits ; - une URL canonical pointant vers elle-même ;
- un alternatif
hreflangpar locale, ainsi quex-default; - la
locale, l'alternateLocaleet l'urlOpen Graph ; - du JSON-LD avec
inLanguage.
generateMetadatas'exécute en dehors de l'arbre React, il utilise donc directement l'instance serveur avec la macromsg:src/i18n/metadata.tsCopier le codeCopier le code dans le presse-papiers
src/app/[locale]/about/page.tsxCopier le codeCopier le code dans le presse-papiers
Le JSON-LD est rendu par la page elle-même. Les fichiers de page ne pouvant exporter que des champs Next.js, conservez le composant dans son propre fichier :
src/components/WebPageJsonLd.tsxCopier le codeCopier le code dans le presse-papiers
src/app/[locale]/about/page.tsxCopier le codeCopier le code dans le presse-papiers
- un
Internationaliser votre sitemap
FacultatifLa convention
sitemap.tsprend en chargealternates.languages, que Next.js affiche sous forme d'alternativesxhtml:link. Listez chaque URL de chaque locale :src/app/sitemap.tsCopier le codeCopier le code dans le presse-papiers
Internationaliser votre robots.txt
FacultatifLes routes privées existent dans chaque langue,
disallowdoit donc couvrir chaque chemin localisé :src/app/robots.tsCopier le codeCopier le code dans le presse-papiers
Gérer les pages 404 localisées
Facultatifnot-found.tsxs'affiche à l'intérieur du layout[locale], il a donc accès au provider client. La route fourre-tout lui transmet les chemins inconnus à l'intérieur d'une locale. Next.js ajoute automatiquementnoindexaux réponses 404.src/app/[locale]/not-found.tsxCopier le codeCopier le code dans le presse-papiers
src/app/[locale]/[...rest]/page.tsxCopier le codeCopier le code dans le presse-papiers
Accéder à la locale dans les Server Actions
FacultatifLes Server Actions ne reçoivent pas les paramètres de route. L'approche la plus fiable consiste à transmettre la locale avec le formulaire, depuis la page qui la connaît :
src/app/[locale]/contact/page.tsxCopier le codeCopier le code dans le presse-papiers
src/app/actions/sendContactMessage.tsCopier le codeCopier le code dans le presse-papiers
Conserver vos macros, réduire le runtime avec Intlayer
FacultatifL'adaptateur de compatibilité
@intlayer/linguiconserve votre code source intact : les macros se compilent comme auparavant, et les appels résultants ài18n._(),useLingui()et<Trans>sont alimentés par les dictionnaires Intlayer. Dans le benchmark Next.js, le runtime passe de ~72,1 Ko à ~10,7 Ko gzip.Sur Next.js, l'adaptateur se configure en créant des alias de
@lingui/coreet@lingui/reactvers@intlayer/linguidansnext.config.ts(webpack et Turbopack), et en enveloppant la configuration avecwithIntlayerdenext-intlayer/server. Conservez@lingui/swc-pluginpour que les macros continuent de se compiler en premier. La configuration complète se trouve dans le guide de compatibilité Lingui.Comme le montre le tableau du benchmark, l'adaptateur réduit la taille du runtime mais pas encore le catalogue envoyé à chaque page sur Next.js. Il est particulièrement recommandé comme passerelle de migration : une fois configuré, migrez vos composants progressivement vers l'API native
useIntlayer, qui n'envoie que le contenu que chaque composant affiche. Consultez le guide Next.js + Intlayer, Lingui vs @intlayer/lingui et tous les adaptateurs de compatibilité.Automatiser vos traductions avec Intlayer
FacultatifLingui extrait les messages, mais renseigner des dizaines de catalogues manuellement représente la majeure partie du travail. Intlayer est gratuit et open source, et ses outils fonctionnent en complément de Lingui :
- Traduire avec l'IA en utilisant votre propre clé API et fournisseur. Consultez auto fill et le CLI.
- Conserver vos fichiers PO comme source de vérité avec le plugin sync PO.
- Tester les traductions manquantes en CI. Consultez tester vos traductions.
- Auditer votre site déployé pour détecter les
hreflangmanquants, les mauvaises balises canoniques et les fuites de locale avec la commande scan.
Foire aux questions
Oui. @lingui/react prend en charge les React Server Components. Les Server Components enregistrent l'instance avec setI18n de @lingui/react/server, les Client Components la lisent depuis I18nProvider, et les deux utilisent les mêmes macros Trans et useLingui.
Les Server Components n'ont pas de contexte, l'instance est donc enregistrée par rendu. Les layouts sont conservés lors des navigations et ne se réaffichent pas, une page ne peut donc pas compter sur son layout pour définir la locale. Appeler initLingui(locale) en haut de chaque layout et page les maintient indépendants.
Utilisez @lingui/swc-plugin. Il préserve le pipeline SWC et Turbopack. Ajouter une configuration Babel désactive SWC dans Next.js et ralentit les builds. La seule contrainte est de maintenir la version du plugin compatible avec la version SWC de votre version de Next.js.
Récupérez l'instance serveur avec getI18nInstance(locale) et traduisez les descripteurs déclarés avec la macro msg : i18n._(msg`About us`). Renvoyez alternates.canonical, alternates.languages avec x-default, et openGraph.locale. L'étape 13 fournit un helper réutilisable.
Le benchmark mesure environ 72 Ko gzip pour le runtime. Avec un catalogue par locale, les pages pèsent environ 145 Ko contre 141 Ko sans i18n, mais chaque page reçoit tout de même les messages des autres pages via le provider client.
Lingui convient aux équipes qui aiment écrire le texte source dans les composants et travailler avec des fichiers PO et des traducteurs. next-intl convient aux équipes qui préfèrent les catalogues JSON et une API t("key") étroitement intégrée à Next.js. next-i18next apporte l'écosystème de plugins i18next. Consultez next-i18next vs next-intl vs Intlayer et le benchmark Next.js.
Commentaires
Aucun commentaire pour le moment. Soyez le premier à partager vos pensées.
