Création d'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, comme /en/products/123, et souhaite consulter la même page dans une autre langue. Cliquer sur un sélecteur de langue (par exemple, 'Français') l'envoie souvent vers la page d'accueil (/fr/) au lieu de la page produit correspondante, interrompant ainsi son flux de travail et l'obligeant à naviguer à nouveau.

Solution

Créer un composant client qui lit le chemin 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éfinir 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éer le composant de sélection de langue

Créez un nouveau fichier, par exemple, app/components/LanguageSwitcher.tsx. Ce doit être 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();

  // Cette fonction définit le cookie
  const setLocaleCookie = (locale: string) => {
    document.cookie = `${localeCookieName}=${locale}; path=/; max-age=31536000; samesite=lax`;
  };

  // Cette fonction supprime la locale actuelle du chemin
  const getRedirectedPath = (locale: string) => {
    if (!pathname) return '/';
    const segments = pathname.split('/');
    segments[1] = locale; // La locale est toujours le premier 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 mise en page

Importez et placez votre nouveau composant dans le fichier de mise en page 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() {
  // Ceci indique à Next.js de pré-rendre 'en', 'es', et '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>
          {/* Ajoutez le sélecteur à votre en-tête ou navigation */}
          <LanguageSwitcher />
        </header>
        <main>{children}</main>
      </body>
    </html>
  );
}

Maintenant, lorsqu'un utilisateur est 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'.