Posez votre question et obtenez un résumé du document en referencant cette page et le Provider AI de votre choix
Ce document n'est pas à jour, la version de base a été mise à jour le 22 août 2026.
Aller à la doc anglaiseHistorique des versions
- "Mettre à jour l'utilisation de l'API useIntlayer de Solid pour un accès direct aux propriétés"v8.9.004/05/2026
- "Ajouter la commande init"v7.5.930/12/2025
- "Historique initial"v5.5.1029/06/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
Traduisez votre site web Next.js 15 avec Intlayer | Internationalization (i18n)
Table des matières
Pourquoi Intlayer plutôt que des alternatives ?
Par rapport aux solutions principales telles que next-intl ou i18next, Intlayer est une solution dotée d'optimisations intégrées telles que :
Intlayer est optimisé pour fonctionner avec les composants serveur pour un rendu efficace et est entièrement compatible avec Turbopack. Il ne bloque pas le rendu statique et propose un middleware ainsi que toutes les fonctionnalités nécessaires à l'internationalisation à l'échelle (i18n).
Intlayer est compatible avec Next.js 12, 13, 14, 15 et 16. Si vous utilisez le routeur de pages Next.js, vous pouvez vous référer à ce guide. Le routage local est utile pour le référencement, la taille du bundle et les performances. Si vous n'en avez pas besoin, vous pouvez vous référer à ce guide. Pour Next.js 12, 13, 14 et 15 avec App Router, reportez-vous à ce guide.
Au lieu de charger de lourds fichiers JSON dans vos pages, ne chargez que le contenu strictement nécessaire. Intlayer vous aide à réduire la taille de votre bundle et de vos pages jusqu'à 50 %.
Déclarer le contenu directement au plus près de vos composants facilite la maintenance des applications de grande envergure. Vous pouvez dupliquer ou supprimer le dossier d'une fonctionnalité sans le fardeau mental de devoir passer en revue toute votre base de code de contenu. De plus, Intlayer est entièrement typé pour garantir l'exactitude de vos traductions.
La colocalisation du contenu réduit le contexte nécessaire aux grands modèles de langage (LLM). Intlayer est également livré avec une suite d'outils, tels qu'une CLI pour vérifier les traductions manquantes, un LSP, un MCP et des agent skills, afin de rendre l'expérience développeur (DX) encore plus fluide pour les agents IA.
Automatisez les traductions dans votre pipeline CI/CD en utilisant le LLM de votre choix au coût de votre propre fournisseur d'IA. Intlayer propose également un compilateur pour automatiser l'extraction de contenu, ainsi qu'une plateforme web pour vous aider à traduire en arrière-plan.
Associer de gros fichiers JSON à vos composants peut ralentir les performances et impacter la réactivité. Intlayer optimise le chargement du contenu directement au moment du build.
Bien plus qu'une simple solution i18n, Intlayer propose un éditeur visuel auto-hébergé et un CMS complet pour gérer votre contenu multilingue en temps réel. Cela rend la collaboration avec les traducteurs, concepteurs-rédacteurs et autres membres de l'équipe extrêmement simple. Le contenu peut être stocké localement et/ou à distance.
Guide étape par étape pour configurer Intlayer dans une application Next.js
Voir le Modèle d'Application sur GitHub.
Installer les dépendances
Installez les paquets nécessaires avec npm :
bashCopier le codeCopier le code dans le presse-papiers
l'indicateur
--interactiveest facultatif. Utilisezintlayer-cli initsi vous êtes un agent IA.Cette commande détectera votre environnement et installera les packages requis. Par exemple :
bashCopier le codeCopier le code dans le presse-papiers
intlayer
Le package principal qui fournit des outils d'internationalisation pour la gestion de la configuration, la traduction, la déclaration de contenu, la transpilation, et les commandes CLI.
next-intlayer
Le package qui intègre Intlayer avec Next.js. Il fournit des fournisseurs de contexte et des hooks pour l'internationalisation dans Next.js. De plus, il inclut le plugin Next.js pour intégrer Intlayer avec Webpack ou Turbopack, ainsi qu'un middleware pour détecter la langue préférée de l'utilisateur, gérer les cookies et gérer la redirection des URL.
Configurez votre projet
Here is the final structure that we will make:
bashCopier le codeCopier le code dans le presse-papiers
If you don't want locale routing, intlayer can be used as a simple provider / hook. See this guide for more details.
Créez un fichier de configuration pour configurer les langues de votre application :
intlayer.config.tsCopier le codeCopier le code dans le presse-papiers
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Vos autres locales ], defaultLocale: Locales.ENGLISH, }, }; export default config;Grâce à ce fichier de configuration, vous pouvez configurer des URLs localisées, la redirection via middleware, les noms de cookies, l'emplacement et l'extension de vos déclarations de contenu, désactiver les logs Intlayer dans la console, et plus encore. Pour une liste complète des paramètres disponibles, référez-vous à la documentation de configuration.
Intégrer Intlayer dans votre configuration Next.js
Configurez votre setup Next.js pour utiliser Intlayer :
next.config.tsCopier le codeCopier le code dans le presse-papiers
import type { NextConfig } from "next"; import { withIntlayer } from "next-intlayer/server"; const nextConfig: NextConfig = {/* options de configuration ici */}; export default withIntlayer(nextConfig);Le plugin Next.js
withIntlayer()est utilisé pour intégrer Intlayer avec Next.js. Il assure la construction des fichiers de déclaration de contenu et les surveille en mode développement. Il définit les variables d'environnement Intlayer dans les environnements Webpack ou Turbopack. De plus, il fournit des alias pour optimiser les performances et garantit la compatibilité avec les composants serveur.La fonction
withIntlayer()est une fonction promise. Elle permet de préparer les dictionnaires intlayer avant le démarrage de la build. Si vous voulez l'utiliser avec d'autres plugins, vous pouvez l'attendre. Exemple :tsxCopier le codeCopier le code dans le presse-papiers
Si vous voulez l'utiliser de manière synchrone, vous pouvez utiliser la fonction
withIntlayerSync(). Exemple :tsxCopier le codeCopier le code dans le presse-papiers
Définir les routes dynamiques de locale
Supprimez tout dans
RootLayoutet remplacez-le par le code suivant :src/app/layout.tsxCopier le codeCopier le code dans le presse-papiers
import type { PropsWithChildren, FC } from "react"; import "./globals.css"; const RootLayout: FC<PropsWithChildren> = ({ children }) => children; export default RootLayout;Garder le composant
RootLayoutvide permet de définir les attributslangetdirsur la balise<html>.Pour implémenter le routage dynamique, fournissez le chemin pour la locale en ajoutant un nouveau layout dans votre répertoire
[locale]:src/app/[locale]/layout.tsxCopier le codeCopier le code dans le presse-papiers
import { type NextLayoutIntlayer } from "next-intlayer"; import { IntlayerProvider } from "next-intlayer/server"; import { Inter } from "next/font/google"; import { getHTMLTextDir } from "intlayer"; const inter = Inter({ subsets: ["latin"] }); const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { const { locale } = await params; return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body className={inter.className}> <IntlayerProvider locale={locale}>{children}</IntlayerProvider> </body> </html> ); }; export default LocaleLayout;A single
IntlayerProvidercovers both halves of the tree: it seeds the request-scoped server context read by the server hooks, and mounts the client provider so client components receive the same locale.src/app/[locale]/layout.tsxCopier le codeCopier le code dans le presse-papiers
import { type NextLayoutIntlayer, IntlayerClientProvider } from "next-intlayer"; import { Inter } from "next/font/google"; import { getHTMLTextDir } from "intlayer"; const inter = Inter({ subsets: ["latin"] }); const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { const { locale } = await params; return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body className={inter.className}> <IntlayerClientProvider locale={locale}> {children} </IntlayerClientProvider> </body> </html> ); }; export default LocaleLayout;Le segment de chemin
[locale]est utilisé pour définir la locale. Exemple :/en-US/aboutfera référence àen-USet/fr/aboutàfr.À ce stade, vous rencontrerez l'erreur :
Error: Missing <html> and <body> tags in the root layout.. Cela est attendu car le fichier/app/page.tsxn'est plus utilisé et peut être supprimé. À la place, le segment de chemin[locale]activera la page/app/[locale]/page.tsx. Par conséquent, les pages seront accessibles via des chemins comme/en,/fr,/esdans votre navigateur. Pour définir la locale par défaut comme page racine, référez-vous à la configuration dumiddlewareà l'étape 7.Ensuite, implémentez la fonction
generateStaticParamsdans le Layout de votre application.src/app/[locale]/layout.tsxCopier le codeCopier le code dans le presse-papiers
export { generateStaticParams } from "next-intlayer"; // Ligne à insérer const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { /*... Reste du code */ }; export default LocaleLayout;generateStaticParamsgarantit que votre application préconstruit les pages nécessaires pour toutes les locales, réduisant ainsi le calcul à l'exécution et améliorant l'expérience utilisateur. Pour plus de détails, consultez la documentation Next.js sur generateStaticParams.Intlayer fonctionne avec
export const dynamic = 'force-static';pour assurer que les pages sont pré-construites pour toutes les locales.Déclarez Votre Contenu
Créez et gérez vos déclarations de contenu pour stocker les traductions :
src/app/[locale]/page.content.tsCopier le codeCopier le code dans le presse-papiers
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ fr: "Commencez par éditer", en: "Get started by editing", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;Vos déclarations de contenu peuvent être définies n'importe où dans votre application dès qu'elles sont incluses dans le répertoire
contentDir(par défaut,./src). Et correspondent à l'extension de fichier de déclaration de contenu (par défaut,.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Pour plus de détails, référez-vous à la documentation sur la déclaration de contenu.
Utiliser le contenu dans votre code
Accédez à vos dictionnaires de contenu dans toute votre application :
src/app/[locale]/page.tsxCopier le codeCopier le code dans le presse-papiers
import type { FC } from "react"; import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type NextPageIntlayer, useIntlayer } from "next-intlayer"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPageIntlayer = () => ( <> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </> ); export default Page;IntlayerProviderest monté une fois, dans la mise en page des locales. Il fournit la locale aux composants serveur et client, de sorte que les pages ne s'enveloppent plus elles-mêmes.- Les hooks serveur résolvent la locale dans cet ordre : la locale passée au site d'appel, puis le contexte serveur amorcé par le fournisseur, puis la locale portée par la requête (l'en-tête
x-intlayer-localedéfini par le proxy Intlayer, puis le cookie de locale). Cette dernière étape est ce qui maintient le contenu correct lors d'une navigation côté client qui ne re-rend que le segment de page, où la mise en page — et avec elle le fournisseur — ne se réexécute pas.
src/app/[locale]/page.tsxCopier le codeCopier le code dans le presse-papiers
import type { FC } from "react"; import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type NextPageIntlayer } from "next-intlayer"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPageIntlayer = async ({ params }) => { const { locale } = await params; return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProviderest utilisé pour fournir la locale aux composants côté client. Il peut être placé dans n'importe quel composant parent, y compris le layout. Cependant, il est recommandé de le placer dans un layout car Next.js partage le code du layout entre les pages, ce qui le rend plus efficace. En utilisantIntlayerClientProviderdans le layout, vous évitez de le réinitialiser pour chaque page, améliorant ainsi les performances et maintenant un contexte de localisation cohérent dans toute votre application.IntlayerServerProviderest utilisé pour fournir la locale aux enfants côté serveur. Il ne peut pas être défini dans le layout.Le layout et la page ne peuvent pas partager un contexte serveur commun car le système de contexte serveur est basé sur un magasin de données par requête (via le mécanisme cache de React), ce qui fait que chaque "contexte" est recréé pour différents segments de l'application. Placer le provider dans un layout partagé casserait cette isolation, empêchant la bonne propagation des valeurs du contexte serveur à vos composants serveur.
La mise en page (layout) et la page ne peuvent pas partager un contexte serveur commun car le système de contexte serveur est basé sur un magasin de données par requête (via le mécanisme React's cache), ce qui entraîne la recréation de chaque "contexte" pour différents segments de l'application. Placer le provider dans une mise en page partagée briserait cette isolation, empêchant la bonne propagation des valeurs du contexte serveur à vos composants serveur.
src/components/ClientComponentExample.tsxCopier le codeCopier le code dans le presse-papiers
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // Crée la déclaration de contenu associée return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/ServerComponentExample.tsxCopier le codeCopier le code dans le presse-papiers
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Crée la déclaration de contenu associée return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };next-intlayerest le chemin d'import isomorphe : la condition d'exportreact-serverfournit aux composants serveur l'implémentation ambient-locale, tandis que les composants client obtiennent celle basée sur le contexte. Le même appel fonctionne des deux côtés.src/components/ServerComponentExample.tsxCopier le codeCopier le code dans le presse-papiers
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Créer la déclaration de contenu associée return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Si vous souhaitez utiliser votre contenu dans un attribut de type
string, tel quealt,title,href,aria-label, etc., vous devez appeler la valeur de la fonction, comme ceci :htmlCopier le codeCopier le code dans le presse-papiers
Pour en savoir plus sur le hook
useIntlayer, consultez la documentation.Configurer le Middleware pour la détection de la langue
FacultatifConfigurez un middleware pour détecter la langue préférée de l'utilisateur :
src/middleware.tsCopier le codeCopier le code dans le presse-papiers
export { intlayerMiddleware as middleware } from "next-intlayer/middleware"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };Le
intlayerMiddlewareest utilisé pour détecter la locale préférée de l'utilisateur et le rediriger vers l'URL appropriée comme spécifié dans la configuration. De plus, il permet de sauvegarder la locale préférée de l'utilisateur dans un cookie.Depuis Intlayer v9, ce middleware respecte l'option
routing.enableProxy(truepar défaut). Définissezrouting.enableProxy: falsedans votre configuration pour le transformer en pass-through sans supprimer ce fichier. Voir les notes de version v9.Si vous avez besoin de chaîner plusieurs middlewares ensemble (par exemple,
intlayerMiddlewareavec l'authentification ou des middlewares personnalisés), Intlayer fournit désormais un assistant appelémultipleMiddlewares.tsCopier le codeCopier le code dans le presse-papiers
Internationalisation de vos métadonnées
FacultatifDans le cas où vous souhaitez internationaliser vos métadonnées, telles que le titre de votre page, vous pouvez utiliser la fonction
generateMetadatafournie par Next.js. À l'intérieur, vous pouvez récupérer le contenu depuis la fonctiongetIntlayerpour traduire vos métadonnées.src/app/[locale]/metadata.content.tsCopier le codeCopier le code dans le presse-papiers
import { type Dictionary, t } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "page-metadata", content: { title: t({ fr: "Créer une application Next.js", en: "Create Next App", es: "Crear una aplicación Next.js", }), description: t({ fr: "Généré par create next app", en: "Generated by create next app", es: "Generado por create next app", }), }, } satisfies Dictionary<Metadata>; export default metadataContent;src/app/[locale]/layout.tsx or src/app/[locale]/page.tsxCopier le codeCopier le code dans le presse-papiers
import { getIntlayer, getMultilingualUrls } from "intlayer"; import type { Metadata } from "next"; import type { LocalPromiseParams } from "next-intlayer"; export const generateMetadata = async ({ params, }: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const metadata = getIntlayer("page-metadata", locale); /** * Génère un objet contenant toutes les URL pour chaque locale. * * Exemple : * ```ts * getMultilingualUrls('/about'); * * // Retourne * // { * // en: '/about', * // fr: '/fr/about', * // es: '/es/about', * // } * ``` */ const multilingualUrls = getMultilingualUrls("/"); const localizedUrl = multilingualUrls[locale as keyof typeof multilingualUrls]; return { ...metadata, alternates: { canonical: localizedUrl, languages: { ...multilingualUrls, "x-default": "/" }, }, openGraph: { url: localizedUrl, }, }; }; // ... Reste du codeNotez que la fonction
getIntlayerimportée depuisnext-intlayerretourne votre contenu encapsulé dans unIntlayerNode, permettant l'intégration avec l'éditeur visuel. En revanche, la fonctiongetIntlayerimportée depuisintlayerretourne votre contenu directement sans propriétés supplémentaires.En savoir plus sur l'optimisation des métadonnées dans la documentation officielle de Next.js.
Internationalisation de votre sitemap.xml et robots.txt
FacultatifPour internationaliser votre
sitemap.xmletrobots.txt, vous pouvez utiliser la fonctiongetMultilingualUrlsfournie par Intlayer. Cette fonction vous permet de générer des URLs multilingues pour votre sitemap.src/app/sitemap.tsCopier le codeCopier le code dans le presse-papiers
import { getMultilingualUrls } from "intlayer"; import type { MetadataRoute } from "next"; const sitemap = (): MetadataRoute.Sitemap => [ { url: "https://example.com", alternates: { languages: { ...getMultilingualUrls("https://example.com"), "x-default": "https://example.com", }, }, }, { url: "https://example.com/login", alternates: { languages: { ...getMultilingualUrls("https://example.com/login"), "x-default": "https://example.com/login", }, }, }, { url: "https://example.com/register", alternates: { languages: { ...getMultilingualUrls("https://example.com/register"), "x-default": "https://example.com/register", }, }, }, ]; export default sitemap;src/app/robots.tsCopier le codeCopier le code dans le presse-papiers
import type { MetadataRoute } from "next"; import { getMultilingualUrls } from "intlayer"; const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]); // Règles pour le fichier robots.txt const robots = (): MetadataRoute.Robots => ({ rules: { userAgent: "*", allow: ["/"], disallow: getAllMultilingualUrls(["/login", "/register"]), }, host: "https://example.com", sitemap: `https://example.com/sitemap.xml`, }); export default robots;En savoir plus sur l'optimisation du sitemap dans la documentation officielle de Next.js. En savoir plus sur l'optimisation du fichier robots.txt dans la documentation officielle de Next.js.
Changer la langue de votre contenu
FacultatifPour changer la langue de votre contenu dans Next.js, la méthode recommandée est d'utiliser le composant
Linkpour rediriger les utilisateurs vers la page localisée appropriée. Le composantLinkpermet le préchargement de la page, ce qui évite un rechargement complet.src/components/LocaleSwitcher.tsxCopier le codeCopier le code dans le presse-papiers
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "next-intlayer"; import Link from "next/link"; export const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <Link href={getLocalizedUrl(pathWithoutLocale, localeItem)} hrefLang={localeItem} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* Locale - par ex. FR */} {localeItem} </span> <span> {/* Langue dans sa propre locale - par ex. Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Langue dans la locale courante - par ex. Francés avec la locale courante définie sur Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Langue en anglais - par ex. French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </Link> ))} </div> </div> ); };Une autre façon est d'utiliser la fonction
setLocalefournie par le hookuseLocale. Cette fonction ne permettra pas le préchargement de la page et rechargera la page.Dans ce cas, sans redirection via
router.push, seul votre code côté serveur changera la locale du contenu.src/components/LocaleSwitcher.tsxCopier le codeCopier le code dans le presse-papiers
Références de la documentation :
Création d'un composant Link localisé
FacultatifPour garantir que la navigation de votre application respecte la langue courante, vous pouvez créer un composant
Linkpersonnalisé. Ce composant préfixe automatiquement les URL internes avec la langue actuelle. Par exemple, lorsqu'un utilisateur francophone clique sur un lien vers la page "À propos", il est redirigé vers/fr/aboutau lieu de/about.Ce comportement est utile pour plusieurs raisons :
- SEO et expérience utilisateur : Les URL localisées aident les moteurs de recherche à indexer correctement les pages spécifiques à une langue et fournissent aux utilisateurs du contenu dans leur langue préférée.
- Cohérence : En utilisant un lien localisé dans toute votre application, vous garantissez que la navigation reste dans la langue courante, évitant ainsi des changements de langue inattendus.
- Maintenabilité : Centraliser la logique de localisation dans un seul composant simplifie la gestion des URLs, rendant votre base de code plus facile à maintenir et à étendre au fur et à mesure que votre application grandit.
Voici l'implémentation d'un composant
Linklocalisé en TypeScript :src/components/Link.tsxCopier le codeCopier le code dans le presse-papiers
"use client"; import { getLocalizedUrl } from "intlayer"; import NextLink, { type LinkProps as NextLinkProps } from "next/link"; import { useLocale } from "next-intlayer"; import type { PropsWithChildren, FC } from "react"; /** * Fonction utilitaire pour vérifier si une URL donnée est externe. * Si l'URL commence par http:// ou https://, elle est considérée comme externe. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * Un composant Link personnalisé qui adapte l'attribut href en fonction de la locale actuelle. * Pour les liens internes, il utilise `getLocalizedUrl` pour préfixer l'URL avec la locale (par exemple, /fr/about). * Cela garantit que la navigation reste dans le même contexte de locale. */ export const Link: FC<PropsWithChildren<NextLinkProps>> = ({ href, children, ...props }) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // Si le lien est interne et qu'un href valide est fourni, obtenir l'URL localisée. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} {...props}> {children} </NextLink> ); };Comment ça fonctionne
- Détection des liens externes :
Détection des liens externes :
La fonction utilitairecheckIsExternalLinkdétermine si une URL est externe. Les liens externes restent inchangés car ils ne nécessitent pas de localisation.Récupération de la locale courante :
Le hookuseLocalefournit la locale actuelle (par exemple,frpour le français).Localisation de l'URL :
Pour les liens internes (c’est-à-dire non externes),getLocalizedUrlest utilisé pour préfixer automatiquement l’URL avec la locale courante. Cela signifie que si votre utilisateur est en français, passer/aboutcommehrefle transformera en/fr/about.Retour du lien :
Le composant retourne un élément<a>avec l’URL localisée, garantissant que la navigation est cohérente avec la locale.
En intégrant ce composant
Linkdans toute votre application, vous maintenez une expérience utilisateur cohérente et adaptée à la langue, tout en bénéficiant d'une meilleure optimisation SEO et d'une meilleure utilisabilité.Optimisez la taille de votre bundle
FacultatifSi vous avez besoin de la locale active à l'intérieur d'une Server Action (par exemple, pour localiser des e-mails ou exécuter une logique tenant compte de la locale), appelez
getLocaledepuisnext-intlayer/server:src/app/actions/getLocale.tsCopier le codeCopier le code dans le presse-papiers
La fonction
getLocalesuit une stratégie en cascade pour déterminer la locale de l'utilisateur :- D'abord, elle vérifie les en-têtes de la requête pour une valeur de locale qui aurait pu être définie par le middleware
- Si aucune locale n'est trouvée dans les en-têtes, elle cherche une locale stockée dans les cookies
- Si aucun cookie n'est trouvé, elle tente de détecter la langue préférée de l'utilisateur à partir de ses paramètres de navigateur
- En dernier recours, elle revient à la locale par défaut configurée de l'application
Cela garantit que la locale la plus appropriée est sélectionnée en fonction du contexte disponible.
Optimisez la taille de votre bundle
FacultatifLors de l'utilisation de
next-intlayer, les dictionnaires sont inclus par défaut dans le bundle de chaque page. Pour optimiser la taille du bundle, Intlayer propose un plugin SWC optionnel qui remplace intelligemment les appels àuseIntlayeren utilisant des macros. Cela garantit que les dictionnaires ne sont inclus que dans les bundles des pages qui les utilisent réellement.Pour activer cette optimisation, installez le package
@intlayer/swc. Une fois installé,next-intlayerdétectera automatiquement et utilisera le plugin :bashCopier le codeCopier le code dans le presse-papiers
Remarque : Cette optimisation est uniquement disponible pour Next.js 13 et versions supérieures.
Remarque : Ce paquet n'est pas installé par défaut car les plugins SWC sont encore expérimentaux sur Next.js. Cela pourrait changer à l'avenir.
Note : Si vous définissez l'option comme
importMode: 'dynamic'ouimportMode: 'fetch'(dans la configurationdictionary), cela dépendra de Suspense, donc vous devrez envelopper vos appelsuseIntlayerdans une limiteSuspense. Cela signifie que vous ne pourrez pas utiliseruseIntlayerdirectement au niveau supérieur de votre composant Page / Layout. </Step>
Surveiller les changements de dictionnaires sur Turbopack
Lorsque vous utilisez Turbopack comme serveur de développement avec la commande next dev --turbopack, les changements de dictionnaire ne seront pas automatiquement détectés par défaut.
Cette limitation se produit car Turbopack ne peut pas exécuter de plug-ins webpack en parallèle pour surveiller les changements dans vos fichiers de contenu. Pour contourner ce problème, vous devrez utiliser la commande intlayer watch pour exécuter simultanément le serveur de développement et le surveillant de build Intlayer.
Copier le code dans le presse-papiers
Configurer TypeScript
Intlayer utilise l'augmentation de module pour bénéficier de TypeScript et renforcer votre base de code.


Assurez-vous que votre configuration TypeScript inclut les types générés automatiquement.
Copier le code dans le presse-papiers
Configuration Git
Il est recommandé d'ignorer les fichiers générés par Intlayer. Cela vous permet d'éviter de les commettre dans votre dépôt Git.
Pour ce faire, vous pouvez ajouter les instructions suivantes dans votre fichier .gitignore :
Copier le code dans le presse-papiers
Extension VS Code
Pour améliorer votre expérience de développement avec Intlayer, vous pouvez installer l'extension officielle Intlayer pour VS Code.
Installer depuis le Marketplace VS Code
Cette extension offre :
- Autocomplétion pour les clés de traduction.
- Détection d'erreurs en temps réel pour les traductions manquantes.
- Aperçus en ligne du contenu traduit.
- Actions rapides pour créer et mettre à jour facilement les traductions.
Pour plus de détails sur l'utilisation de l'extension, consultez la documentation de l'extension VS Code Intlayer.
Aller plus loin
Pour aller plus loin, vous pouvez implémenter l'éditeur visuel ou externaliser votre contenu en utilisant le CMS.
