Free

Як змусити Claude писати багатомовні треди в Twitter без перевищення ліміту

Багатомовні треди — не задача перекладу: кажіть «write», а не «translate», і фільтруйте чернетки локальним .length-скриптом.


Сьогодні опублікував 5 статей. До кожної — тред твітів на 6 мовах (en / zh / ja / ko / ar / id), по 4 твіти на мову — разом 120 твітів.

У 4 з 5 довелося різати китайський тред. Сирі числа (скрипт виводить у форматі 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

Завжди той самий шаблон: спершу пишу чотири англійські твіти (по 230–260 символів, впритул до 280), потім прошу Claude «згенерувати китайську версію з цих чотирьох». Китайська версія майже завжди виходить за 140.

Це не баг, це не те слово. У мить, коли ви кажете «translate», Claude переходить у режим «рядок за рядком» — але багатомовний тред не є задачею перекладу. Кожну мову треба писати з нуля під її власний бюджет символів. Цей пост — про те, як отримати перший чорновик Claude одразу близько до ліміту, без 3–5 раундів обрізання.


Корінна причина: X рахує CJK з вагою 2 × Claude за замовчуванням перекладає дослівно

Як X рахує символи

Ліміт довжини в X — не «кількість символів», а weighted characters:
- Латиниця, цифри, пунктуація: 1 weight на символ
- CJK-символи (китайська/японська/корейська), деякі емодзі: 2 weight на символ
- Загальна стеля на твіт: 280 weight

На практиці:
- Англійський твіт: стеля 280 символів
- Чисто китайський твіт: стеля 140 символів (140 × 2 = 280)
- Змішаний: посимвольно 1 або 2

Отже «перекласти англійський твіт на 260 символів у китайську» не дає китайської версії на 260 символів — у китайській версії реально близько 130 символів простору. Уся пунктуація, лапки і бектики з англійського оригіналу й далі займають місце, а кожен китайський символ рахується вдвічі. Дослівний переклад майже гарантує виліт.

Слово «translate» вмикає дослівний режим Claude

Побачивши «translate these 4 EN tweets to ZH», Claude першим ділом зберігає структуру англійського речення і змінює лише слова на китайські:

  • EN: «Production 400/500 isn't like local. User's already staring at a blank screen after hitting Pay.»
  • Дослівний ZH Claude: «生产环境的 400/500 和本地并不相同。用户已经点击了『付款』并看着一个空白屏幕。» (40 китайських символів)

Сенс правильний, але:
- Збережено «并不相同» (на символ довше за «不同»)
- Збережено «已经点击了» («刚点完» коротше)
- Збережено «并看着一个空白屏幕» («看着空白屏» коротше)

Кожна збережена надлишковість з'їдає символи. Накопичені по 4 твітах 20–40 зайвих символів — легко, і ліміт уже порушено.

Робочий промпт: «переписати», а не «перекласти»

Порівняйте два формулювання:

Що не працює:

«Translate these 4 English tweets to Chinese, Japanese, Korean, Arabic, Indonesian.»

Що працює:

«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»

Відмінності:

  1. «write» замість «translate» — вмикає у Claude режим композиції, а не перекладу.
  2. «fresh pass» / «same argument» — дає дозвіл переставляти речення.
  3. «don't preserve EN sentence structure» — напряму блокує дефолтну поведінку.
  4. «cut detail if needed» — дає дозвіл викидати контент заради довжини (без цього Claude тримає всі факти й вилітає).
  5. Явний бюджет на мову — «≤ 140 chars» працює в 100 разів краще за «short».

Локальний sanity-check: Ruby + .length

Не рахуйте на око. Невеликий скрипт, що запускається на кожному чорновику:

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 у Ruby повертає Unicode-кодпойнти — кожен CJK-символ рахується як 1. X важить CJK із 2, але ліміт китайського твіта — 140 кодпойнтів (бо 140 × 2 = 280 weighted), тому .length напряму збігається зі стелею X. Крайні випадки:

  • Число кодпойнтів у емодзі (🧵 — 1 кодпойнт, але деякі емодзі — послідовності з кількох)
  • Zero-width-символи (ZWJ тощо)

Для переважної більшості CJK-твітів .length Ruby відрізняється від лічби X на ±1. Використовувати як локальний шлюз краще за тестовий постинг у 100 разів.

Пастки емодзі та бектиків

Коли китайський твіт треба різати, першими летять ці дві категорії:

Бектики

Цитування коду на кшталт `kamal exec` у китайському контексті з'їдає 1 символ на кожен бектик — 2 символи на цитату, нуль семантики. Рішення:

  • Ставте двокрапку: «命令 kamal exec» коротше за «`kamal exec`»
  • Якщо бектики потрібні — лише на ключовий ідентифікатор, не на весь shell-рядок

Емодзі

🧵 — лише в першому твіті. Інші емодзі в китайських твітах — подумайте двічі. Кожен емодзі фактично коштує 2 символи (1 кодпойнт + інколи ZWJ-модифікатори).

Fullwidth vs halfwidth пунктуація

  • CJK-пунктуація (「」、,。——): 2 weight на символ
  • ASCII-пунктуація ("",-): 1 weight на символ
  • Якщо в китайському твіті змішуються лапки: використовуйте halfwidth-лапки ('X') — економія 2 символи на пару порівняно з fullwidth (「X」)

Чотири дефолтні відхилення Claude, які варто перехоплювати

При генерації багатомовних тредів блокуйте ці чотири:

1. Дослівний переклад зі збереженням EN-структури

Симптом: китайські фрази на кшталт «并不相同», «已经点击了», «一个空白屏幕» — явні кальки з англійської.

Блок: пишіть у промпті «don't preserve EN sentence structure» / «use natural ZH phrasing».

2. Відсутність проактивної перевірки довжини

Симптом: Claude закінчує і каже «done», на виході — перевищення, і він цього не помічає.

Блок: попросіть Claude самостійно рахувати довжину кожного твіта («count each tweet's char length and flag any over the limit»), або поставте локальний скрипт як шлюз. Я обираю скрипт — Ruby точніше.

3. Ігнорування weight лапок та емодзі

Симптом: коли Claude рахує, він забуває про додатковий weight емодзі та fullwidth-лапок.

Блок: не питайте Claude «ліміт перевищено?» — запустіть .length локально і за числами попросіть скоротити.

4. Непослідовна позиція 🧵

Симптом: іноді 🧵 на кожному твіті, іноді лише на першому, іноді опиняється на 4/4.

Блок: зафіксуйте в промпті — «🧵 only on tweet 1». Claude за замовчуванням не знає візуальних конвенцій тредів.

Чекліст

Шість правил, щоб перший чорновик багатомовного треда був впритул до ліміту:

  1. Кажіть «write», а не «translate». Translate вмикає дослівність = збереження EN-структури = виліт.
  2. Явний бюджет на мову. «≤ 140 chars» у 100× краще за «short».
  3. Дозвіл різати контент. "cut detail if needed" каже Claude, що факти можна втрачати заради довжини.
  4. Локальний Ruby .length як шлюз. Точніше за власну лічбу Claude, швидше за тестову публікацію.
  5. У китайській першими ріжте бектики й емодзі. Кожен бектик = 1 символ, кожен емодзі = 2.
  6. Фіксуйте позицію 🧵 у промпті. Claude за замовчуванням не знає конвенцій треду.

Справжній інсайт: Claude уміє писати багатомовні треди правильно — але його дефолтна реакція «перекласти». Ваше завдання — через промпт перемкнути його в режим «незалежної композиції за мовами». Зі шлюзом .length китайський тред останньої сьогоднішньої статті в першому чорновику вийшов рівно 140/140 — без різання.