Table des matières
Gérer du contenu dans une seule langue est déjà un défi. Ajoutez trois, cinq ou vingt langues et vous faites face à un problème que la plupart des plateformes CMS n'ont jamais été conçues pour résoudre. L'architecture Headless CMS offre une voie à suivre, mais seulement si le support multilingue est intégré dans les fondations — pas ajouté comme un plugin.
Ce guide explique comment construire une stratégie de Headless CMS multilingue évolutive, en utilisant la plateforme de contenu de Better i18n comme référence pratique.
Qu'est-ce qui rend un CMS « prêt pour plusieurs langues » ?
Avant de plonger dans l'implémentation, il est utile de définir à quoi ressemble un véritable support multilingue. Un CMS est prêt pour plusieurs langues lorsqu'il satisfait trois exigences :
La structure du contenu est consciente de la langue. Le schéma distingue les champs qui nécessitent une traduction (titres, descriptions, corps du texte) des champs universels (dates, booléens, valeurs numériques, ressources médias).
L'API sert le contenu localisé nativement. Vous pouvez demander du contenu dans n'importe quelle langue avec un paramètre de requête — sans maintenir des arbres de contenu séparés ni dupliquer des entrées par locale.
Le statut de traduction est visible. Les éditeurs peuvent voir quelles entrées ont été traduites, lesquelles sont en attente et lesquelles manquent pour une langue donnée sans quitter le tableau de bord du CMS.
Si votre CMS actuel nécessite du code personnalisé ou des services tiers pour répondre à l'un de ces trois critères, vous construisez sur une base qui créera des frictions au fur et à mesure que vous évoluez.
Étape 1 : Concevez vos modèles de contenu
Un modèle de contenu est le schéma qui définit à quoi ressemble votre contenu. Considérez-le comme un blueprint — il spécifie les champs, leurs types et leurs règles de validation.
Collections vs. Singletons
La plupart du contenu tombe dans deux catégories :
Les collections sont des modèles avec plusieurs entrées. Les articles de blog, les pages produits, les FAQ, les profils des membres de l'équipe et les entrées de changelog sont toutes des collections. Chaque collection peut avoir des centaines ou des milliers d'entrées partageant la même structure de champs.
Les singletons sont des modèles avec une seule entrée. La section hero de votre page d'accueil, les paramètres globaux du site ou une page « À propos » sont des singletons. Ils ont la même flexibilité de champs que les collections, mais représentent une instance unique.
Commencer avec le bon type de modèle évite les retouches ultérieures. Demandez-vous : « Y aura-t-il jamais plus d'un de ces éléments ? » Si oui, utilisez une collection.
Choisir les bons types de champs
Better i18n fournit plus de 19 types de champs pour que vous puissiez modéliser le contenu avec précision sans recourir à des solutions de contournement comme stocker des données structurées dans un champ textarea.
Voici un aperçu pratique par catégorie :
Champs de texte :
- Text — Chaînes sur une seule ligne pour les titres, les libellés et les valeurs courtes
- Textarea — Texte brut multiligne pour les descriptions et les résumés
- Rich Text — Un éditeur Plate.js complet pour le contenu formaté avec des titres, des listes, des intégrations et des styles en ligne
Champs de données :
- Number — Valeurs entières ou décimales (prix, quantités, évaluations)
- Boolean — Interrupteurs vrai/faux (flags de mise en avant, contrôles de visibilité)
- Date / DateTime — Sélecteurs de date avec précision de l'heure optionnelle
- Enum — Sélection simple ou multiple parmi des options prédéfinies (catégories, tags, libellés de statut)
Champs de contact et de lien :
- URL — Champs URL validés pour les liens et les références
- Email — Champs d'adresse e-mail validés
- Phone — Champs de numéro de téléphone avec validation du format
Médias et fichiers :
- Files / Media — Téléchargez des images, des PDF, des vidéos et d'autres ressources directement dans les entrées
Champs relationnels :
- Relations — Liez des entrées entre des modèles (par ex. l'auteur d'un article de blog, la catégorie d'un produit)
- Rollups — Agrégez des données à partir d'entrées liées (par ex. nombre d'articles par auteur)
- Formulas — Valeurs calculées basées sur d'autres champs de la même entrée
Champs système :
- Unique ID — Identifiant généré automatiquement pour chaque entrée
- Status — État de workflow intégré (draft, pending_review, published, archived)
- Created / Last Edited — Horodatages automatiques pour les pistes d'audit
Localisation par champ
C'est là que la conception de CMS multilingue devient intéressante. Tous les champs n'ont pas besoin d'être traduits. Le prix d'un produit est le même dans toutes les langues. Une date de publication ne change pas selon la locale. Une URL d'image est généralement universelle.
Better i18n vous permet de marquer chaque champ comme localisable ou non localisable au niveau du modèle. Les champs localisables obtiennent une valeur séparée par langue. Les champs non localisables sont partagés entre toutes les traductions.
Cette distinction est importante car elle :
- Réduit la charge de travail de traduction (les traducteurs ne voient que les champs qu'ils doivent traduire)
- Prévient les incohérences de données (les valeurs universelles sont stockées une fois, pas dupliquées)
- Maintient la réponse de l'API propre (les champs non localisables apparaissent une fois quelle que soit la langue demandée)
Étape 2 : Construisez votre workflow éditorial
Les opérations CRUD brutes ne sont pas suffisantes pour les équipes gérant du contenu multilingue. Vous avez besoin d'un workflow qui garantit la qualité sans créer de goulots d'étranglement.
Le cycle de vie des statuts
Chaque entrée dans Better i18n suit un cycle de vie en quatre étapes :
| Statut | Signification | Visibilité API |
|---|---|---|
| Draft | Travail en cours | Non retourné par défaut |
| Pending Review | Prêt pour validation éditoriale | Non retourné par défaut |
| Published | Contenu en ligne | Retourné dans les requêtes API |
| Archived | Conservé mais inactif | Non retourné par défaut |
Ce cycle de vie s'applique par entrée, pas par langue. Une entrée peut être publiée même si certaines traductions sont encore en brouillon. L'API respecte le paramètre de requête status, de sorte que votre frontend ne reçoit que le contenu dans l'état que vous demandez.
Opérations en masse pour la mise à l'échelle
Lorsque vous gérez des centaines d'entrées dans plusieurs langues, les mises à jour une par une ne sont pas évolutives. Better i18n prend en charge les opérations en masse :
- Mises à jour de statut en masse — Sélectionnez plusieurs entrées et faites-les passer du brouillon au publié (ou toute autre transition) en une seule action
- Suppression en masse — Supprimez des entrées obsolètes par lot
Ces opérations sont disponibles dans le tableau de bord et via l'API de gestion, vous pouvez donc les intégrer dans votre pipeline CI/CD ou vos scripts d'automatisation du contenu.
Étape 3 : Intégrez via la REST API
La partie « headless » du « Headless CMS » signifie que votre contenu est livré via une API, pas par un frontend couplé. Better i18n fournit une REST API publique avec trois endpoints principaux :
Endpoints principaux
GET /v1/content/:orgSlug/:projectSlug/models GET /v1/content/:orgSlug/:projectSlug/entries GET /v1/content/:orgSlug/:projectSlug/entries/:entrySlug
Paramètres de requête importants
Le véritable pouvoir de l'API réside dans ses paramètres de requête :
Filtrage par langue :
GET /entries?language=fr
Retourne tout le contenu en français. Les champs marqués comme non localisables retournent leur valeur universelle. Les champs localisables retournent la traduction française si disponible.
Filtrage par statut :
GET /entries?status=published
Retourne uniquement les entrées publiées. Combinez avec la langue pour les requêtes de production :
GET /entries?language=de&status=published
Sélection de champs (sparse fieldsets) :
GET /entries?fields=title,slug,excerpt
Réduisez la taille du payload en demandant uniquement les champs dont votre frontend a besoin.
Expansion des relations :
GET /entries?expand=author,category
Résolvez les entrées liées en ligne plutôt que de faire des requêtes de suivi. Cela élimine le problème de requête N+1 qui affecte de nombreuses intégrations Headless CMS.
Filtrage par champs personnalisés :
GET /entries?filter[page_type]=feature
Filtrez les entrées par n'importe quelle valeur de champ personnalisé. Combinez plusieurs filtres pour des requêtes précises.
Pagination et tri :
GET /entries?page=2&limit=10&sort=createdAt&order=desc
Pagination standard avec tri flexible. La réponse inclut le nombre total pour construire l'interface de pagination.
Authentification
Toutes les requêtes API nécessitent une clé API passée dans l'en-tête x-api-key. Vous pouvez créer plusieurs clés avec différentes permissions — par exemple, une clé en lecture seule pour votre frontend et une clé d'accès complet pour vos scripts d'intégration CMS.
curl -H "x-api-key: your-api-key" \ "https://api.better-i18n.com/v1/content/acme/website/entries?language=en&status=published"
Étape 4 : Utilisez la génération de contenu par IA de manière stratégique
Better i18n inclut la génération de contenu par IA au niveau du champ. La fonctionnalité generateFieldContent analyse la structure de votre modèle et le contenu existant pour suggérer des valeurs pour des champs individuels.
Où la génération par IA apporte de la valeur
- Méta-descriptions SEO — Générez des descriptions basées sur le titre et le contenu du corps de l'entrée
- Extraits et résumés — Condensez le contenu long format en aperçus concis
- Premiers brouillons — Obtenez un point de départ pour le contenu du corps qui correspond à la structure de votre modèle
- Texte alternatif pour les images — Générez un texte alternatif descriptif basé sur le contexte de l'image
Où conserver le jugement humain
La génération par IA est un point de départ, pas un résultat final. Utilisez-la pour éliminer la paralysie du champ vide, puis modifiez pour correspondre à la voix de votre marque et à vos exigences factuelles. L'approche au niveau du champ signifie que vous contrôlez exactement quels champs utilisent les suggestions de l'IA et lesquels sont écrits manuellement.
Étape 5 : Planifiez votre architecture de contenu
Avec les blocs de construction en place, voici une architecture pratique pour un site multilingue :
Modèles recommandés
| Modèle | Type | Cas d'usage |
|---|---|---|
pages | Collection | Pages marketing, landing pages |
blog-posts | Collection | Articles, tutoriels, annonces |
navigation | Singleton | Structure de navigation du site |
site-settings | Singleton | Configuration globale (logo, pied de page, liens sociaux) |
faq | Collection | Questions fréquemment posées |
changelog | Collection | Mises à jour du produit et notes de version |
Workflow de traduction
- Créez le contenu dans votre langue source. Rédigez l'entrée dans la langue principale de votre équipe.
- Utilisez le tableau de bord du statut de traduction pour identifier les entrées dont les traductions manquent.
- Ajoutez des traductions champ par champ en utilisant l'éditeur d'entrées ou l'API.
- Publiez quand c'est prêt — le cycle de vie des statuts vous permet de publier la langue source immédiatement et d'ajouter des traductions au fur et à mesure qu'elles deviennent disponibles.
Erreurs courantes à éviter
Dupliquer les entrées par langue. C'est l'erreur la plus courante. Si vous créez des entrées séparées pour les versions anglaise, française et allemande de la même page, vous perdez la connexion entre elles. Utilisez plutôt une seule entrée avec des traductions par champ.
Ignorer les champs non localisables. Ne pas marquer les champs universels (prix, dates, flags booléens) comme non localisables signifie que les traducteurs voient des champs qu'ils ne devraient pas toucher, et vous risquez des incohérences de données.
Ignorer le workflow de statuts. Publier du contenu directement sans étapes de révision fonctionne pour un blogueur solo, mais échoue pour les équipes. Utilisez le cycle de vie du brouillon au publié pour maintenir la qualité.
Récupérer trop de données depuis l'API. Utilisez le paramètre fields pour demander uniquement ce dont votre frontend a besoin. Utilisez expand pour résoudre les relations dans une seule requête plutôt que d'enchaîner plusieurs appels API.
Premiers pas
Construire une stratégie de contenu multilingue ne nécessite pas des mois de travail d'infrastructure. Avec le Headless CMS de Better i18n :
- Définissez vos modèles de contenu dans le Model Builder
- Créez des entrées dans votre langue source
- Ajoutez des traductions en utilisant l'éditeur d'entrées ou l'API
- Interrogez le contenu localisé via la REST API
- Utilisez la génération par IA pour accélérer la création de contenu
L'ensemble du workflow — de la création du modèle à la livraison par API — est conçu pour les équipes qui publient du contenu dans plusieurs langues comme partie centrale de leur produit, pas comme une réflexion après coup.