I thread multilingue non sono un problema di traduzione: dì 'write', non 'translate', e filtra le bozze con uno script .length locale.
Oggi ho pubblicato 5 articoli. Ciascuno ha un thread di tweet in 6 lingue (en / zh / ja / ko / ar / id), 4 tweet per lingua — 120 tweet in totale.
4 su 5 hanno richiesto tagli al thread cinese. Numeri grezzi (stampati dallo script, formato chars/limit):
zh[1]=160/140 OVER
zh[2]=164/140 OVER
zh[3]=152/140 OVER
...
id[3]=286/280 OVER
zh[2]=163/140 OVER
zh[3]=148/140 OVER
zh[2]=152/140 OVER
Sempre lo stesso schema: prima scrivo i quattro tweet in inglese (ognuno 230–260 caratteri, vicino al tetto di 280), poi chiedo a Claude di "generare la versione cinese da questi quattro". La versione cinese sfora i 140 quasi ogni volta.
Non è un bug, è la parola sbagliata. Nel momento in cui dici "translate", Claude parte a fare frase per frase — ma un thread multilingue non è un problema di traduzione. Ogni lingua va scritta da zero rispetto al suo budget di caratteri. Questo post spiega come ottenere un primo draft già vicino al limite, senza spendere 3–5 giri a tagliare.
Il limite di X non è "numero di caratteri" ma weighted characters:
- Lettere latine, cifre, punteggiatura: 1 weight per carattere
- CJK (cinese/giapponese/coreano), alcuni emoji: 2 weight per carattere
- Tetto totale per tweet: 280 weight
Effetto pratico:
- Tweet inglese: tetto 280 caratteri
- Tweet puro cinese: tetto 140 caratteri (140 × 2 = 280)
- Mix: ogni carattere vale 1 o 2
Quindi "tradurre un tweet inglese di 260 caratteri in cinese" non dà una versione cinese di 260 caratteri — la versione cinese ha ~130 caratteri reali di spazio. Tutte le punteggiature, virgolette e backtick dell'originale inglese occupano ancora spazio, e ogni carattere cinese conta doppio. Tradurre letterale garantisce quasi sempre lo sfondamento.
Quando Claude vede "translate these 4 EN tweets to ZH", la prima mossa è preservare la struttura della frase inglese e cambiare solo le parole in cinese:
Il senso è giusto, ma:
- Preserva "并不相同" (un carattere più lungo di "不同")
- Preserva "已经点击了" ("刚点完" è più corto)
- Preserva "并看着一个空白屏幕" ("看着空白屏" è più corto)
Ogni ridondanza preservata mangia caratteri. Cumulata su 4 tweet, 20–40 caratteri di troppo arrivano facili, e hai sforato.
Confronta le due formulazioni:
Non funziona:
"Translate these 4 English tweets to Chinese, Japanese, Korean, Arabic, Indonesian."
Funziona:
"For each of these 4 points, write a thread in ZH / JA / KO / AR / ID. Each language gets a fresh pass — same argument, adjusted for that language's tweet budget.
- ZH: ≤ 140 chars per tweet, hook-first, cut detail if needed
- other languages: ≤ 280 chars
- use each language's natural phrasing, don't preserve EN sentence structure
- each tweet must be self-contained but add 🧵 only on tweet 1"
Le differenze:
.lengthNon contare a occhio. Scrivi un piccolo script che gira su ogni draft:
tweets.each do |loc, list|
list.each_with_index do |t, i|
len = t.length
limit = loc == "zh" ? 140 : 280
status = len > limit ? "OVER" : "ok"
puts "#{loc}[#{i}]=#{len}/#{limit} #{status}"
end
end
String#length di Ruby ritorna codepoint Unicode — ogni carattere CJK conta come 1. X pesa il CJK con weight 2, ma il limite di un tweet cinese è 140 codepoint (perché 140 × 2 = 280 weighted), quindi .length si allinea direttamente col tetto di X. I casi limite:
Per la grande maggioranza dei tweet CJK, .length di Ruby sta entro ±1 dal conteggio di X. Usarlo come gate locale batte testare pubblicando su X 100×.
Quando i tweet cinesi vanno tagliati, queste due categorie cadono per prime:
Citazioni di codice come `kamal exec` mangiano 1 carattere per backtick nel contesto cinese — 2 caratteri per citazione, valore semantico zero. Soluzioni:
`kamal exec`"🧵 solo sul tweet 1. Gli altri emoji nei tweet cinesi — pensaci due volte. Ogni emoji costa di fatto 2 caratteri (1 codepoint + a volte modificatori ZWJ).
'X') — risparmia 2 caratteri per coppia rispetto al fullwidth (「X」)Nel generare thread multilingue, blocca queste quattro:
Sintomo: frasi cinesi con espressioni come "并不相同", "已经点击了", "一个空白屏幕" — calchi evidenti dall'inglese.
Blocco: scrivi "don't preserve EN sentence structure" / "use natural ZH phrasing" direttamente nel prompt.
Sintomo: Claude finisce, dice "done", l'output sfora, e lui non se ne accorge.
Blocco: chiedi a Claude di contare la lunghezza di ogni tweet ("count each tweet's char length and flag any over the limit"), o metti uno script locale come gate. Io scelgo lo script — Ruby è più preciso di Claude.
Sintomo: quando Claude conta, dimentica il weight extra di emoji e virgolette fullwidth.
Blocco: non chiedere a Claude "sforato?" — esegui .length localmente e fagli tagliare sui numeri.
Sintomo: a volte ogni tweet ha 🧵, a volte solo il tweet 1, a volte atterra sul 4/4.
Blocco: fissalo nel prompt — "🧵 only on tweet 1". Claude non conosce di default le convenzioni visive di un thread.
Sei regole per un primo draft di thread multilingue al limite:
"cut detail if needed" dice a Claude che può perdere fatti per la lunghezza..length locale come gate. Più preciso del conteggio di Claude, più veloce di un test su X.L'intuizione vera: Claude sa scrivere thread multilingue corretti — ma la sua reazione di default è "tradurre". Il tuo lavoro è girarlo via prompt verso "comporre indipendentemente per lingua". Con il gate .length, il thread cinese dell'ultimo articolo di oggi è uscito 140/140 al primo draft. Senza tagli.