Skip to main content

Gérer le multilingue (pages sœurs)

🌍 Chapitre 21 — Gérer le multilingue (pages sœurs)

Dolibarr Website propose deux patterns multilingues différents. Il faut comprendre lequel vous utilisez avant d'écrire la moindre ligne de code. Ce chapitre vous guide entre les deux et vous montre comment InfraSStudio s'y branche.


🔀 Les deux patterns multilingues

Pattern

Caractéristique

A. Slot par locale

(recommandé)

Une seule page tpl.php sert toutes les langues. Les slots ont des overrides par locale.

B. Pages sœurs

(legacy)

Une page tpl.php par locale (

about.php

,

about-en.php

,

about-de.php

). Pattern hérité de Dolibarr Website classique.

✅ Recommandation 2026 — Utilisez le pattern A pour tout nouveau site. Le pattern B reste supporté pour migration progressive de sites existants. Le module fournit un outil de consolidation B → A si besoin.


🅰️ Pattern A — Slot par locale (le défaut moderne)

Comment ça marche

Une seule page Dolibarr Website existe par concept (ex. about). Le tpl.php est unique. Les slots ont leur valeur canonique (FR par défaut) et des overrides par locale stockés dans llx_infrasstudio_slot.

<!-- about.tpl.php — UN SEUL fichier pour FR/EN/DE/ES/IT/PT/NL/PL -->
<h1>{{slot:about_title|type=text|default=À propos de nous|label=Titre About}}</h1>
<p>{{slot:about_lead|type=textarea|default=Notre histoire en quelques mots.|label=Accroche}}</p>

Récupérer la locale visiteur dans le template

InfraSStudio résout les slots automatiquement selon la locale détectée. Pour vos propres traitements PHP (afficher la date dans la bonne langue, choisir une image différente par langue, …), récupérez la locale via :

<?php
// helper fourni par le module
$iso2 = infrasstudio_current_lang();         // 'fr', 'en', 'de', ...
$locale = infrasstudio_current_locale();     // 'fr_FR', 'en_US', 'de_DE', ...
?>

Détection cascade

infrasstudio_current_lang() détecte la langue dans cet ordre :

  1. Constante INFRASSTUDIO_LANG_ISO définie par le site (souvent dans lang.inc.php).
  2. Paramètre URL ?lang=xx.
  3. Suffixe sister sur le slug (about-en.php → en).
  4. Cookie de persistance (INFRASSTUDIO_LANG_COOKIE).
  5. Valeur de $langs->defaultlang.
  6. Header Accept-Language du visiteur.

🅱️ Pattern B — Pages sœurs (legacy)

C'est le pattern Dolibarr Website classique : pour chaque page, vous créez un tpl.php par locale.

about.php           # FR (canonique)
about-en.php        # EN
about-de.php        # DE
about-es.php        # ES
...

Si vous récupérez un site existant qui suit ce pattern, deux options :

  1. Conserver le pattern avec stubs InfraSStudio.
  2. Migrer vers le pattern A avec le CLI de consolidation.

🔗 Conserver le pattern B avec des stubs

Le module fournit un helper sister_stub.tpl.php qui permet de réduire chaque sister à 3 lignes et de partager le HTML avec la canonique.

Étapes

Le canonique reste classique :

// page5.tpl.php — canonique FR
<?php // bootstrap dolibarr ... ?>
<html>...<h1>{{slot:about_title|type=text|default=À propos|...}}</h1>...</html>

Chaque sister devient un stub :

<?php
// page42.tpl.php — sister EN
$_infrasstudio_sister_canonical = 'page5.tpl.php';
$_infrasstudio_sister_lang      = 'en';
include dol_buildpath('/infrasstudio/core/tpl/sister_stub.tpl.php', 0);

Le stub force $_GET['lang'] = 'en' puis délègue le rendu au canonique. Les overrides EN sont automatiquement utilisés pour résoudre les slots.


🔄 Migrer pattern B → A avec le CLI

Le module fournit un script qui consolide une famille de sister pages en 1 canonique + N stubs :

php htdocs/custom/infrasstudio/scripts/consolidate_sister_pages.php <ref-site> \
    [--entity=N] \
    [--base-slug=about] \
    [--dry-run] \
    [--extractor=/path/to/extractor.php]

Ce que fait le script

  1. Détecte les groupes sister parmi les ISO2 supportés (en, de, es, it, pt, nl, pl).
  2. Pour chaque groupe :
    • Garde le tpl FR comme canonique.
    • Extrait les valeurs locales depuis chaque sister tpl (via regex ou extractor custom).
    • Insère les overrides dans llx_infrasstudio_slot.
    • Réécrit la canonique avec des slots {{slot:...}}.
    • Remplace chaque sister par un stub de 3 lignes.
  3. Backup de chaque tpl original en .bak.

💡 Toujours tester avec --dry-run d'abord — Le script vous montre ce qu'il va faire sans rien écrire. Lancez en mode réel uniquement après vérification.


🌐 hreflang : déclarer les alternates au navigateur

Pour que Google sache que vos pages sont des traductions les unes des autres, vous devez émettre des balises <link rel="alternate" hreflang="..."> dans le <head>.

Le module fournit un helper qui les génère automatiquement :

<head>
    ...
    <?php echo infrasstudio_hreflang_tags($website, $WEBSITE_PAGE); ?>
    ...
</head>

Sortie typique :

✅ Fonctionne pour les deux patterns — Pattern A : émet une seule URL canonique avec les langues différenciées par ?lang=. Pattern B : émet une URL par sister.


🔁 Switcher de langue côté template

Pour permettre au visiteur de changer de langue, vous devez exposer un sélecteur. Le helper infrasstudio_translated_url($iso2) génère l'URL équivalente de la page courante dans une autre langue :

<nav class="lang-switcher">
    <?php foreach (array('fr', 'en', 'de', 'es') as $iso): ?>
        <a href="<?php echo infrasstudio_translated_url($iso); ?>">
            <?php echo strtoupper($iso); ?>
        </a>
    <?php endforeach; ?>
</nav>

📂 Charger les fichiers .lang du site

Si votre site utilise des fichiers .lang Dolibarr (par exemple pour des libellés de menu), chargez-les en début de tpl :

<?php
require_once __DIR__ . '/lang.inc.php';
$langs->loadLangs(array('website_main', 'website_blog'));
?>

Et utilisez les clés via $langs->trans('Key') ou via le slot avec default=@lang:Key.


📋 Récapitulatif

✅ Vous savez maintenant :

  • Différencier le pattern A (slot par locale, recommandé) du pattern B (pages sœurs, legacy).
  • Récupérer la locale visiteur via infrasstudio_current_lang().
  • Convertir un site existant en pattern B en utilisant le helper sister_stub.tpl.php.
  • Migrer en bloc B → A avec le CLI consolidate_sister_pages.php.
  • Émettre les balises hreflang automatiquement avec infrasstudio_hreflang_tags.
  • Construire un switcher de langue avec infrasstudio_translated_url.

Au prochain chapitre, on aborde les gabarits de page qui permettent au client de créer ses propres pages.