Payload CMS
Conecte seu Payload CMS a um engine de localização, escolha quais collections e globals incluir, e o Lingo.dev traduz os campos localizados para os idiomas de destino e grava tudo de volta no Payload em cada idioma.
Funciona com projetos Payload 3 com localização ativada e que usam o editor de rich text Lexical. O editor Slate, mais antigo, não é compatível. Os campos localizados text, textarea e richText são traduzidos. Todo o restante do documento permanece como está.
O Payload CMS está disponível no plano Enterprise. Se a página Connect mostrar Payload CMS não está no seu plano, fale com a gente que resolvemos isso.
Antes de começar#
Você precisa de três coisas:
- Payload 3 com localização configurada. Verifique se os idiomas de origem e de destino correspondem aos idiomas definidos na configuração do Payload.
- Um usuário de serviço com chave de API. Defina
useAPIKey: truena sua collection de autenticação (geralmenteusers), crie um usuário para o Lingo.dev e gere uma chave de API para ele no admin do Payload. Esse usuário precisa de acesso de leitura e atualização a todas as collections e globals que você quiser traduzir. - Um engine de localização. O glossário, a voz da marca e as regras dele orientam as traduções.
Os códigos de idioma precisam corresponder à configuração do Payload
Os idiomas escolhidos no Lingo.dev precisam corresponder exatamente aos códigos em localization.locales. Se o Payload tiver en e de, escolha English e German, não English (United States): en-US e en são idiomas diferentes. Use o defaultLocale do seu Payload como idioma de origem, porque é esse idioma que o plugin monitora para detectar alterações.
Conecte sua instância do Payload#
Abra a integração
Vá para Studio -> All integrations e clique em Connect no card do Payload CMS.
Informe os dados da sua instância
| Campo | O que preencher |
|---|---|
| Endereço | A URL raiz da sua instância, por exemplo https://cms.example.com. Apenas HTTPS |
| Coleção de autenticação | A collection à qual pertence sua chave de API de serviço, geralmente users |
| Chave de API | A chave de API do usuário de serviço |
| Headers personalizados | Opcional. Enviado em todas as solicitações para a sua instância. Clique em Add header para cada um ou cole uma linha Name: value para preencher uma linha. |
Clique em Verify instance. O Lingo.dev verifica a chave na sua instância antes de continuar.
Escolha o que traduzir
| Configuração | O que faz |
|---|---|
| Nome | Como você quer chamar esta conexão, como Production ou Staging, para diferenciar suas instâncias |
| Collections e Globals | Clique nos itens que devem ser traduzidos. Se no read + update aparecer riscado, o usuário de serviço não pode ler nem atualizar, então o item não pode ser selecionado até receber acesso |
| Engine | O engine de localização cujos glossário, regras e voz da marca essas traduções seguem |
| Idioma de origem | O idioma em que seus editores escrevem. Use o defaultLocale do Payload |
| Idiomas de destino | Os idiomas para os quais traduzir |
| Modo | Publish traduz apenas alterações publicadas e publica as traduções. Draft também traduz salvamentos em rascunho e grava as traduções como rascunhos. Veja Rascunhos vs. Publicado abaixo |
Clique em Connect.
Instale o plugin
A última etapa mostra sua Webhook URL. Copie agora. Ela aparece só uma vez. Salve como LINGO_WEBHOOK_URL no seu ambiente do Payload, depois instale o plugin e adicione à sua configuração:
pnpm add @lingo.dev/payloadcmsimport { buildConfig } from "payload";
import { lingo } from "@lingo.dev/payloadcms";
export default buildConfig({
// ...your collections, globals, and localization config
plugins: [
lingo({
webhookUrl: process.env.LINGO_WEBHOOK_URL,
}),
],
});Clique em Done e depois faça o redeploy do Payload. A partir daí, toda alteração publicada no idioma de origem é enviada ao Lingo.dev para tradução.
O que o plugin faz
Ele adiciona um endpoint GET /api/lingo/schema que informa ao Lingo.dev quais campos são textos localizados, além de um hook que avisa o Lingo.dev quando um documento ou global muda. Escopo, idiomas e engine ficam no dashboard, então você pode alterá-los sem fazer redeploy. Deixe webhookUrl de fora para pular o hook e iniciar todas as traduções pelo dashboard.
Escolha o que será traduzido#
A página de conexão tem quatro abas: Collections, Globals, Workflow runs e Configurações.
O escopo é definido por coleção e por global. As abas Collections e Globals listam tudo o que sua instância oferece, uma linha por item, junto com a data da última sincronização. Cada linha tem um botão Sync: ative-o e, a partir daí, todo documento dessa coleção ou desse global ficará incluído. A alteração é salva no momento em que você ativa o botão e vale para a próxima execução sem precisar de redeploy. O botão no cabeçalho da tabela ativa ou desativa o Sync para tudo na lista.
Uma linha marcada como no read + update está bloqueada: o usuário de serviço não pode ler nem atualizar esse item, então ele não pode ser traduzido. Uma linha marcada como not localized yet está com o Sync desativado.
Idiomas, engine e modo são alterados na aba Configurações.
Dentro de um documento, é a configuração de campos do Payload que determina o que será traduzido:
| Campo | Traduzido |
|---|---|
Campos text, textarea e richText marcados como localized: true | Sim |
Os mesmos tipos de campo dentro de um group, array, blocks ou tabs localizado | Sim |
| Blocks e inline blocks incorporados em rich text | Sim, os campos de texto delas seguem as mesmas regras |
select, radio, checkbox, number, date, relationship, upload, json, code, email, point | Não |
| Campos que não são localizados e não têm um campo pai localizado | Não |
id, blockType, blockName | Não |
O rich text é traduzido como uma árvore do Lexical. A formatação, os links, os uploads e a estrutura dos blocos são preservados, e apenas o texto interno é substituído. Uma frase dividida por texto em negrito ou por um link é traduzida como uma frase única.
Para incluir um campo no escopo, marque-o como localized: true no Payload e faça redeploy. Ele será considerado na próxima execução.
Sincronize e retraduza#
Execuções automáticas. Com webhookUrl definido no plugin, cada salvamento de um documento ou global no idioma de origem notifica o Lingo.dev. Salvamentos feitos em um curto intervalo de tempo são agrupados em uma única execução. Salvamentos em outros idiomas, salvamentos de rascunho (a menos que a conexão esteja no modo Draft) e conteúdo fora do seu escopo são ignorados.
Execuções manuais. Dois botões, dois trabalhos diferentes:
| Botão | O que faz | Quando usar |
|---|---|---|
| Sync | Traduz apenas o que mudou desde a última execução | Para preencher conteúdo existente após conectar ou tentar de novo depois de uma falha |
| Retranslate | Traduz tudo dentro do escopo de novo, do zero | Depois de mudar o glossário, a voz da marca ou as regras do seu engine |
Ambos ficam no cabeçalho da página, onde cobrem tudo com Sync ativado. Retranslate no cabeçalho pede confirmação antes. Para executar só algumas coleções ou globals, marque as linhas delas: Queue sync (N) e Queue retranslation (N) aparecem e cobrem apenas essas linhas. Uma linha só pode ser marcada depois que o botão Sync estiver ativado.
Nada é traduzido ao conectar. Para traduzir o que você já tem, clique em Sync no cabeçalho da página. Adicionar um idioma de destino depois funciona da mesma forma: o próximo Sync vai preenchê-lo.
Só uma execução pode ficar em andamento por conexão. As solicitações seguintes entram na Fila e começam em ordem.
Retranslate sobrescreve edições manuais
Retranslate regenera todos os campos traduzidos dentro do escopo, inclusive traduções que sua equipe editou manualmente no Payload. Já o Sync regenera apenas os campos cujo texto de origem mudou, então as edições manuais nos demais campos são preservadas.
Acompanhe uma execução#
A aba Workflow runs lista todas as execuções: quando começaram, o que as acionou (Webhook ou Manual, depois Sync ou Retranslate), quais idiomas cobriram, quanto tempo levaram e o status. Uma execução na fila ou em andamento tem um botão Stop. Abra uma linha para ver o resultado por idioma.
| Status | Significado |
|---|---|
| Na fila | Aguardando a execução anterior |
| Em andamento | Em progresso |
| Concluída | Todas as traduções foram gravadas de volta |
| Atualizado | Nada dentro do escopo mudou desde a última execução. Não é uma falha |
| Falhou | A execução foi interrompida. O motivo aparece na linha da execução |
| Cancelada | Interrompida por alguém da sua equipe |
Uma execução com falha mantém tudo o que já foi gravado. A mensagem de erro lista os documentos que não foram gravados, e a próxima Sync tenta gravá-los novamente. Se um editor salvar um documento no meio da execução, ele será ignorado e retomado na próxima execução.
Onde as traduções aparecem#
Cada tradução é gravada no mesmo documento ou global no idioma de destino, seguindo o próprio modelo de localização do Payload. Apenas os campos traduzidos são gravados. Todos os demais campos permanecem inalterados. As gravações de retorno são executadas como o usuário de serviço e não acionam uma nova execução.
As traduções existentes são mantidas. Na primeira sincronização de um documento, tudo o que já existir em um idioma de destino permanece no lugar, e apenas os campos ausentes são traduzidos. Um campo que ainda mantém o valor padrão do Payload conta como ausente. Use Retranslate para substituir traduções existentes.
Rascunhos vs. Publicado#
No modo Publish, apenas alterações publicadas iniciam uma execução, e as traduções são publicadas assim que são gravadas. O Payload publica o documento inteiro, então qualquer edição de rascunho ainda não publicada nele vai ao ar junto com a tradução.
No modo Draft, salvamentos de rascunho também iniciam execuções. O Lingo.dev lê o rascunho mais recente da origem e grava cada tradução como rascunho. Nada muda para seus leitores até que alguém publique a tradução no Payload. Use isso enquanto avalia a qualidade da tradução ou quando as traduções passam por revisão.
Você pode alterar o modo depois na aba Configurações.
Gerenciar a conexão#
Configurações#
A aba Configurações mostra a instância que a conexão lê, quais coleções e globals estão com Sync ativado e se a conexão está Working ou Cannot be reached. Ela permite alterar o nome, o idioma de origem, os idiomas de destino, o engine e o modo. Cada alteração mantém a webhook URL, então não é preciso fazer redeploy.
O endereço e a chave de API são definidos quando a conexão é criada e não podem ser alterados depois. Para fazer o Lingo.dev apontar para outro endereço ou outra chave, desconecte e conecte novamente.
Desconectar#
Disconnect na parte inferior da aba Configurações faz o Lingo.dev parar de ler e gravar na instância. Isso remove a conexão, o histórico de execuções e o registro do que foi traduzido. As traduções já gravadas permanecem no Payload. Depois, remova LINGO_WEBHOOK_URL ou o plugin da sua configuração.
Reconectar significa uma nova URL de webhook
Uma nova conexão recebe uma nova URL de webhook, então atualize LINGO_WEBHOOK_URL e faça redeploy antes que as execuções automáticas voltem a funcionar. A primeira sincronização relê todos os documentos dentro do escopo, mantém as traduções que o Payload já tem e preenche o que estiver faltando.
Limites#
| Limite | Detalhe |
|---|---|
| Versão do Payload | Payload 3 com localização configurada |
| Tipos de campo | Campos text, textarea e richText (apenas Lexical) marcados como localized |
| Escopo | Coleções e globais inteiros. Sem seleção por campo |
| Conexões | Vários por organização, um por instância do Payload |
| Execuções simultâneas | Um por conexão |
| Endereço | Apenas HTTPS |
Solução de problemas#
A conexão falha com "Payload rejected the API key". Verifique a chave, o slug da collection de autenticação e se useAPIKey está ativado nessa collection.
Uma coleção ou global mostra "no read + update". Dê ao usuário de serviço acesso de leitura e atualização na configuração de acesso dessa coleção e depois recarregue a página de conexão. O botão Sync da linha será desbloqueado.
A primeira execução falha com "The Lingo plugin isn't installed". Adicione @lingo.dev/payloadcms ao plugins da configuração do Payload e faça redeploy. Conectar funciona sem o plugin; sincronizar não.
Publicar no Payload não inicia uma execução. Verifique se LINGO_WEBHOOK_URL está definido, se localization está configurado, se a coleção ou global está dentro do escopo, se o salvamento foi no idioma de origem e se foi uma publicação, e não um rascunho, a menos que a conexão esteja no modo Draft.
Um campo não é traduzido. Ele não tem localized: true nele ou em um campo pai, ou não é um campo text, textarea ou richText.
A aba Configurações mostra a conexão como Cannot be reached. Verifique se a instância está no ar, se a chave ainda é válida e se os cabeçalhos de gateway continuam funcionando. O endereço e a chave não podem ser editados em uma conexão existente, então, se um deles mudou, desconecte, conecte novamente e atualize LINGO_WEBHOOK_URL com a nova webhook URL.