Free

جعل Claude يكتب سلاسل تغريدات متعددة اللغات دون تجاوز الحد

سلاسل التغريدات متعددة اللغات ليست مشكلة ترجمة: قل '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 ضعفاً × Claude افتراضياً يترجم حرفياً

قواعد عدّ الحروف في X

حد الطول في X ليس "عدد الحروف"، بل weighted characters:
- الحروف اللاتينية والأرقام وعلامات الترقيم: 1 weight لكل حرف
- أحرف CJK (صيني/ياباني/كوري)، بعض الإيموجي: 2 weight لكل حرف
- السقف الكلي لكل تغريدة: 280 weight

الأثر العملي:
- التغريدة الإنجليزية: سقف 280 حرفاً
- التغريدة الصينية الصافية: سقف 140 حرفاً (140 × 2 = 280)
- المختلط: كل حرف يُحسب 1 أو 2

فـ"ترجمة تغريدة إنجليزية من 260 حرفاً إلى الصينية" لا تعطي نسخة صينية من 260 حرفاً — النسخة الصينية تملك فعلياً حوالي 130 حرفاً من المساحة. جميع علامات الترقيم وعلامات التنصيص و backtick الإنجليزية الأصلية لا تزال تشغل حيزاً، وكل حرف صيني يُحسب ضعفاً. الترجمة الحرفية تضمن التجاوز تقريباً.

كلمة "translate" تُشعل وضع الحرفي عند Claude

عندما يرى Claude "translate these 4 EN tweets to ZH"، ردّه الأول هو الحفاظ على بنية الجملة الإنجليزية وتبديل الكلمات إلى الصينية فقط:

  • 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" — يعطي Claude إذناً بإعادة ترتيب الجمل.
  3. "don't preserve EN sentence structure" — يسد السلوك الافتراضي وجهاً لوجه.
  4. "cut detail if needed" — يعطي الإذن بإسقاط المحتوى لأجل الطول (بدونه يحتفظ Claude بكل حقيقة ويتجاوز).
  5. ميزانية صريحة لكل لغة — "≤ 140 chars" أنجع من "short" بمئة ضعف.

فحص محلي: 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 يُرجع عدد codepoint في Unicode — كل حرف CJK يُحسب 1. يوزن X الـ CJK بـ 2، لكن حد التغريدة الصينية 140 codepoint (لأن 140 × 2 = 280 weighted)، فـ .length يوازي سقف X مباشرة. الاستثناءات:

  • أعداد codepoint للإيموجي (🧵 = 1 codepoint، لكن بعض الإيموجي متعدد الـ codepoint)
  • حروف بعرض صفر (ZWJ إلخ)

في الغالبية العظمى من تغريدات CJK، يبقى Ruby .length ضمن ±1 من عدّ X. استخدامه بوابة محلية يتفوّق على النشر التجريبي بـ 100 ضعف.

مصائد الإيموجي و backtick

حين تحتاج التغريدات الصينية إلى قص، هاتان الفئتان تسقطان أولاً:

backtick

اقتباسات الكود مثل `kamal exec` تأكل حرفاً واحداً لكل backtick في السياق الصيني — حرفان لكل اقتباس، بلا قيمة دلالية. الحلول:

  • استخدم نقطتين: "命令 kamal exec" أقصر من "`kamal exec`"
  • إذا اضطررت للإبقاء على backtick، فقط للمعرّف الأساسي، لا لسطر shell كامل

الإيموجي

🧵 على التغريدة الأولى فقط. الإيموجي الأخرى في التغريدات الصينية — فكّر مرتين. كل إيموجي يكلّف أساساً حرفين (1 codepoint + أحياناً معدلات ZWJ).

العلامات فوليدث مقابل هافيدث

  • علامات CJK (「」、,。——): 2 weight لكل حرف
  • علامات ASCII ("",-): 1 weight لكل حرف
  • عند خلط علامات تنصيص في تغريدة صينية: استخدم علامات هافيدث ('X') — توفّر حرفين لكل زوج مقارنة بالفولوث (「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 الإضافي للإيموجي وعلامات فولوث.

الاعتراض: لا تسأل Claude "هل تجاوزنا؟" — شغّل .length محلياً وبناءً على الأرقام اطلب منه تقليصاً.

4. موقع 🧵 غير متسق

العَرض: أحياناً كل تغريدة تحصل على 🧵، أحياناً الأولى فقط، أحياناً تهبط في 4/4.

الاعتراض: ثبّتها في البرومبت — "🧵 only on tweet 1". لا يعرف Claude افتراضياً الأعراف البصرية للسلسلة.

قائمة التحقق

ست قواعد للحصول على مسودة أولى متعددة اللغات قرب الحد:

  1. قل "write" لا "translate". Translate يُفعّل الحرفية = الحفاظ على EN = تجاوز.
  2. ميزانية صريحة لكل لغة. "≤ 140 chars" أنجع من "short" بمئة ضعف.
  3. إذن بقص المحتوى. "cut detail if needed" يخبر Claude أنه مسموح له بخسارة حقائق ليناسب الطول.
  4. Ruby .length محلياً كبوابة. أدق من عدّ Claude، أسرع من النشر التجريبي.
  5. في الصينية، اقطع backtick والإيموجي أولاً. كل backtick = حرف، كل إيموجي = حرفان.
  6. ثبّت موقع 🧵 في البرومبت. لا يعرف Claude أعراف السلاسل افتراضياً.

البصيرة الحقيقية: يستطيع Claude كتابة السلاسل متعددة اللغات بصواب — لكن ردّه الافتراضي "ترجمة". عملك هو تحويله عبر البرومبت إلى "تأليف مستقل لكل لغة". بإضافة بوابة .length، خرجت السلسلة الصينية لآخر مقال اليوم 140/140 بالضبط من المسودة الأولى — بلا قص.