Next.js hreflang

Next.js hreflang: implement language alternatives in the App Router

A practical guide to locale routes, reciprocal hreflang links, translated metadata, and dynamic pages in a Next.js App Router application.

La réponse courte

Hreflang works when every language version has its own crawlable URL, identifies the complete language set, and links back to the other versions. In Next.js, generate those relationships with route-aware metadata instead of relying on browser language detection alone.

/ 01

Commencez par les URL

Offrir à chaque version linguistique un itinéraire stable

Utilisez une structure de routes telle que /fr/pricing ou /de/products/widget. La page doit être accessible directement, afficher la version dans la langue correspondante sur le serveur et rester valide lorsqu'un robot d'exploration la demande sans cookies de navigateur ni préférence Accept-Language.

  • Keep one canonical URL per language version.
  • Use stable slugs or a documented localized-slug strategy for dynamic pages.
  • Return a real 200 response for every published language route.
App Router route shape
app/
  [locale]/
    products/
      [slug]/
        page.js
        opengraph-image.js
    layout.js
    sitemap.js

// /fr/products/widget
// /de/products/widget
/ 02

Générer des métadonnées

Créer des relations linguistiques réciproques

Les métadonnées de Next.js prennent en charge un objet `alternates.languages`. Générez le même ensemble complet de langues à partir de chaque page de localisation afin que les versions anglaise, française et allemande pointent toutes entre elles.

  • Include the current page in its own language map.
  • Use fully qualified HTTPS URLs in production.
  • Keep language codes consistent with the locale values used by your application.
generateMetadata with Altified
import { headers } from "next/headers";
import { altified } from "@/lib/altified";

export async function generateMetadata() {
  const locale = (await headers()).get("x-altified-locale") || "en";

  return altified.translatedMetadata({
    locale,
    path: "/pricing",
    origin: "https://example.com",
    locales: ["en", "fr", "de"],
    title: "Pricing",
    description: "Plans for your product.",
  });
}
/ 03

Afficher le contenu

Faites correspondre la langue de la page à l'URL

Hreflang n'est pas un mécanisme de traduction. La page à l'adresse /fr/products/widget doit afficher le contenu, les métadonnées, la navigation, les données structurées et les valeurs dynamiques pertinentes en français. Déterminez la langue active avant que la réponse n'atteigne le navigateur.

  • Translate titles, descriptions, Open Graph fields, and visible headings together.
  • Forward the active locale to backend APIs.
  • Use source-language fallbacks while a translation is pending.
Forward the active locale
const response = await altifiedFetch(BACKEND_URL + path);

// The active Altified locale is forwarded to the backend.
const product = await response.json();
/ 04

Valider le cluster

Vérifiez les deux sens avant le lancement

Les moteurs de recherche peuvent ignorer les groupes de langues incomplets ou contradictoires. Testez chaque page publiée dans une langue, examinez son en-tête rendu et vérifiez que les liens sont réciproques et que chaque page possède une URL canonique.

  • English points to French, German, and English.
  • French points to English, German, and French.
  • Each canonical uses the same language as the page content.
  • Unpublished or incomplete locales are not advertised as live alternatives.

/ Liste de contrôle de production

Vérifiez l'expérience linguistique avant le lancement.

  • Every locale has a direct, crawlable URL.
  • Every language page returns translated content and metadata.
  • Hreflang links are reciprocal.
  • Canonicals are self-referential in the page language.
  • Dynamic product and article routes are included.
  • The site sitemap contains the language URL set.

/ Foire aux questions

Questions que se posent les équipes avant de mettre en œuvre un référencement multilingue.

Does Next.js generate hreflang automatically?

Next.js fournit des API de métadonnées pour les variantes linguistiques, mais votre application doit fournir les URL de localisation et le mappage de langue corrects.

Should hreflang URLs be absolute?

Utilisez des URL HTTPS complètes dans les métadonnées de production et les sitemaps afin que les relations linguistiques soient sans ambiguïté.

Do I still need canonical tags when using hreflang?

Oui. L'attribut hreflang décrit les versions linguistiques ou régionales équivalentes ; chaque page localisée doit néanmoins identifier sa propre URL canonique.