Free

Deixando o Claude traduzir um artigo para 19 idiomas

Um artigo em 19 idiomas: estrutura de arquivos, prompt de tradução, 5 armadilhas reais, como mandar POST de uma vez.


A documentação oficial da Anthropic e da OpenAI é só em inglês. Isso é uma lacuna gigante no ecossistema global de conteúdo para desenvolvedores de IA. how2claude está preenchendo esse buraco — cada artigo sai em 19 idiomas de uma vez: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th.

Contratar humanos não é viável (20 traduções por artigo, milhares de dólares cada). Deixar o Claude fazer derruba o custo marginal para quase zero — mas jogar "traduz pro japonês" por cima da cerca te devolve um texto com gostinho de tradução automática e a voz do autor sumida. O que vem aqui é o fluxo completo pra fazer isso direito: estrutura de arquivos, como escrever o prompt de tradução, onde o Claude vai quebrar com certeza, como mandar POST de 19 idiomas mais tweets por idioma pra API em uma chamada só.


A decisão central: tradução vs. localização

Duas coisas bem diferentes.

Tradução move significado do idioma A pro B — o que o Google Translate faz. Lê "correto" mas "plano".

Localização preserva o registro, ritmo e nível técnico do autor, reescrevendo na "voz de blog técnico" própria do idioma alvo. Lê como se tivesse sido escrito nativamente.

Tradução é trabalho de 5 minutos pro Claude; localização exige que o prompt soletre:

  • Quem é o leitor alvo (desenvolvedores, times técnicos)
  • Um registro de referência ("soa como tal blog")
  • Termos que têm que ficar no original (nomes de API, frameworks, comandos, URLs)
  • Onde recomposição é permitida (quebrar frases longas, trocar metáforas por outras que leitores nativos reconheçam)

O comando /write-article do how2claude embute um requisito de estilo por idioma:

Arquivo de idioma Requisito de estilo
ja.md Voz de blog técnico, japonês natural
ko.md Voz de blog técnico, coreano natural
zh-TW.md Uso taiwanês, caracteres tradicionais
ar.md Árabe padrão moderno (escrito)
id.md Indonésio padrão

Parece só mais uma linha. Mas pro Claude é decisiva — sem ela, por padrão, ele produz "tradução de livro didático".

Estrutura de arquivos: 19 idiomas morando num diretório

Um diretório por rascunho, 20 arquivos:

docs/drafts/let-claude-translate-articles/
├── meta.json        # title + summary de todos os 19 idiomas
├── zh.md            # chinês (fonte, escrito primeiro)
├── en.md            # inglês (primeira leva de traduções)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(mais 14)
└── th.md

meta.json:

{
  "category_slug": "use-cases",
  "series_slug": "writing",
  "free": true,
  "title": {
    "zh": "让 Claude 把一篇文章翻译成 19 种语言",
    "en": "Letting Claude Translate One Article Into 19 Languages",
    "pt-BR": "Deixando o Claude traduzir um artigo para 19 idiomas",
    "...": "..."
  },
  "summary": {
    "pt-BR": "Um artigo em 19 idiomas: estrutura de arquivos, prompt de tradução, 5 armadilhas reais, como mandar POST de uma vez.",
    "...": "..."
  }
}

A primeira linha de cada arquivo .md é # título, o resto é corpo. Title não sai da primeira linha do md — sai do meta.json, assim cada idioma tem um título polido em vez da frase de abertura do artigo que pode ter esticado na tradução.

O fluxo: escrever zh, depois irradiar pros 18

Dois fluxos pra evitar:

Errado: tradução em cadeia. zh → en → ja → ko → ...
Problema: ja é baseado em en, ko em ja — cada pulo vaza um pouco de significado. Quando chega em th (tailandês), já é informação de quarta mão.

Certo: tradução radial. Fecha o zh → gera en / ja / ko / ar / id / ... todos direto da fonte.
Todo idioma vem direto do original, sem escalas.

Forma do prompt (empacotado dentro de /write-article):

Este é um artigo de blog técnico sobre X, fonte em chinês:
[zh.md completo]

Traduza pros idiomas abaixo, com estes requisitos por idioma:
- ja.md: voz de blog técnico, japonês natural
- ko.md: voz de blog técnico, coreano natural
- ar.md: árabe padrão moderno (escrito)
...

Regras:
1. Preserve o registro direto, profissional e levemente autoirônico do autor
2. Não traduzir blocos de código, comandos, nomes de API, URLs
3. Títulos, subtítulos e fluxo de parágrafos podem ser recompostos
4. Produzir um title separado por idioma — curto, com gancho, não tradução literal

Traduzir 18 idiomas em paralelo, uma sessão do Claude. Um detalhe chave: fazer na mesma sessão / mesma versão de modelo — a voz desvia entre sessões e entre gerações de modelo.

5 lugares onde realmente quebra

1. Limites de caracteres de tweet variam por idioma

X conta caracteres CJK (chinês/japonês/coreano) mais rigorosamente. Pedi pro Claude gerar tweets com essa restrição:

  • Tweets em chinês ≤ 140 caracteres
  • Outros idiomas ≤ 280 caracteres

Na primeira rodada, três tweets em chinês estouraram (160, 164, 152). Claude tinha traduzido os tweets em inglês ao pé da letra — um tweet inglês de 260 caracteres vira chinês bem em cima do limite.

Regra: tweets em chinês têm que ser reescritos, não traduzidos. Requisitos: teto de 140 caracteres, gancho obrigatório, perda de detalhe permitida.

2. zh-TW não é conversão de caracteres

zhzh-TW convida à preguiça: joga num conversor de simplificado-pra-tradicional. Os caracteres batem, o vocabulário não:

zh zh-TW (errado) zh-TW (certo)
文件 文件 檔案
信息 信息 資訊
软件 軟件 軟體
视频 視頻 影片

Ao pedir zh-TW pro Claude, diga os dois: "uso taiwanês, caracteres tradicionais". "Só tradicional" te dá uma conversão de caracteres.

3. Idiomas RTL (ar, he) quebram o layout

Árabe e hebraico leem da direita pra esquerda. No lado Rails precisa de <html dir="rtl"> e das variantes rtl: do Tailwind. Mas a tradução em si tem pegadinhas:

  • Blocos de código ficam em inglês, mas quando um parágrafo árabe envolve um bloco de código, o navegador precisa de unicode-bidi: isolate ou o código é "sugado" pro fluxo RTL
  • Pontuação mista: árabe usa ، em vez de ,, ؟ em vez de ?. Claude por padrão usa pontuação inglesa; precisa soletrar
  • Direção de números: árabe escreve dígitos da esquerda pra direita (2026) dentro de um parágrafo da direita pra esquerda. Navegadores lidam com isso, mas Claude muitas vezes mistura no texto cru

4. Claude por padrão "aplaina" a voz do autor

As frases coloquiais do original ("mete de uma vez só", "piso na bola", "levei um caldo") Claude traduz pra japonês/coreano como formas escritas formais (「一気に実装」「落とし穴」「失敗」) — o sentido bate, o tom evapora.

Correção: soletrar no prompt — "preserve a voz de blog técnico direta, levemente autoirônica e informal; sem academizar". Mesmo assim, alguns idiomas (alemão, russo) vão pousar um pouco mais "formais" que a fonte — os próprios idiomas têm um viés de registro escrito.

5. Placeholders e variáveis não se traduzem

As strings dentro de código estão em dois baldes — texto de UI (traduzir) e placeholders/nomes de variável (não):

t("pricing.page_title")        # não traduzir (i18n key)
"user_id"                      # não traduzir (nome de variável)
"Monthly subscription"         # mostrado como exemplo no texto → não traduzir

Pra qualquer coisa adjacente a código, "não traduzir" é o default mais seguro. Traduzir arquivos de locale i18n (config/locales/xx.yml) é outra tarefa.

Publicando: um POST, 19 idiomas

/publish-article faz POST do rascunho pra how2claude.com/api/articles:

{
  "category_slug": "use-cases",
  "series_slug": "writing",
  "free": true,
  "thread": true,
  "title":   { "zh": "...", "en": "...", "ja": "...", ... },
  "summary": { "zh": "...", "en": "...", ... },
  "content": { "zh": "<md>", "en": "<md>", ... },
  "tweets":  { "en": ["...", "..."], "zh": [...], ... }
}

Uma requisição tem ~300KB (19 idiomas × ~15KB). Servidor divide em tabelas:

  • tabela articles, title / summary / content são jsonb chaveados por locale
  • tabela x_queue_tweets, por locale + conta, despachada numa fila de agendamento

Tweets só saem pros locales com conta X conectada (atualmente en/zh/ja/ko/ar/id — 6). Idiomas sem conta mandam []. Consultando contas:

Account.all.each { |a| puts "#{a.locale}: #{a.name}" }
# en: @how2claude
# zh: @howtoclaude
# ja: @how2claude_ja
# ko: @how2claude_ko
# ar: @how2claude_ar
# id: @how2claude_id

Checklist

Deixando o Claude traduzir um artigo pra 19 idiomas — checklist completo:

  1. Fechar zh (ou en) primeiro, depois irradiar as outras 18 traduções dessa fonte. Não encadeie.
  2. Requisito de estilo por idioma no prompt. "Japonês natural" não basta — diga "voz de blog técnico, japonês natural".
  3. Traduzir title e summary separados, não puxar do primeiro parágrafo do corpo. Todos os 19 titles/summaries centralizados no meta.json.
  4. Listar explicitamente o que não traduz: blocos de código, comandos, nomes de API, URLs, chaves i18n, nomes de variáveis. Se traduz: texto explicativo, metáforas, estrutura de parágrafos.
  5. Tweets têm que ser reescritos, não traduzidos. 140 caracteres pra chinês, 280 pro resto. Tradução literal inglês-pra-chinês sempre passa do limite.
  6. Pra zh-TW diga "uso taiwanês + caracteres tradicionais"; senão, pega só conversão de caracteres e o vocabulário fica continental.
  7. Idiomas RTL (ar, he) precisam de dir="rtl" + variantes rtl: do Tailwind no lado Rails. Pontuação mista e isolamento de bloco de código são tratados à parte.
  8. POST de todos os idiomas de uma vez — 19 content + 19 title/summary + tweets pra cada conta conectada, uma requisição pro backend.

O gargalo real não é qualidade de tradução — modelos classe Claude 4 traduzem pra japonês/coreano/árabe/russo com qualidade quase nativa. O gargalo é se você tá disposto a pôr um artigo na frente de leitores em 19 idiomas. Tecnicamente leva 5 minutos. Em termos de conteúdo, exige vontade de servir 200x a audiência de uma vez.