Free

Far scrivere a Claude thread di tweet multilingue senza sforare il limite

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.


Causa radice: X pesa il CJK doppio × Claude di default traduce letteralmente

Regole di conteggio caratteri di X

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.

La parola "translate" accende la modalità letterale di Claude

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:

  • EN: "Production 400/500 isn't like local. User's already staring at a blank screen after hitting Pay."
  • ZH letterale di Claude: "生产环境的 400/500 和本地并不相同。用户已经点击了『付款』并看着一个空白屏幕。" (40 caratteri cinesi)

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.

Il prompt che funziona: "riscrivere", non "tradurre"

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:

  1. "write" sostituisce "translate" — accende la modalità composizione di Claude, non traduzione.
  2. "fresh pass" / "same argument" — dà il permesso a Claude di riorganizzare le frasi.
  3. "don't preserve EN sentence structure" — blocca di petto il comportamento di default.
  4. "cut detail if needed" — autorizza a lasciare contenuto per la lunghezza (senza, Claude preserva ogni fatto e sfora).
  5. Budget esplicito per lingua — "≤ 140 chars" vale 100× più di "short".

Sanity check locale: Ruby + .length

Non 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:

  • Conteggio codepoint degli emoji (🧵 è 1 codepoint, ma alcuni emoji sono sequenze di più codepoint)
  • Caratteri a larghezza zero (ZWJ ecc.)

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×.

Trappole di emoji e backtick

Quando i tweet cinesi vanno tagliati, queste due categorie cadono per prime:

Backtick

Citazioni di codice come `kamal exec` mangiano 1 carattere per backtick nel contesto cinese — 2 caratteri per citazione, valore semantico zero. Soluzioni:

  • Usa due punti: "命令 kamal exec" batte "`kamal exec`"
  • Se proprio devi tenere backtick, solo sull'identificatore chiave, non su una riga di shell intera

Emoji

🧵 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).

Punteggiatura fullwidth vs halfwidth

  • Punteggiatura CJK (「」、,。——): 2 weight per carattere
  • Punteggiatura ASCII ("",-): 1 weight per carattere
  • Quando un tweet cinese mescola virgolette: usa le virgolette halfwidth ('X') — risparmia 2 caratteri per coppia rispetto al fullwidth (「X」)

Quattro direzioni di default di Claude da intercettare

Nel generare thread multilingue, blocca queste quattro:

1. Traduzione letterale con struttura EN preservata

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.

2. Nessun controllo lunghezza proattivo

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.

3. Ignorare il weight di virgolette ed emoji

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.

4. Posizione 🧵 incoerente

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.

Checklist

Sei regole per un primo draft di thread multilingue al limite:

  1. Di' "write", non "translate". Translate accende il letterale = struttura EN preservata = sfondamento.
  2. Budget esplicito per lingua. "≤ 140 chars" vale 100× più di "short".
  3. Permesso di tagliare contenuto. "cut detail if needed" dice a Claude che può perdere fatti per la lunghezza.
  4. Ruby .length locale come gate. Più preciso del conteggio di Claude, più veloce di un test su X.
  5. In cinese, taglia per primi backtick ed emoji. Ogni backtick mangia 1 carattere, ogni emoji 2.
  6. Fissa la posizione del 🧵 nel prompt. Claude non conosce le convenzioni dei thread di default.

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.