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 (
,
,
). 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 :
- Constante
INFRASSTUDIO_LANG_ISOdéfinie par le site (souvent danslang.inc.php). - Paramètre URL
?lang=xx. - Suffixe sister sur le slug (
about-en.php→ en). - Cookie de persistance (
INFRASSTUDIO_LANG_COOKIE). - Valeur de
$langs->defaultlang. - Header
Accept-Languagedu 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 :
- Conserver le pattern avec stubs InfraSStudio.
- 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
- Détecte les groupes sister parmi les ISO2 supportés (en, de, es, it, pt, nl, pl).
- 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.
- 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 :
<link rel="alternate" hreflang="fr" href="https://exemple.com/about.php" />
<link rel="alternate" hreflang="en" href="https://exemple.com/about-en.php" />
<link rel="alternate" hreflang="de" href="https://exemple.com/about-de.php" />
<link rel="alternate" hreflang="x-default" href="https://exemple.com/about.php" />
✅ 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.