
Dans un monde de plus en plus connecté, créer des sites et des applications multilingues est essentiel pour atteindre un public mondial. Next.js, en tant que framework basé sur React, offre des outils puissants pour faciliter ce processus. Ce tutoriel va vous guider pas à pas pour structurer un projet multilingue en utilisant Next.js avec la bibliothèque next-intl.
Pourquoi Choisir Next.js pour un site Multilingue ?
Rendu côté serveur (SSR) : Améliore le référencement SEO en générant le contenu sur le serveur.
Génération statique (SSG) : La génération de pages statiques pour chaque langue offre des performances optimales et un SEO amélioré.
Gestion facile des routes : La gestion du routage le routage se fait de manière intuitive. Vous pouvez créer des chemins spécifiques pour chaque langue, ce qui améliore l’expérience utilisateur et le SEO.
Prérequis
Avant de commencer, vous devez avoir Node.js et npm installés sur votre machine. Vous pouvez les télécharger depuis nodejs.org.
Étape 1 : Créer un projet Next.js
Créez le projet en utilisant Next.js :
npx create-next-app@latest multilingual
Lors de la configuration, choisissez d’installer Tailwind CSS pour une gestion flexible des styles.
Accédez au dossier du projet
cd multilingual
Démarrez le serveur de développement pour vous assurer que tout fonctionne correctement
npm run dev
Cela démarre votre application sur http://localhost:3000.
Étape 2 : Installer les dépendances nécessaires
Installez Next-intl pour gérer l’internationalisation :
npm install next-intl
Étape 3 : Structurer les Fichiers pour l’Internationalisation
Créez la structure de fichiers suivante :
├── messages
│ ├── en.json
│ └── fr.json
├── next.config.mjs
└── src
├── i18n
│ ├── routing.js
│ └── request.js
├── middleware.js
└── app
└── [locale]
├── layout.js
└── page.js
[locale] : Ce dossier dynamique représentera les langues (comme en pour l’anglais, fr pour le français, etc.).
messages : Ce dossier contient les fichiers de traduction pour chaque langue, comme en.json pour l’anglais et fr.json pour le français.
Étape 4 : Configurer les traductions
Voici un exemple de fichier en.json dans le dossier messages:
{
"HomePage": {
"title": "Welcome to My Site",
"subtitle": "We create amazing things!",
"website":"My Website"
}
}
Et le fichier fr.json correspondant :
{
"HomePage": {
"title": "Bienvenue sur mon site",
"subtitle": "Nous créons des choses incroyables!",
"website":"Mon Site"
}
}
Étape 5 : Configurer next.config.mjs pour l’Internationalisation
Ajoutez la configuration suivante dans next.config.mjs pour intégrer next-intl
import createNextIntlPlugin from 'next-intl/plugin';
/** @type {import('next').NextConfig} */
const nextConfig = {};
const withNextIntl = createNextIntlPlugin();
export default withNextIntl(nextConfig);
Étape 6 : Configurer le Routage
Dans src/i18n/routing.js configurez la navigation en ajoutant les langues supportées :
import { defineRouting } from 'next-intl/routing';
import { createNavigation } from 'next-intl/navigation';
export const routing = defineRouting({
locales: ['en', 'fr'],
defaultLocale: 'en',
});
export const { Link, redirect, usePathname, useRouter } =
createNavigation(routing);
Étape 7 : Configurer le Middleware
Dans src/middleware.js, configurez le middleware pour gérer les redirections en fonction de la langue :
import createMiddleware from 'next-intl/middleware';
import { routing } from './i18n/routing';
export default createMiddleware(routing);
export const config = {
matcher: ['/', '/(fr|en)/:path*'],
};
Étape 8 : Configurer les Requêtes Côté Serveur
Créez src/i18n/request.js :
import { getRequestConfig } from 'next-intl/server';
import { routing } from './routing';
export default getRequestConfig(async ({ requestLocale }) => {
let locale = await requestLocale;
if (!locale || !routing.locales.includes(locale)) {
locale = routing.defaultLocale;
}
return {
locale,
messages: (await import(`../../messages/${locale}.json`)).default,
};
});
Étape 9 : Ajouter un Composant Navbar
Ajoutez un composant Navbar et un Sélecteur de langue pour permettre à l’utilisateur de changer la langue de l’application :
'use client';
import React, { useState, useEffect } from 'react';
import { Link } from '@/i18n/routing';
import { usePathname } from '@/i18n/routing';
import { useTranslations } from 'next-intl';
import { useRouter } from 'next/navigation';
const Navbar = ({ locale }) => {
const pathname = usePathname();
const router = useRouter();
const t = useTranslations('HomePage');
const [selectedLocale, setSelectedLocale] = useState(() => {
if (typeof window !== "undefined") {
return localStorage.getItem('locale') || locale;
}
return locale;
});
useEffect(() => {
setSelectedLocale(locale);
}, [locale]);
const handleLanguageChange = (event) => {
const newLocale = event.target.value;
setSelectedLocale(newLocale);
localStorage.setItem('locale', newLocale);
router.push(`/${newLocale}${pathname}`);
};
return (
<nav className="flex justify-between items-center p-4 bg-white shadow-md">
<Link href="/" className="text-xl font-semibold">{t('website')}</Link>
<select
onChange={handleLanguageChange}
value={selectedLocale}
className="p-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="en">🇬🇧 English</option>
<option value="fr">🇫🇷 Français</option>
</select>
</nav>
);
};
export default Navbar;
Étape 10 : Ajouter un Composant Hero
Ajoutez un composant Hero dans src/components/Hero.js. Pour afficher les textes traduits , importez la fonction useTranslations depuis le module next-intl en utilisant : import { useTranslations } from ‘next-intl’;. Ensuite, vous pouvez récupérer les traductions en appelant const t = useTranslations(‘NomDesTrad’); où NomDesTrad fait référence à la clé du groupe de traductions défini dans votre fichier de traductions JSON que nous avons vu tout à l’heure. Par exemple, pour obtenir le titre de la page home, vous recuperez de useTranslations(‘HomePage’); et vous utilisez t(‘title’) pour afficher « accueil » en français et « home » en anglais.
// src/components/Hero.js
'use client';
import { useTranslations } from 'next-intl';
export default function Hero() {
const t = useTranslations('HomePage');
return (
<section className="relative bg-blue-600 text-white h-96 flex flex-col justify-center items-center text-center">
<h1 className="text-4xl font-bold mb-4">{t('title')}</h1>
<p className="text-xl">{t('subtitle')}</p>
</section>
);
}
Étape 11 : Configurer le Layout
Dans src/app/[locale]/layout.js configurez le layout pour supporter l’internationalisation et faire passer la locale au Navbar. GenerateStaticParams() permet de créer automatiquement des versions statiques de vos pages pour chaque langue, améliorant ainsi la vitesse de chargement et le référencement SEO.
// src/app/[locale]/layout.js
import { NextIntlClientProvider } from 'next-intl';
import { getMessages } from 'next-intl/server';
import { notFound } from 'next/navigation';
import { routing } from '@/i18n/routing';
import { setRequestLocale } from 'next-intl/server';
import Navbar from '@/components/Navbar';
import "../globals.css";
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}
export default async function LocaleLayout({ children, params }) {
const { locale } = await params;
if (!routing.locales.includes(locale)) {
notFound();
}
setRequestLocale(locale);
const messages = await getMessages();
return (
<html lang={locale}>
<body>
<NextIntlClientProvider messages={messages}>
<Navbar locale={locale} />
{children}
</NextIntlClientProvider>
</body>
</html>
);
}
Étape 12 :
Dans src/app/[locale] /page.js utilisez le composant Hero:
// src/app/[locale]/page.js
import Hero from '@/components/Hero';
export default function HomePage() {
return (
<div>
<Hero />
</div>
);
}


Conclusion
Félicitations ! Vous avez maintenant un site Next.js multilingue fonctionnel, utilisant next-intl pour gérer la traduction et l’internationalisation. Vous pouvez facilement ajouter plus de langues, de pages et de composants au fur et à mesure de vos besoins. Le code source de ce projet est disponible sur mon GitHub : next-i18n-starter.