Créer un sélecteur de langue
Permettre aux utilisateurs de changer de langue sur n'importe quelle page
Problème
Un utilisateur se trouve sur une page spécifique, telle que /en/products/123, et souhaite consulter la même page dans une autre langue. En cliquant sur un sélecteur de langue (par exemple, « Français »), il est souvent redirigé vers la page d'accueil (/fr/) au lieu de la page produit correspondante, ce qui interrompt son parcours et l'oblige à naviguer à nouveau.
Solution
Créez un composant client qui lit le chemin d'URL actuel. Il génère une liste de liens pour toutes les autres langues prises en charge en remplaçant le segment de langue actuel dans le chemin. Il définit également un cookie de préférence lors du clic, garantissant que le choix est mémorisé pour les visites futures.
Étapes
1. Définissez votre configuration de langue
Assurez-vous que votre fichier i18n.config.ts inclut la liste des locales et le nom du cookie que vous utiliserez.
// i18n.config.ts
export const locales = ['en', 'es', 'fr'];
export const defaultLocale = 'en';
export const localeCookieName = 'NEXT_LOCALE';
2. Créez le composant de sélecteur de langue
Créez un nouveau fichier, par exemple, app/components/LanguageSwitcher.tsx. Il doit s'agir d'un composant client pour utiliser des hooks comme usePathname.
// app/components/LanguageSwitcher.tsx
'use client';
import { usePathname } from 'next/navigation';
import Link from 'next/link';
import { locales, localeCookieName } from '@/i18n.config';
export default function LanguageSwitcher() {
const pathname = usePathname();
// This function sets the cookie
const setLocaleCookie = (locale: string) => {
document.cookie = `${localeCookieName}=${locale}; path=/; max-age=31536000; samesite=lax`;
};
// This function strips the current locale from the path
const getRedirectedPath = (locale: string) => {
if (!pathname) return '/';
const segments = pathname.split('/');
segments[1] = locale; // The locale is always the first segment
return segments.join('/');
};
return (
<div>
{locales.map((locale) => (
<Link
key={locale}
href={getRedirectedPath(locale)}
onClick={() => setLocaleCookie(locale)}
style={{
display: 'inline-block',
padding: '0.5rem',
textDecoration: 'underline',
}}
>
{locale.toUpperCase()}
</Link>
))}
</div>
);
}
3. Ajoutez le sélecteur à votre layout
Importez et placez votre nouveau composant dans le fichier de layout racine, app/[lang]/layout.tsx. Cela le rend visible sur toutes les pages.
// app/[lang]/layout.tsx
import LanguageSwitcher from '@/app/components/LanguageSwitcher';
export async function generateStaticParams() {
// This tells Next.js to pre-render 'en', 'es', and 'fr'
return [{ lang: 'en' }, { lang: 'es' }, { lang: 'fr' }];
}
export default function RootLayout({
children,
params,
}: {
children: React.ReactNode;
params: { lang: string };
}) {
return (
<html lang={params.lang}>
<body>
<header>
{/* Add the switcher to your header or nav */}
<LanguageSwitcher />
</header>
<main>{children}</main>
</body>
</html>
);
}
Désormais, lorsqu'un utilisateur se trouve sur /es/products/123 et clique sur « EN », le composant calcule le nouveau chemin comme /en/products/123 et définit le cookie NEXT_LOCALE sur « en ».