AccueilBac à sableShowcaseAppDocBlog
    • Englishanglais
      EN
    • русскийrusse
      RU
    • 日本語japonais
      JA
    • françaisfrançais
      FR
    • 한국어coréen
      KO
    • 中文chinois
      ZH
    • españolespagnol
      ES
    • Deutschallemand
      DE
    • العربيةarabe
      AR
    • italianoitalien
      IT
    • British Englishanglais britannique
      EN-GB
    • portuguêsportugais
      PT
    • हिन्दीhindi
      HI
    • Türkçeturc
      TR
    • polskipolonais
      PL
    • Indonesiaindonésien
      ID
    • Tiếng Việtvietnamien
      VI
    • українськаukrainien
      UK
    /
    Filtrer la documentation par framework
    Alt+←
    Pourquoi Intlayer ?
    Commencer
    Concept
    • Comment Intlayer fonctionne
    • Configuration
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Éditeur visuel
    • CMS
    • Intégration CI/CD
    • TraductionPlurielÉnumérationConditionGenreInsertionFichierImbricationMarkdownHTMLRécupération de fonction
    • Fichier par locale
    • Compilateur
    • Remplissage automatique
    • Tests
    • Optimisation de bundle
    Environnement
    • Next.js 14 et App Router
      Next.js 15
      Next.js sans locale URL
      Next.js et Page Router
      Compiler
    • Tanstack Start Solid
    • Astro et React
      Astro et Svelte
      Astro et Vue
      Astro et Solid
      Astro et Preact
      Astro et Lit
      Astro et Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt et Vue
    • Vite et Solid
    • SvelteKit
    • Vite et Preact
    • Vite et Vanilla JS
    • Vite et Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native et Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx et React
    Plugins
    • JSON
    • gettext (.po)
    Extension VS Code
    Agent
    • Serveur MCP
    • Compétences de l’agent
    Versions
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Poser une question
    1. Documentation
    2. Concept
    3. Custom_url_rewrites
    \n\n ```\n\n \n \n \n ```tsx\n import { useRewriteURL } from \"solid-intlayer\";\n\n const Layout = (props) => {\n useRewriteURL();\n return <>{props.children};\n };\n ```\n\n \n \n \n ```svelte\n \n\n ```\n\n \n\n\n## Intégration du Router et des Proxies\n\nLes proxies côté serveur d'Intlayer (Vite et Next.js) gèrent automatiquement les réécritures personnalisées pour garantir la cohérence SEO.\n\n1. **Réécritures internes** : Lorsqu'un utilisateur visite `/fr/a-propos`, le proxy le mappe en interne vers `/fr/about` afin que votre framework corresponde à la bonne route.\n2. **Redirections faisant autorité** : Si un utilisateur saisit manuellement `/fr/about`, le proxy émet une redirection 301/302 vers `/fr/a-propos`, garantissant que les moteurs de recherche n'indexent qu'une seule version de la page.\n\n### Intégration avec Next.js\n\nL'intégration avec Next.js est entièrement gérée via le middleware `intlayerProxy`.\n\n```typescript fileName=\"middleware.ts\"\nimport { intlayerProxy } from \"next-intlayer/middleware\";\nimport { NextRequest } from \"next/server\";\n\nexport function middleware(request: NextRequest) {\n return intlayerProxy(request);\n}\n```\n\n### Intégration Vite\n\nPour SolidJS, Vue et Svelte, le plugin Vite `intlayerProxy` gère les réécritures pendant le développement.\n\n```typescript fileName=\"vite.config.ts\"\nimport { defineConfig } from \"vite\";\nimport { intlayerProxy } from \"vite-intlayer\";\n\nexport default defineConfig({\n plugins: [intlayerProxy()],\n});\n```\n\n## Fonctionnalités clés\n\n### 1. Réécritures multi-contexte\n\nChaque formatter génère un `RewriteObject` contenant des règles spécialisées pour différents consommateurs :\n\n- `url` : Optimisé pour la génération d'URL côté client (supprime les segments de locale).\n- `nextjs` : Préserve `[locale]` pour le middleware Next.js.\n- `vite` : Préserve `:locale` pour les proxies Vite.\n\n### 2. Normalisation automatique des patterns\n\nIntlayer normalise en interne toutes les syntaxes de pattern (par ex. en convertissant `[param]` en `:param`) afin que la correspondance reste cohérente quel que soit le framework source.\n\n### 3. URL canoniques pour le SEO\n\nEn imposant des redirections des chemins canoniques vers des alias plus lisibles, Intlayer évite les problèmes de contenu dupliqué et améliore la découvrabilité du site.\n\n## Utilitaires principaux\n\n- `getLocalizedUrl(url, locale)`: Génère une URL localisée en respectant les règles de réécriture.\n- `getCanonicalPath(path, locale)`: Retourne le chemin canonique interne correspondant à une URL localisée.\n- `getRewritePath(pathname, locale)`: Détecte si un pathname doit être corrigé vers son alias localisé plus lisible.\n","about":"Découvrez comment configurer et utiliser des réécritures d'URL personnalisées dans Intlayer pour définir des chemins spécifiques à une locale.","url":"https://intlayer.org/fr/doc/concept/custom_url_rewrites","datePublished":"13-08-2024","dateModified":"26-01-2026","keywords":"Réécritures d'URL personnalisées, Routage, Internationalisation, i18n","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"Développeurs, Responsables de contenu"}}
    Création:2024-08-13Dernière mise à jour:2026-01-26
    Référencez cette doc à votre assistant AI préféré
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Posez votre question et obtenez un résumé du document en referencant cette page et le Provider AI de votre choix

    Historique des versions

    1. "Mise en œuvre de réécritures d'URL centralisées avec des formateurs spécifiques au framework et le hook useRewriteURL."
      v8.0.025/01/2026

    Le contenu de cette page a été traduit à l'aide d'une IA.

    Voir la dernière version du contenu original en anglais
    Modifier cette documentation

    Si 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 documentation
    Copier

    Copier le Markdown du doc dans le presse-papiers

    Mise en œuvre des réécritures d'URL personnalisées

    Intlayer prend en charge les réécritures d'URL personnalisées, vous permettant de définir des chemins spécifiques à chaque locale qui diffèrent de la structure standard /locale/path. Cela permet d'avoir des URL telles que /about pour l'anglais et /a-propos pour le français tout en maintenant la logique interne de l'application canonique.

    Configuration

    Les réécritures personnalisées sont configurées dans la section routing de votre fichier intlayer.config.ts en utilisant des formateurs spécifiques au framework. Ces formateurs fournissent la syntaxe correcte pour votre routeur préféré.

    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-no-default",    rewrite: nextjsRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { reactRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: reactRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { tanstackRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: tanstackRouterRewrite({      "/$locale/about": {        fr: "/$locale/a-propos",        es: "/$locale/acerca-de",      },      "/$locale/products/$id": {        fr: "/$locale/produits/$id",        es: "/$locale/productos/$id",      },    }),  },};export default config;
    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { vueRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: vueRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { svelteKitRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: svelteKitRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { solidRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: solidRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { Locales, type IntlayerConfig } from "intlayer";import { nuxtRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: nuxtRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;

    Formatters disponibles

    Intlayer fournit des formatters pour tous les frameworks populaires :

    • nextjsRewrite: Pour Next.js App Router. Prend en charge [slug], [...slug] (1+), et [[...slug]] (0+).
    • svelteKitRewrite: Pour SvelteKit. Prend en charge [slug], [...path] (0+), et [[optional]] (0-1).
    • reactRouterRewrite: Pour React Router. Prend en charge :slug et * (0+).
    • vueRouterRewrite: Pour Vue Router 4. Prend en charge :slug, :slug? (0-1), :slug* (0+), et :slug+ (1+).
    • solidRouterRewrite: Pour Solid Router. Prend en charge :slug et *slug (0+). /// tanstackRouterRewrite : Pour TanStack Router. Prend en charge $slug et * (0+). /// nuxtRewrite : Pour Nuxt 3. Prend en charge [slug] et [...slug] (0+). /// viteRewrite : Formateur générique pour tout projet basé sur Vite. Normalise la syntaxe pour le proxy Vite. /// /// ### Modèles avancés /// /// Intlayer normalise en interne ces modèles vers une syntaxe unifiée, permettant des correspondances et une génération de chemins sophistiquées : /// /// - Segments optionnels : [[optional]] (SvelteKit) ou :slug? (Vue/React) sont pris en charge. /// - Catch-all (zéro ou plusieurs) : [[...slug]] (Next.js), [...path] (SvelteKit/Nuxt), ou * (React/TanStack) permettent de matcher plusieurs segments. /// - Catch-all obligatoire (un ou plusieurs) : [...slug] (Next.js) ou :slug+ (Vue) garantissent qu'au moins un segment est présent. /// /// ## Correction d'URL côté client : useRewriteURL

    Pour faire en sorte que la barre d'adresse du navigateur reflète toujours l'URL localisée "propre", Intlayer fournit le hook useRewriteURL. Ce hook met à jour silencieusement l'URL en utilisant window.history.replaceState lorsqu'un utilisateur arrive sur un chemin canonique.

    Utilisation dans les frameworks

    tsx
    Copier le code

    Copier le code dans le presse-papiers

    'use client';import { useRewriteURL } from "next-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Corrige automatiquement /fr/about vers /fr/a-propos  return <>{children}</>;};
    tsx
    Copier le code

    Copier le code dans le presse-papiers

    'use client';import { useRewriteURL } from "react-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Corrige automatiquement /fr/about en /fr/a-propos  return <>{children}</>;};
    vue
    Copier le code

    Copier le code dans le presse-papiers

    <script setup>import { useRewriteURL } from "vue-intlayer";useRewriteURL();</script>
    tsx
    Copier le code

    Copier le code dans le presse-papiers

    import { useRewriteURL } from "solid-intlayer";const Layout = (props) => {  useRewriteURL();  return <>{props.children}</>;};
    svelte
    Copier le code

    Copier le code dans le presse-papiers

    <script>import { useRewriteURL } from "svelte-intlayer";useRewriteURL();</script>

    Intégration du Router et des Proxies

    Les proxies côté serveur d'Intlayer (Vite et Next.js) gèrent automatiquement les réécritures personnalisées pour garantir la cohérence SEO.

    1. Réécritures internes : Lorsqu'un utilisateur visite /fr/a-propos, le proxy le mappe en interne vers /fr/about afin que votre framework corresponde à la bonne route.
    2. Redirections faisant autorité : Si un utilisateur saisit manuellement /fr/about, le proxy émet une redirection 301/302 vers /fr/a-propos, garantissant que les moteurs de recherche n'indexent qu'une seule version de la page.

    Intégration avec Next.js

    L'intégration avec Next.js est entièrement gérée via le middleware intlayerProxy.

    middleware.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { intlayerProxy } from "next-intlayer/middleware";import { NextRequest } from "next/server";export function middleware(request: NextRequest) {  return intlayerProxy(request);}

    Intégration Vite

    Pour SolidJS, Vue et Svelte, le plugin Vite intlayerProxy gère les réécritures pendant le développement.

    vite.config.ts
    Copier le code

    Copier le code dans le presse-papiers

    import { defineConfig } from "vite";import { intlayerProxy } from "vite-intlayer";export default defineConfig({  plugins: [intlayerProxy()],});

    Fonctionnalités clés

    1. Réécritures multi-contexte

    Chaque formatter génère un RewriteObject contenant des règles spécialisées pour différents consommateurs :

    • url : Optimisé pour la génération d'URL côté client (supprime les segments de locale).
    • nextjs : Préserve [locale] pour le middleware Next.js.
    • vite : Préserve :locale pour les proxies Vite.

    2. Normalisation automatique des patterns

    Intlayer normalise en interne toutes les syntaxes de pattern (par ex. en convertissant [param] en :param) afin que la correspondance reste cohérente quel que soit le framework source.

    3. URL canoniques pour le SEO

    En imposant des redirections des chemins canoniques vers des alias plus lisibles, Intlayer évite les problèmes de contenu dupliqué et améliore la découvrabilité du site.

    Utilitaires principaux

    • getLocalizedUrl(url, locale): Génère une URL localisée en respectant les règles de réécriture.
    • getCanonicalPath(path, locale): Retourne le chemin canonique interne correspondant à une URL localisée.
    • getRewritePath(pathname, locale): Détecte si un pathname doit être corrigé vers son alias localisé plus lisible.
    Pourquoi Intlayer ?
    Alt+→

    Dans cette page

      Les discussions sont anonymes et régulièrement analysées pour traiter les problèmes fréquents. N'hésitez pas à partager vos idées de fonctionnalités, vos retours sur la documentation ou tout ce qui concerne Intlayer, nous utilisons ces retours pour construire notre roadmap et améliorer le produit.

      import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-no-default",    rewrite: nextjsRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { reactRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: reactRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { tanstackRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: tanstackRouterRewrite({      "/$locale/about": {        fr: "/$locale/a-propos",        es: "/$locale/acerca-de",      },      "/$locale/products/$id": {        fr: "/$locale/produits/$id",        es: "/$locale/productos/$id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { vueRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: vueRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { svelteKitRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: svelteKitRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { solidRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: solidRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { nuxtRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: nuxtRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      'use client';import { useRewriteURL } from "next-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Corrige automatiquement /fr/about vers /fr/a-propos  return <>{children}</>;};
      'use client';import { useRewriteURL } from "react-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Corrige automatiquement /fr/about en /fr/a-propos  return <>{children}</>;};
      <script setup>import { useRewriteURL } from "vue-intlayer";useRewriteURL();</script>
      import { useRewriteURL } from "solid-intlayer";const Layout = (props) => {  useRewriteURL();  return <>{props.children}</>;};
      <script>import { useRewriteURL } from "svelte-intlayer";useRewriteURL();</script>
      import { intlayerProxy } from "next-intlayer/middleware";import { NextRequest } from "next/server";export function middleware(request: NextRequest) {  return intlayerProxy(request);}
      import { defineConfig } from "vite";import { intlayerProxy } from "vite-intlayer";export default defineConfig({  plugins: [intlayerProxy()],});