Multilingue pour CMS sans tête.
Polylang a offert aux sites WordPress un flux de travail multilingue complet. PolyLingo apporte ce flux de travail à Sanity, Contentful, Webflow, Framer et tous les autres CMS sans tête — via une API REST intégrable en une après-midi.
Le multilingue pour CMS sans tête est un problème non résolu.
Sanity dispose du plugin d'internationalisation. Contentful a les locales. Mais aucun ne traduit votre contenu — ils le stockent simplement en plusieurs langues. Remplir ces emplacements linguistiques reste un processus manuel. Exporter le contenu anglais, le passer par un outil de traduction qui casse votre texte enrichi ou la structure JSON, corriger la sortie, l'importer à nouveau, répéter pour chaque langue. Pour une équipe de contenu active publiant régulièrement, ce flux de travail ne scale pas. Il n'existe pas non plus pour la plupart des petites configurations, ce qui signifie que le contenu n'est jamais traduit du tout.
L'architecture CMS sans tête sépare la gestion du contenu de sa diffusion. C'est bon pour la flexibilité. Mais cela crée un vide : le CMS stocke les variantes linguistiques, mais rien ne remplit ces variantes avec du contenu traduit. Vous devez construire cette couche vous-même.
La plupart des équipes se retrouvent dans l'une des deux situations : elles traduisent manuellement le contenu en le copiant dans DeepL puis en le collant (lent, sujet aux erreurs, ne scale pas), ou elles écrivent une intégration personnalisée avec une API de traduction qu'elles doivent maintenir indéfiniment. Aucune n'est une bonne solution. PolyLingo est une troisième option propre.
PolyLingo est la couche de traduction qui manque à votre CMS.
PolyLingo s'intègre directement à votre flux de publication CMS. Configurez un webhook qui se déclenche à la publication du contenu, transmettez le contenu à PolyLingo, recevez les versions traduites pour chaque langue, réécrivez-les dans votre CMS. Pour Sanity, ce sont quelques lignes dans une action serveur. Pour Contentful, c'est un gestionnaire de webhook. Pour les configurations personnalisées, c'est un appel HTTP. Le modèle de traduction comprend le format de votre contenu — Markdown, HTML, JSON, texte enrichi — et préserve la structure tout au long du processus.
Le modèle est cohérent pour chaque CMS : récupérer le contenu dans la langue source, appeler l'API PolyLingo avec toutes les langues cibles, réécrire le contenu traduit dans le CMS via son API de gestion. Cela s'exécute comme un script de build, un job CI ou un gestionnaire de webhook — selon ce qui convient à votre flux de travail.
PolyLingo gère Markdown, HTML et texte brut, donc il fonctionne avec n'importe quel format que votre CMS utilise pour le contenu enrichi. Les champs structurés (titres, corps, extrait) peuvent être traduits individuellement pour vous donner un contrôle granulaire sur les champs traduits.
Sanity + PolyLingo
Le plugin d'internationalisation de documents de Sanity crée des variantes de documents liées par locale. Le script ci-dessous récupère les documents de base en anglais et crée automatiquement des variantes traduites pour chaque langue cible.
Fonctionne avec le modèle i18n au niveau du document (un document par locale) ainsi qu'avec le modèle au niveau du champ (toutes les locales dans un seul document). Pour le modèle au niveau du champ, bouclez sur les champs plutôt que sur les documents.
// scripts/translate-sanity.mjs
// Fetches published posts and translates each to all target languages
import { createClient } from '@sanity/client'
const sanity = createClient({
projectId: process.env.SANITY_PROJECT_ID,
dataset: 'production',
token: process.env.SANITY_TOKEN,
apiVersion: '2024-01-01',
useCdn: false,
})
const posts = await sanity.fetch(`*[_type == "post" && __i18n_lang == "en"]`)
for (const post of posts) {
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: post.body_markdown,
format: 'markdown',
targets: ['es', 'fr', 'de', 'ja', 'zh'],
}),
})
const { translations } = await response.json()
for (const [lang, content] of Object.entries(translations)) {
await sanity.create({
_type: 'post',
__i18n_lang: lang,
__i18n_base: { _type: 'reference', _ref: post._id },
title: translations[lang + '_title'] || post.title,
slug: { current: `${post.slug.current}-${lang}` },
body_markdown: content,
})
}
}Contentful + PolyLingo
Contentful stocke les variantes de locale comme des champs sur la même entrée. Le script ci-dessous utilise l'API de gestion Contentful pour récupérer les entrées anglaises, les traduire et écrire le contenu traduit directement dans les champs spécifiques à la locale — pas besoin de copier-coller manuel.
Contentful utilise les codes de locale BCP 47 (ex. es-ES plutôt que es). Mappez les codes ISO 639-1 de PolyLingo à votre configuration locale Contentful en conséquence.
// scripts/translate-contentful.mjs
// Translates Contentful entries to all target locales
import contentful from 'contentful-management'
const client = contentful.createClient({
accessToken: process.env.CONTENTFUL_MANAGEMENT_TOKEN,
})
const space = await client.getSpace(process.env.CONTENTFUL_SPACE_ID)
const env = await space.getEnvironment('master')
const entries = await env.getEntries({ content_type: 'blogPost', locale: 'en-US' })
for (const entry of entries.items) {
const enBody = entry.fields.body['en-US']
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: enBody,
format: 'markdown',
targets: ['es-ES', 'fr-FR', 'de-DE'],
}),
})
const { translations } = await response.json()
for (const [locale, content] of Object.entries(translations)) {
entry.fields.body[locale] = content
}
await entry.update()
await entry.publish()
}Webflow + PolyLingo
L'API de localisation de Webflow (disponible sur les plans CMS et Business) prend en charge le contenu des champs spécifiques à la locale. Le script ci-dessous récupère les éléments de collection CMS, traduit le champ corps HTML, et écrit les traductions dans chaque variante locale via l'API Webflow v2.
Webflow stocke les champs de texte enrichi en HTML. La traduction HTML de PolyLingo préserve toute la balise générée par Webflow — classes personnalisées, attributs et éléments intégrés — intacte.
// scripts/translate-webflow.mjs
// Webflow Localization API + PolyLingo
const headers = {
'Authorization': `Bearer ${process.env.WEBFLOW_API_TOKEN}`,
'accept-version': '2.0.0',
'Content-Type': 'application/json',
}
// Fetch English CMS items
const itemsRes = await fetch(
`https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items`,
{ headers }
)
const { items } = await itemsRes.json()
for (const item of items) {
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: item.fieldData['body-html'],
format: 'html',
targets: ['es', 'fr', 'de'],
}),
})
const { translations } = await response.json()
// Write translated content back to Webflow locale fields
for (const [lang, content] of Object.entries(translations)) {
await fetch(
`https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items/${item.id}/locales/${lang}`,
{ method: 'PATCH', headers, body: JSON.stringify({ fieldData: { 'body-html': content } }) }
)
}
}Ce que PolyLingo offre aux utilisateurs de CMS sans tête
- ✓Sanity — traduisez à la publication via webhook, réécrivez dans les locales du document
- ✓Contentful — traduisez automatiquement les entrées quand la locale anglaise est mise à jour
- ✓Webflow — traduisez les éléments de collection CMS via l'API
- ✓Tout CMS sans tête avec une API — le modèle d'intégration est le même
- ✓Texte enrichi, Markdown et HTML tous correctement préservés
- ✓Les 36 langues en une seule requête — pas d'appels par langue
- ✓Fonctionne avec tout CMS disposant d'une API de gestion
- ✓Le contenu peut être retraduit à chaque publication — pas de synchronisation manuelle
Le flux de travail CMS multilingue standard
Rédigez le contenu dans votre langue source
Créez et publiez du contenu en anglais (ou dans la langue source de votre choix). Votre CMS stocke cette version comme autoritaire. Vous n'avez pas besoin de modifier votre flux éditorial.
Déclenchez le script de traduction
Exécutez le script manuellement, selon un planning, ou via un webhook déclenché par la publication de contenu dans votre CMS. Le script appelle PolyLingo une fois par document avec toutes les langues cibles, puis écrit toutes les traductions dans votre CMS en une seule passe.
Déployez — le contenu traduit est en ligne
Votre frontend lit le contenu spécifique à la locale depuis le CMS comme d'habitude. Aucun changement dans votre code frontend n'est nécessaire. Le contenu traduit apparaît dans la bonne langue pour chaque route locale.
Pour qui cela a été conçu
Équipes de contenu sur Sanity ou Contentful
Vos éditeurs publient en anglais. Le contenu traduit apparaît automatiquement dans toutes les locales, sans que l'équipe éditoriale ait besoin d'interagir avec des outils de traduction.
Agences créant des sites multilingues
Chaque site client que vous créez nécessite un support multilingue. PolyLingo vous offre une intégration réutilisable et facturable qui fonctionne avec n'importe quel CMS sans tête de votre stack.
E-commerce avec contenu produit localisé
Descriptions de produits, pages de catégories et contenu de blog — tous traduits automatiquement à la publication. Combinez avec des prix spécifiques à la locale pour offrir une expérience d'achat entièrement localisée.
Questions fréquentes sur le multilingue CMS sans tête
PolyLingo fonctionne-t-il avec des CMS non listés ici ?
Oui. Tout CMS disposant d'une API de gestion peut être intégré avec le même modèle — récupérer le contenu, appeler PolyLingo, réécrire. Prismic, Storyblok, DatoCMS, Strapi, Ghost et Directus ont tous des API de gestion et fonctionnent avec cette approche. Les exemples d'intégration pour Sanity, Contentful et Webflow ci-dessus illustrent ce modèle.
Puis-je traduire du texte enrichi avec images et liens intégrés ?
Oui. La traduction HTML préserve tous les éléments intégrés, y compris les images (attributs src et alt correctement gérés), les liens (href préservé, texte du lien traduit) et les iframes. La seule exception est le contenu explicitement marqué comme non traduisible — les blocs de code, par exemple, ne sont jamais traduits.
Comment gérer le contenu qui ne doit pas être traduit ?
Pour le contenu structuré avec des champs non traduisibles (slugs, dates, identifiants techniques), envoyez uniquement les champs que vous souhaitez traduire. Pour le texte enrichi avec sections traduisibles et non traduisibles mélangées, utilisez le format HTML — PolyLingo traduira le texte tout en préservant automatiquement les blocs de code et autres éléments structurés.
Que faire si mon CMS a des types de contenu imbriqués ?
Pour un contenu profondément imbriqué (documents avec références à d'autres documents), traduisez chaque type de document indépendamment. Cela évite les références circulaires et vous donne un contrôle clair sur le contenu traduit. Les références entre documents sont maintenues par le CMS — PolyLingo ne touche qu'au contenu des champs, pas aux relations entre documents.
Comment garder les traductions synchronisées lorsque le contenu source change ?
Le modèle recommandé est de déclencher le script de traduction à chaque événement de publication via un webhook CMS. Cela garantit que le contenu traduit est mis à jour à chaque changement de la source. Pour des mises à jour moins fréquentes, exécuter le script chaque nuit ou avant chaque déploiement en production fonctionne aussi bien.
Existe-t-il un moyen de marquer les traductions comme "à revoir" plutôt que de publier automatiquement ?
Cela dépend de votre CMS. Contentful et Sanity supportent tous deux les états de brouillon — vous pouvez écrire le contenu traduit en brouillon plutôt qu'en publié, permettant une révision humaine avant la mise en ligne de chaque locale. Les exemples de script ci-dessus utilisent la publication/création immédiate ; modifiez l'étape finale pour créer des brouillons à la place pour un flux de travail de révision.
Guides associés
Traduire du HTML sans casser la balise
Comment PolyLingo gère le HTML généré par CMS avec une préservation complète des balises.
Ajouter le multilingue à Next.js
Combinez la traduction de contenu CMS sans tête avec la traduction des chaînes UI next-intl.
Alternative à Polylang pour stacks modernes
Migration du flux multilingue de WordPress vers une configuration sans tête.
Ajoutez le multilingue à votre CMS sans tête dès aujourd'hui.
Niveau gratuit. 100 000 jetons par mois. Pas de carte bancaire requise.
Commencer la traduction gratuitementNiveau gratuit — 100 000 jetons par mois. Fonctionne avec tout CMS.