← Voltar aos artigos
Web 2026-04-17 · rev. 2026-05-10 ProtoMedia

Um site que fala dezenas de idiomas, sem tradutores

Traduzido automaticamente do italiano · ler o original

Como construímos o sistema de tradução que roda sob estas páginas: IA quando necessário, cache sempre, zero espera percebida.

O problema da i18n tradicional

Por anos, a internacionalização de um site web tem sido uma pequena odisseia de workflow: arquivos .po, tradutores humanos, chaves esquecidas, deploys atrasados porque "ainda falta o alemão". Adicionar um idioma custava tempo e dinheiro; adicionar dez era fora de questão para qualquer pequena empresa.

Com os LLMs de última geração, a qualidade da tradução automática chegou a um ponto em que — para um site empresarial, não para a literatura — é suficiente. A pergunta não é mais "podemos traduzir automaticamente", mas "como o integramos sem quebrar a experiência do usuário".

A arquitetura, em resumo

O site é servido estaticamente em italiano. Quando um usuário escolhe outro idioma, entra em jogo um pequeno motor sobre três coleções MongoDB:

  • i18n_base: os textos de origem no idioma escolhido (hoje italiano), cada um com a declaração do seu idioma, uma descrição de onde e por que aparece no site (essencial para a qualidade da tradução), tom e limite de caracteres. Esta descrição se torna parte do prompt para o LLM, que assim sabe se está traduzindo um botão ou um parágrafo.
  • i18n_human: as traduções revisadas manualmente, quando para alguma página queremos qualidade editorial em vez do output do LLM. Têm prioridade sobre o cache automático e se "desmarcam" automaticamente quando o texto de origem muda.
  • i18n_cache: as traduções já geradas, indexadas por (campo, idioma). Cada entrada conserva o timestamp do texto base no momento da geração.
  • articoli_i18n: mesma lógica aplicada aos conteúdos mais longos, como este artigo.

Ao primeiro acesso em um novo idioma, o sistema pede ao LLM apenas os campos realmente ausentes, salva a resposta no cache e a retorna ao navegador. Nas visitas subsequentes, o mesmo idioma chega instantaneamente, sem mais chamadas de IA.

A invalidação que funciona

Um cache é uma mentira organizada: diz "a minha verdade é esta" até que alguém a desminta. O mecanismo de desmentido aqui é simples: cada tradução em cache armazena o timestamp do texto base que a gerou. Quando você modifica o texto italiano e atualiza o seu updated_at, todas as traduções desse campo em todos os idiomas ficam automaticamente desatualizadas e são regeneradas quando necessário. Zero cascatas manuais, nenhum cache para esvaziar.

O usuário que não espera

A parte mais interessante não é a tradução — é como ela é mostrada. Na troca de idioma, o navegador tem diante de si uma página italiana com pequenos spinners ao lado de cada bloco de texto a ser atualizado. A tentação é fazer uma única chamada que traduza tudo junto: simples, limpo, e condena o usuário a esperar que o LLM termine tudo antes de ver qualquer mudança.

Nós tomamos a direção oposta. Os textos são agrupados por seção (navbar, corpo, footer) e divididos em micro-batches de três campos cada. As chamadas partem em sequência: primeiro os poucos campos da navbar, que aparecem em poucos segundos — o usuário vê que algo está acontecendo e começa a ler. Enquanto lê, chega a primeira parte do corpo, depois a segunda, finalmente o footer.

A lição em resumo: A velocidade percebida não é a velocidade total. Traduzir um pedaço de cada vez, em ordem visível, conta mais do que terminar primeiro.

O trabalho noturno

Um cache tem um único verdadeiro inimigo: a primeira visita. O primeiro usuário alemão paga o preço de todas as traduções futuras, e a sua experiência é aquela que lhe fica na cabeça. Para eliminar (ou quase) o problema, um task em background acorda a cada minuto, escolhe a língua mais esperada entre as ainda incompletas, pega um texto não traduzido e o faz passar pelo LLM. No minuto seguinte, o próximo. Em poucos dias as línguas mais difundidas já estão todas quentes.

O task noturno também faz um segundo trabalho: revê automaticamente as traduções de qualidade duvidosa, tentando-as novamente com um modelo AI diferente. Quando o alinhamento entre línguas é importante, uma tradução medíocre não permanece assim.

Se você for o primeiro alemão do dia e chegar enquanto o sistema ainda está finalizando o cache, você ainda tem o carregamento progressivo para o manter ocupado. Se for o segundo, você nem percebe.

O que se leva para casa

Um site multilíngue sem tradutores, sem arquivos para gerenciar, sem deploy para adicionar um idioma. O usuário digita um código — ja, ca, eu, o que quiser — e a página é traduzida. A segunda vez é instantânea. Na terceira, muito provavelmente já chegamos lá, traduzida no momento certo por uma tarefa que não dorme nunca.

Esta mesma página, se você a estiver lendo em alemão, em espanhol, em coreano, não foi escrita nenhuma vez por um tradutor. Foi traduzida uma vez só, por um LLM, e desde então é servida do cache. A única coisa escrita à mão é o que você está lendo agora se estiver em italiano.

Interessado em levar esta arquitetura para o seu site? Vamos conversar.

Contate-nos

Tem um comentário? Escreva-nos

A mensagem chega apenas para nós. Se o seu comentário for interessante, poderemos publicá-lo ao final do artigo, mas somente após avaliação.

Enquanto você escreve, seu navegador resolve um pequeno cálculo – nossa forma de bloquear spam sem usar serviços externos ou pedir que identifique semáforos. Nada é solicitado e nenhum dado sai deste site.