Un articolo in 19 lingue: struttura file, prompt di traduzione, 5 trappole reali, come fare POST in un colpo solo.
La documentazione ufficiale di Anthropic e OpenAI è solo in inglese. È un vuoto enorme nell'ecosistema globale di contenuti per sviluppatori AI. how2claude sta colmando quel vuoto — ogni articolo esce in 19 lingue contemporaneamente: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th.
Assumere traduttori umani non regge (20 traduzioni per articolo, migliaia di dollari ciascuna). Lasciare che lo faccia Claude porta il costo marginale praticamente a zero — ma scaraventare un "traducilo in giapponese" oltre lo steccato ti restituisce un testo con un forte aroma da traduzione automatica e la voce dell'autore svaporata. Quello che segue è il flusso completo per farlo bene: struttura dei file, come scrivere il prompt di traduzione, dove Claude sbanda di sicuro, come fare POST di 19 lingue più i tweet per lingua all'API in una sola chiamata.
Due cose molto diverse.
La traduzione sposta il significato dalla lingua A alla B — quello che fa Google Translate. Si legge "corretto" ma "piatto".
La localizzazione preserva il registro, il ritmo e il livello tecnico dell'autore, riscrivendo nella "voce da blog tecnico" propria della lingua di arrivo. Il risultato si legge come se fosse stato scritto da un madrelingua.
Tradurre per Claude è un lavoro da 5 minuti; localizzare richiede che il prompt specifichi:
Il comando /write-article di how2claude incorpora un requisito di stile per lingua:
| File di lingua | Requisito di stile |
|---|---|
ja.md |
Voce da blog tecnico, giapponese naturale |
ko.md |
Voce da blog tecnico, coreano naturale |
zh-TW.md |
Uso taiwanese, caratteri tradizionali |
ar.md |
Arabo standard moderno (scritto) |
id.md |
Indonesiano standard |
Sembra solo una riga in più. Ma per Claude è determinante — senza di essa, il default è "traduzione da manuale scolastico".
Una directory per bozza, 20 file:
docs/drafts/let-claude-translate-articles/
├── meta.json # title + summary per tutte e 19 le lingue
├── zh.md # cinese (sorgente, scritto per primo)
├── en.md # inglese (prima tornata di traduzioni)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(altre 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",
"it": "Lasciare che Claude traduca un articolo in 19 lingue",
"...": "..."
},
"summary": {
"it": "Un articolo in 19 lingue: struttura file, prompt di traduzione, 5 trappole reali, come fare POST in un colpo solo.",
"...": "..."
}
}
La prima riga di ogni file .md è # titolo, il resto è il corpo. Il title non si prende dalla prima riga del md — si prende da meta.json, così ogni lingua ha un titolo levigato corto, non la frase di apertura dell'articolo che in traduzione potrebbe essersi dilatata.
Due flussi da evitare:
Sbagliato: traduzione a catena. zh → en → ja → ko → ...
Problema: ja si basa su en, ko su ja — ogni salto perde un po' di significato. Arrivati a th (thailandese), è informazione di quarta mano.
Giusto: traduzione radiale. Finalizzare zh → generare en / ja / ko / ar / id / ... tutti direttamente dalla sorgente.
Ogni lingua esce direttamente dall'originale, senza tappe intermedie.
Struttura del prompt (impacchettata dentro /write-article):
Questo è un articolo di blog tecnico su X, sorgente cinese:
[zh.md intero]
Traduci nelle lingue seguenti, con i requisiti per lingua:
- ja.md: voce da blog tecnico, giapponese naturale
- ko.md: voce da blog tecnico, coreano naturale
- ar.md: arabo standard moderno (scritto)
...
Regole:
1. Preserva il registro diretto, professionale, leggermente autoironico dell'autore
2. Non tradurre blocchi di codice, comandi, nomi di API, URL
3. Titoli, sottotitoli, flusso dei paragrafi possono essere ricomposti
4. Produci un title separato per lingua — corto, con un gancio, non traduzione letterale del titolo originale
Tradurre 18 lingue in parallelo, una sessione Claude risolve tutto. Un dettaglio chiave: farlo nella stessa sessione / stessa versione di modello — la voce deriva tra sessioni e tra generazioni di modello.
X conta i caratteri CJK (cinese/giapponese/coreano) in modo più rigido. Ho fatto generare a Claude i tweet con questo vincolo:
Al primo giro, tre tweet cinesi sforavano (160, 164, 152). Claude aveva tradotto letteralmente i tweet inglesi — un tweet inglese da 260 caratteri tradotto in cinese finisce proprio al limite.
Regola: i tweet in cinese vanno riscritti, non tradotti. Requisiti: tetto 140 caratteri, gancio obbligatorio, perdita di dettaglio ammessa.
zh → zh-TW invita alla pigrizia: passarlo per un convertitore semplificato-a-tradizionale. I caratteri tornano, il lessico no:
| zh | zh-TW (sbagliato) | zh-TW (giusto) |
|---|---|---|
| 文件 | 文件 | 檔案 |
| 信息 | 信息 | 資訊 |
| 软件 | 軟件 | 軟體 |
| 视频 | 視頻 | 影片 |
Quando chiedi zh-TW a Claude, dillo in due pezzi: "uso taiwanese, caratteri tradizionali". "Solo tradizionale" dà una conversione di caratteri.
Arabo ed ebraico si leggono da destra a sinistra. Lato Rails serve <html dir="rtl"> e le varianti rtl: di Tailwind. Ma la traduzione in sé ha trappole:
unicode-bidi: isolate, altrimenti il codice viene "risucchiato" nel flusso RTL، al posto di ,, ؟ al posto di ?. Claude di default usa punteggiatura inglese; va esplicitato2026) dentro un paragrafo che scorre da destra a sinistra. I browser gestiscono, ma Claude spesso fa confusione nel testo grezzoLe espressioni colloquiali dell'originale ("tutto d'un fiato", "ho messo il piede in fallo", "sono rimasto in mezzo alla strada") Claude le traduce in giapponese/coreano con forme scritte formali (「一気に実装」「落とし穴」「失敗」) — il senso corrisponde, il tono svanisce.
Rimedio: scriverlo nel prompt — "preserva la voce da blog tecnico diretta, leggermente autoironica, informale; niente accademismi". Anche così, alcune lingue (tedesco, russo) atterrano un pelo più "formali" della sorgente — le lingue stesse hanno un bias verso il registro scritto.
Le stringhe nel codice stanno in due secchi — testo di UI (si traduce) e placeholder/nomi di variabile (no):
t("pricing.page_title") # non tradurre (i18n key)
"user_id" # non tradurre (nome di variabile)
"Monthly subscription" # mostrato come esempio nel testo → non tradurre
Per qualsiasi cosa adiacente al codice, "non tradurre" è il default più sicuro. Ciò che va davvero tradotto sono i file di locale i18n (config/locales/xx.yml), e quello è un altro lavoro.
/publish-article fa POST della bozza su 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": [...], ... }
}
Una richiesta pesa ~300KB (19 lingue × ~15KB). Il server smista su tabelle DB:
articles, title / summary / content sono jsonb indicizzati per localex_queue_tweets, per locale + account, spediti a una coda di schedulingI tweet partono solo verso i locale con account X collegato (attualmente en/zh/ja/ko/ar/id — 6). Le lingue senza account mandano []. Interrogare gli account:
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
Lasciare che Claude traduca un articolo in 19 lingue — checklist completa:
dir="rtl" + varianti rtl: di Tailwind lato Rails. Punteggiatura mista e isolamento dei blocchi di codice si gestiscono a parte.Il vero collo di bottiglia non è la qualità della traduzione — i modelli classe Claude 4 traducono in giapponese/coreano/arabo/russo con qualità vicina al madrelingua. Il collo di bottiglia è se sei disposto a mettere un articolo davanti a lettori in 19 lingue contemporaneamente. Tecnicamente servono 5 minuti. Sul piano dei contenuti, serve la volontà di servire 200× l'audience in una volta sola.