Free

Claude'a Karakter Sınırını Aşmadan Çok Dilli Tweet Thread'leri Yazdırmak

Çok dilli thread'ler çeviri sorunu değil: 'translate' yerine 'write' de ve taslakları yerel bir .length scriptiyle süz.


Bugün 5 makale yayınladım. Her biri 6 dilde (en / zh / ja / ko / ar / id) tweet thread'iyle geliyor, dil başına 4 tweet — toplamda 120 tweet.

5'in 4'ünde Çince thread'de kırpma gerekti. Ham rakamlar (script'in yazdırdığı, format 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

Her seferinde aynı desen: önce dört İngilizce tweet yazılır (her biri 230–260 karakter, 280 tavanına yakın), sonra Claude'a "bu dördünden Çince versiyonu üret" denir. Çince versiyon neredeyse her seferinde 140'ı aşar.

Bu bir bug değil, yanlış kelime. "Translate" dediğin anda Claude satır satır çevirmeye başlar — ama çok dilli thread bir çeviri problemi değil. Her dil kendi karakter bütçesine göre sıfırdan yazılmalı. Bu yazı, Claude'un ilk taslağını sınıra yakın almanın, 3–5 tur kırpmaktan kaçınmanın yolunu anlatıyor.


Kök sebep: X CJK'yı iki ağırlık sayar × Claude varsayılan olarak sözcük-sözcük çevirir

X'in karakter sayma kuralı

X'in uzunluk sınırı "karakter sayısı" değil, weighted characters üzerinden hesaplanır:
- Latin harfleri, rakamlar, noktalama: karakter başına 1 weight
- CJK karakterleri (Çince/Japonca/Korece), bazı emojiler: karakter başına 2 weight
- Tweet başına toplam tavan 280 weight

Pratikte:
- İngilizce tweet tavanı 280 karakter
- Saf Çince tweet tavanı 140 karakter (140 × 2 = 280)
- Karışık metin: karakter başına 1 veya 2

Dolayısıyla "260 karakterlik İngilizce tweet'i Çince'ye çevir" 260 karakterlik Çince vermez — Çince versiyonun gerçek alanı yaklaşık 130 karakter. İngilizce orijinaldeki bütün noktalama, tırnak ve backtick hâlâ yer kaplar, her Çince karakter iki kat sayılır. Birebir çeviri aşmayı neredeyse garantiler.

"Translate" kelimesi Claude'un birebir modunu açar

Claude "translate these 4 EN tweets to ZH" gördüğünde ilk hamlesi İngilizce cümle yapısını koruyup sadece kelimeleri Çince'ye çevirmek:

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

Anlam doğru, ama:
- "并不相同"ı koruyor ("不同"den bir karakter uzun)
- "已经点击了"yi koruyor ("刚点完" daha kısa)
- "并看着一个空白屏幕"ı koruyor ("看着空白屏" daha kısa)

Korunan her gereksizlik karakter yer. 4 tweet'te birikince 20–40 karakter fazladan kolay, ve sınırı geçiyorsun.

İşe yarayan prompt: "çeviri" değil "yeniden yazma"

İki ifadeyi karşılaştır:

İşe yaramayan:

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

İşe yarayan:

"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"

Farklar:

  1. "write" "translate"'in yerine — Claude'un kompozisyon modunu açar, çeviri modunu değil.
  2. "fresh pass" / "same argument" — Claude'a cümleleri yeniden düzenleme izni verir.
  3. "don't preserve EN sentence structure" — varsayılan davranışı doğrudan keser.
  4. "cut detail if needed" — uzunluğa uymak için içerik atma izni verir (olmazsa Claude tüm olguları tutup aşar).
  5. Dil başına açık bütçe — "≤ 140 chars", "short"tan 100× etkili.

Yerel sanity check: Ruby + .length

Gözle sayma. Her taslakta çalışan küçük bir script yaz:

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

Ruby'nin String#length'i Unicode codepoint döndürür — her CJK karakter 1 olarak sayılır. X CJK'yı weight 2 sayar ama Çince tweet tavanı 140 codepoint (çünkü 140 × 2 = 280 weighted), yani .length doğrudan X'in tavanıyla örtüşür. Sapmalar şuradan gelir:

  • Emoji codepoint sayıları (🧵 1 codepoint, ama bazı emojiler birden fazla codepoint dizisi)
  • Sıfır genişlikli karakterler (ZWJ vb.)

CJK tweet'lerinin büyük çoğunluğunda Ruby .length'i X'in sayımına ±1 uyar. Yerel kapı olarak kullanmak X'e test göndermekten 100× daha güvenilir.

Emoji ve backtick tuzakları

Çince tweet kırpılacaksa önce bu iki kategori gider:

Backtick

`kamal exec` gibi kod alıntıları Çince bağlamda backtick başına 1 karakter yer — alıntı başına 2 karakter, anlama sıfır katkı. Çözümler:

  • İki nokta: "命令 kamal exec", "`kamal exec`"dan kısa
  • Backtick gerçekten zorunluysa sadece ana tanımlayıcıya, tüm shell satırına değil

Emoji

🧵 sadece ilk tweet'te. Diğer emojiler Çince tweet'te — iki kez düşün. Her emoji aslında 2 karakter tutar (1 codepoint + bazen ZWJ modifierleri).

Fullwidth vs halfwidth noktalama

  • CJK noktalama (「」、,。——): karakter başına 2 weight
  • ASCII noktalama ("",-): karakter başına 1 weight
  • Çince tweet tırnak karıştırırsa: halfwidth tırnak ('X') kullan — fullwidth'e (「X」) göre çift başına 2 karakter kazandırır

Claude'un varsayılan olarak sapıttığı dört yön

Çok dilli thread üretirken bu dördünü engelle:

1. EN yapısını koruyan birebir çeviri

Belirti: Çince cümlelerde "并不相同", "已经点击了", "一个空白屏幕" gibi İngilizce'den birebir kalıntılar.

Engelleme: prompt'a doğrudan "don't preserve EN sentence structure" / "use natural ZH phrasing" yaz.

2. Kendiliğinden uzunluk kontrolü yok

Belirti: Claude "done" der, çıktı sınırı geçer, ama farkında değildir.

Engelleme: Claude'dan her tweet'in uzunluğunu saymasını iste ("count each tweet's char length and flag any over the limit") veya yerel bir script'i kapı olarak kullan. Ben script'i seçiyorum — Ruby daha doğru.

3. Tırnak ve emoji weight'ini sayıma katmıyor

Belirti: Claude sayarken emoji ve fullwidth tırnakların ek weight'ini atlıyor.

Engelleme: Claude'a "sınırı aştı mı?" diye sorma — yerelde .length çalıştır, rakamlara göre Claude'a kısalttır.

4. 🧵 konumu tutarsız

Belirti: bazen her tweet'e 🧵, bazen sadece 1'e, bazen 4/4'te.

Engelleme: prompt'a sabitle — "🧵 only on tweet 1". Claude thread'in görsel kurallarını varsayılan olarak bilmez.

Checklist

İlk taslak çok dilli thread'i sınıra yaslamak için altı kural:

  1. "translate" değil "write" de. Translate birebir çeviriyi tetikler = EN yapısı korunur = aşar.
  2. Dil başına açık bütçe. "≤ 140 chars", "short"tan 100× etkili.
  3. İçerik kesme izni. "cut detail if needed" Claude'a uzunluğa uymak için olgu kaybedebileceğini söyler.
  4. Yerel Ruby .length kapı olarak. Claude'un saymasından doğru, X test göndermekten hızlı.
  5. Çince'de önce backtick ve emoji kırp. Her backtick 1 karakter, her emoji 2.
  6. 🧵 konumunu prompt'a sabitle. Claude thread kurallarını varsayılan olarak bilmez.

Gerçek içgörü: Claude çok dilli thread'leri doğru yazabiliyor — ama varsayılan tepkisi "çeviri". Senin işin onu prompt'la "her dil için bağımsız yeniden yaz" moduna çevirmek. .length kapısıyla birlikte, bugünkü son makalenin Çince thread'i ilk taslakta 140/140 tam tamına — kırpma yok.