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ó.
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:
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".
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.
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.
X conta caracteres CJK (chinês/japonês/coreano) mais rigorosamente. Pedi pro Claude gerar tweets com essa restrição:
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.
zh → zh-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.
Á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:
unicode-bidi: isolate ou o código é "sugado" pro fluxo RTL، em vez de ,, ؟ em vez de ?. Claude por padrão usa pontuação inglesa; precisa soletrar2026) dentro de um parágrafo da direita pra esquerda. Navegadores lidam com isso, mas Claude muitas vezes mistura no texto cruAs 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.
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.
/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:
articles, title / summary / content são jsonb chaveados por localex_queue_tweets, por locale + conta, despachada numa fila de agendamentoTweets 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
Deixando o Claude traduzir um artigo pra 19 idiomas — checklist completo:
dir="rtl" + variantes rtl: do Tailwind no lado Rails. Pontuação mista e isolamento de bloco de código são tratados à parte.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.