Multilíngue para CMS headless.
Polylang deu aos sites WordPress um fluxo de trabalho multilíngue completo. PolyLingo traz esse fluxo para Sanity, Contentful, Webflow, Framer e todos os outros CMS headless — através de uma API REST que integra em uma tarde.
Multilíngue em CMS headless é um problema não resolvido.
Sanity tem o plugin de internacionalização. Contentful tem locais. Mas nenhum deles traduz seu conteúdo — eles apenas armazenam em múltiplos idiomas. Preencher essas vagas de idioma ainda é um processo manual. Exporte o conteúdo em inglês, passe por uma ferramenta de tradução que quebra seu texto rico ou estrutura JSON, corrija a saída, importe de volta, repita para cada idioma. Para uma equipe ativa publicando regularmente, esse fluxo não escala. Também não existe para a maioria das configurações menores, o que significa que o conteúdo simplesmente nunca é traduzido.
A arquitetura do CMS headless separa o gerenciamento de conteúdo da entrega de conteúdo. Isso é bom para flexibilidade. Mas cria uma lacuna: o CMS armazena variantes de idioma, mas nada preenche essas variantes com conteúdo traduzido. Você precisa construir essa camada você mesmo.
A maioria das equipes acaba em uma de duas situações: traduzem manualmente o conteúdo copiando para o DeepL e colando de volta (lento, propenso a erros, não escala), ou escrevem uma integração personalizada com uma API de tradução que precisam manter indefinidamente. Nenhuma é uma boa resposta. PolyLingo é uma terceira opção limpa.
PolyLingo é a camada de tradução que seu CMS está perdendo.
PolyLingo integra-se diretamente ao seu fluxo de publicação do CMS. Configure um webhook que dispara quando o conteúdo é publicado, envie o conteúdo para PolyLingo, receba versões traduzidas para cada idioma, escreva de volta no seu CMS. Para Sanity, são poucas linhas em uma ação de servidor. Para Contentful, é um manipulador de webhook. Para configurações personalizadas, é uma chamada HTTP. O modelo de tradução entende seu formato de conteúdo — Markdown, HTML, JSON, texto rico — e preserva a estrutura durante todo o processo.
O padrão é consistente em todos os CMS: busque o conteúdo no idioma fonte, chame a API PolyLingo com todos os idiomas alvo, escreva o conteúdo traduzido de volta ao CMS via sua API de gerenciamento. Isso roda como um script em tempo de build, um job de CI ou um manipulador de webhook — o que se encaixar no seu fluxo de trabalho.
PolyLingo lida com Markdown, HTML e texto simples, então funciona com qualquer formato que seu CMS use para conteúdo rico. Campos estruturados (títulos, corpo, resumo) podem ser traduzidos individualmente para dar controle granular sobre quais campos são traduzidos.
Sanity + PolyLingo
O plugin de Internacionalização de Documentos do Sanity cria variantes de documentos vinculadas por local. O script abaixo busca os documentos base em inglês e cria variantes traduzidas para cada idioma alvo automaticamente.
Funciona com o padrão de i18n a nível de documento (um documento por local) assim como o padrão a nível de campo (todos os locais em um documento). Para o padrão a nível de campo, percorra os campos em vez dos documentos.
// 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 armazena variantes de local como campos na mesma entrada. O script abaixo usa a Contentful Management API para buscar entradas em inglês, traduzi-las e escrever o conteúdo traduzido diretamente nos campos específicos do local — sem necessidade de copiar e colar manualmente.
Contentful usa códigos de local BCP 47 (ex: es-ES em vez de es). Mapeie os códigos ISO 639-1 do PolyLingo para sua configuração de local do Contentful conforme necessário.
// 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
A API de Localização do Webflow (disponível nos planos CMS e Business) suporta conteúdo de campo específico por local. O script abaixo busca itens da coleção CMS, traduz o campo corpo em HTML e escreve as traduções de volta para cada variante de local via API Webflow v2.
Webflow armazena campos de texto rico como HTML. A tradução HTML do PolyLingo preserva toda a marcação gerada pelo Webflow — classes personalizadas, atributos e elementos incorporados — intactos.
// 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 } }) }
)
}
}O que o PolyLingo oferece aos usuários de CMS headless
- ✓Sanity — traduza na publicação via webhook, escreva de volta para os locais do documento
- ✓Contentful — traduza entradas automaticamente quando o local inglês é atualizado
- ✓Webflow — traduza itens da coleção CMS via API
- ✓Qualquer CMS headless com API — o padrão de integração é o mesmo
- ✓Texto rico, Markdown e HTML todos preservados corretamente
- ✓Todos os 36 idiomas em uma única requisição — sem chamadas por idioma
- ✓Funciona com qualquer CMS que tenha API de gerenciamento
- ✓O conteúdo pode ser retraduzido a cada publicação — sem sincronização manual
O fluxo de trabalho padrão de CMS multilíngue
Escreva conteúdo no seu idioma fonte
Crie e publique conteúdo em inglês (ou qualquer que seja seu idioma fonte). Seu CMS armazena essa versão como a oficial. Você não precisa mudar seu fluxo editorial.
Dispare o script de tradução
Execute o script manualmente, agendado ou via webhook disparado por eventos de publicação no seu CMS. O script chama o PolyLingo uma vez por documento com todos os idiomas alvo, depois escreve todas as traduções de volta ao CMS em uma única passagem.
Publique — conteúdo traduzido está disponível
Seu frontend lê o conteúdo específico do local do CMS normalmente. Nenhuma alteração no código frontend é necessária. O conteúdo traduzido aparece no idioma correto para cada rota local.
Para quem isso foi criado
Equipes de conteúdo no Sanity ou Contentful
Seus editores publicam em inglês. O conteúdo traduzido aparece automaticamente em todos os locais, sem que a equipe de edição precise interagir com ferramentas de tradução.
Agências que constroem sites multilíngues
Todo site de cliente que você constrói precisa de suporte multilíngue. PolyLingo oferece uma integração reutilizável e faturável que funciona com qualquer CMS headless na sua stack.
E-commerce com conteúdo de produto localizado
Descrições de produtos, páginas de categoria e conteúdo de blog — tudo traduzido automaticamente ao ser publicado. Combine com preços específicos por local para oferecer uma experiência de compra totalmente localizada.
Perguntas frequentes sobre CMS headless multilíngue
PolyLingo funciona com CMSs não listados aqui?
Sim. Qualquer CMS com API de gerenciamento pode ser integrado usando o mesmo padrão — buscar conteúdo, chamar PolyLingo, escrever de volta. Prismic, Storyblok, DatoCMS, Strapi, Ghost e Directus têm APIs de gerenciamento e funcionam com essa abordagem. Os exemplos de integração para Sanity, Contentful e Webflow acima ilustram o padrão.
Posso traduzir texto rico com imagens e links embutidos?
Sim. A tradução HTML preserva todos os elementos embutidos incluindo imagens (atributos src e alt tratados corretamente), links (href preservado, texto do link traduzido) e iframes. A única exceção é conteúdo explicitamente marcado como não traduzível — blocos de código, por exemplo, nunca são traduzidos.
Como lidar com conteúdo que não deve ser traduzido?
Para conteúdo estruturado com campos não traduzíveis (slugs, datas, identificadores técnicos), envie apenas os campos que deseja traduzir. Para texto rico com seções mistas traduzíveis e não traduzíveis, use o formato HTML — PolyLingo traduz o texto preservando blocos de código e outros elementos estruturados automaticamente.
E se meu CMS tiver tipos de conteúdo aninhados?
Para conteúdo profundamente aninhado (documentos com referências a outros documentos), traduza cada tipo de documento independentemente. Isso evita referências circulares e dá controle limpo sobre qual conteúdo é traduzido. Referências entre documentos são mantidas pelo CMS — PolyLingo só toca o conteúdo dos campos, não os relacionamentos dos documentos.
Como manter as traduções sincronizadas quando o conteúdo fonte muda?
O padrão recomendado é disparar o script de tradução a cada evento de publicação via webhook do CMS. Isso garante que o conteúdo traduzido seja atualizado sempre que a fonte mudar. Para atualizações menos frequentes, rodar o script em um agendamento noturno ou antes de cada implantação de produção funciona igualmente bem.
Existe uma forma de marcar traduções como "precisa revisão" em vez de publicar automaticamente?
Isso depende do seu CMS. Contentful e Sanity suportam estados de rascunho — você pode escrever o conteúdo traduzido como rascunho em vez de publicado, permitindo revisão humana antes de cada local ficar ativo. Os exemplos de script acima usam publicar/criar imediatamente; modifique a etapa final para criar rascunhos para um fluxo de revisão.
Guias relacionados
Traduzir HTML sem quebrar a marcação
Como PolyLingo lida com HTML gerado por CMS preservando todas as tags.
Adicionar multilíngue ao Next.js
Combine tradução de conteúdo CMS headless com tradução de strings UI com next-intl.
Alternativa ao Polylang para stacks modernas
Migrando fluxo multilíngue do WordPress para uma configuração headless.
Adicione multilíngue ao seu CMS headless hoje.
Plano gratuito. 100.000 tokens por mês. Não é necessário cartão de crédito.
Comece a traduzir grátisPlano gratuito — 100.000 tokens por mês. Funciona com qualquer CMS.