
# Routage et chemins

Le `path` d'une page est l'URL à laquelle elle répond. Il est comparé littéralement, sauf s'il contient un segment `:param` ou `*`, auquel cas il devient un motif.

## Formes de chemin

| Forme     | Exemple             | Correspond à                                                            |
| --------- | ------------------- | ----------------------------------------------------------------------- |
| Racine    | `/`                 | La page d'accueil.                                                      |
| Statique  | `/about`            | Ce chemin exact, et rien d'autre.                                       |
| Imbriquée | `/settings/billing` | Un nombre quelconque de segments statiques.                             |
| Dynamique | `/blog/:slug`       | Un segment, capturé sous le nom `slug`.                                 |
| Catch-all | `/docs/:rest*`      | Le reste du chemin, capturé sous `rest` — doit être le dernier segment. |
| Joker     | `/files/*`          | Tout ce qui se trouve sous `/files/`, sans nom de capture.              |

Un chemin doit correspondre à `^/[a-z0-9-_/:*]*$` : il commence par `/`, et **seules les minuscules** sont admises. `/users/:userId` est rejeté — écrivez `/users/:userid`, ou mieux, `/users/:id`.

:::callout
**Un chemin sans `:` ni `*` est comparé comme une chaîne exacte.** Aucune correspondance de préfixe, aucune tolérance sur la barre oblique finale. `/about` ne répond pas à `/about/`.
:::

## Segments dynamiques

Un segment `:param` capture exactement un segment de chemin — jamais au-delà d'un `/`. `/blog/:slug` correspond à `/blog/hello` mais pas à `/blog/2026/hello` ; utilisez `/blog/:slug*` pour ce dernier cas.

Les routes dynamiques sont généralement associées à un bloc `collection`, afin qu'une seule définition de page génère une route par enregistrement :

```yaml
pages:
  - name: Blog Post
    path: /blog/:slug
    collection: { table: posts, slugField: slug }
    components:
      - { type: text, tag: h1, content: '$record.title' }
```

Voir [Collections et markdown](/fr/docs/pages-collections) pour le contrat de `collection`.

## Routes de détail d'enregistrement

Pour servir un seul enregistrement à une URL sans générer une route par enregistrement, associez un segment dynamique à une source de données en mode `single`. `param` nomme le segment de chemin d'où lire l'identifiant :

```yaml
pages:
  - name: Task
    path: /tasks/:id
    dataSource:
      table: tasks
      mode: single
      param: id
    components:
      - { type: text, tag: h1, content: '$record.title' }
      - { type: text, content: '$record.description' }
```

Une requête dont le paramètre ne correspond à aucun enregistrement renvoie un `404`.

:::callout
**`$id` n'est pas une syntaxe de chemin.** `$` n'est pas un caractère légal dans un `path`, donc `/tasks/$id` échoue à la validation. Le marqueur de segment dynamique est `:` partout ; `$record.*` est une référence de _contenu_, pas de route.
:::

## Le segment de langue

Sovrium ne préfixe pas vos chemins à votre place. Lorsque `app.languages` est configuré, le runtime lit le **premier segment du chemin** et, s'il correspond à un code de langue configuré, celui-ci devient la langue active pour la résolution des traductions `$t:`.

Les routes localisées sont donc déclarées explicitement — une page par langue, chacune portant son propre segment :

```yaml
pages:
  - { name: home-en, path: /en, components: [{ type: hero, content: '$t:hero.title' }] }
  - { name: home-fr, path: /fr, components: [{ type: hero, content: '$t:hero.title' }] }
```

## Ordre de résolution

Une requête entrante est traitée par le premier élément correspondant :

1. Un fichier réel du répertoire public.
2. Une [règle de redirection](/fr/docs/redirects).
3. Un chemin de page.
4. Le fourre-tout 404.

## Pages connexes

- [Présentation des pages](/fr/docs/pages-overview) — le tableau complet des propriétés de page.
- [Collections et markdown](/fr/docs/pages-collections) — une route par enregistrement.
- [Liaison de données](/fr/docs/pages-data-binding) — `mode: single` et `param`.
- [Redirections](/fr/docs/redirects) — retirer un chemin sans casser les liens.
- [Langues](/fr/docs/languages) — configurer les codes de langue et les clés `$t:`.
