Free

ให้ Claude แปลบทความหนึ่งเรื่องเป็น 19 ภาษา

หนึ่งบทความ 19 ภาษา: โครงสร้างไฟล์, prompt แปล, 5 จุดสะดุดจริง, วิธี POST ครั้งเดียว


เอกสารทางการของ Anthropic และ OpenAI มีแต่ภาษาอังกฤษ. นี่คือช่องว่างขนาดใหญ่ในระบบนิเวศเนื้อหาสำหรับนักพัฒนา AI ทั่วโลก how2claude กำลังอุดช่องว่างนั้น — ทุกบทความออก 19 ภาษาพร้อมกัน: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th

จ้างคนแปลไม่สมจริง (20 บทแปลต่อบทความ บทละหลายพันดอลลาร์) ให้ Claude ทำดึงต้นทุนส่วนเพิ่มใกล้ศูนย์ — แต่โยนคำว่า "แปลเป็นญี่ปุ่น" ข้ามรั้วไปก็จะได้ข้อความกลิ่นเครื่องแปลชัดและเสียงของผู้เขียนหายหมด ต่อไปนี้คือกระบวนการครบถ้วนเพื่อทำให้ถูก: โครงสร้างไฟล์ วิธีเขียน prompt แปล จุดที่ Claude จะสะดุดแน่ๆ วิธีส่ง 19 ภาษาพร้อมทวีตรายภาษาด้วย POST ครั้งเดียวไปยัง API


การตัดสินใจหลัก: แปล vs. ปรับให้เข้าท้องถิ่น

สองอย่างที่ต่างกันมาก

การแปล ย้ายความหมายจากภาษา A ไป B — สิ่งที่ Google Translate ทำ อ่านแล้ว "ถูก" แต่ "แบน"

การปรับให้เข้าท้องถิ่น (localization) รักษาระดับภาษา จังหวะ และระดับเทคนิคของผู้เขียน เขียนใหม่ด้วย "น้ำเสียงบล็อกเทคนิค" เฉพาะของภาษาเป้าหมาย ผลลัพธ์อ่านเหมือนเจ้าของภาษาเขียน

การแปลเป็นงาน 5 นาทีของ Claude; การปรับให้เข้าท้องถิ่นต้องการ prompt ระบุชัด:

  • ใครคือผู้อ่านเป้าหมาย (นักพัฒนา, ทีมเทคนิค)
  • ระดับภาษาอ้างอิง ("ให้ฟังเหมือนบล็อกนั้น")
  • คำที่ต้องคงภาษาต้นทาง (ชื่อ API, ชื่อ framework, คำสั่ง, URL)
  • จุดที่อนุญาตให้ปรับโครงสร้าง (ตัดประโยคยาว เปลี่ยนอุปมาเป็นสิ่งที่ผู้อ่านท้องถิ่นรู้จัก)

คำสั่ง /write-article ของ how2claude ฝังข้อกำหนดสไตล์ต่อภาษา:

ไฟล์ภาษา ข้อกำหนดสไตล์
ja.md น้ำเสียงบล็อกเทคนิค, ญี่ปุ่นธรรมชาติ
ko.md น้ำเสียงบล็อกเทคนิค, เกาหลีธรรมชาติ
zh-TW.md การใช้แบบไต้หวัน, อักษรตัวเต็ม
ar.md อาหรับมาตรฐานสมัยใหม่ (เขียน)
id.md อินโดนีเซียมาตรฐาน

ดูเหมือนแค่บรรทัดเพิ่ม แต่สำหรับ Claude สำคัญยิ่ง — ไม่มีบรรทัดนี้ค่าเริ่มต้นจะออกมาเป็น "คำแปลตำรา"

โครงสร้างไฟล์: 19 ภาษาอยู่ในโฟลเดอร์เดียว

หนึ่งโฟลเดอร์ต่อหนึ่งร่าง 20 ไฟล์:

docs/drafts/let-claude-translate-articles/
├── meta.json        # title + summary ของทั้ง 19 ภาษา
├── zh.md            # จีน (ต้นฉบับ, เขียนก่อน)
├── en.md            # อังกฤษ (ชุดแปลแรก)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(อีก 14)
└── th.md

meta.json:

{
  "category_slug": "use-cases",
  "series_slug": "writing",
  "free": true,
  "title": {
    "zh": "让 Claude 把一篇文章翻译成 19 种语言",
    "en": "Letting Claude Translate One Article Into 19 Languages",
    "th": "ให้ Claude แปลบทความหนึ่งเรื่องเป็น 19 ภาษา",
    "...": "..."
  },
  "summary": {
    "th": "หนึ่งบทความ 19 ภาษา: โครงสร้างไฟล์, prompt แปล, 5 จุดสะดุดจริง, วิธี POST ครั้งเดียว",
    "...": "..."
  }
}

บรรทัดแรกของแต่ละไฟล์ .md คือ # หัวเรื่อง, ที่เหลือคือเนื้อหา title ไม่ได้ดึงจากบรรทัดแรกของ md — แต่ดึงจาก meta.json ดังนั้นแต่ละภาษาจึงมีหัวเรื่องสั้นที่ขัดเกลาเป็นพิเศษ ไม่ใช่ประโยคเปิดบทความที่อาจยืดยาวตอนแปล

กระบวนการ: เขียน zh แล้วกระจายไป 18 ภาษา

กระบวนการสองแบบที่ต้องหลีกเลี่ยง:

ผิด: แปลต่อโซ่ zh → en → ja → ko → ...
ปัญหา: ja อิง en, ko อิง ja — แต่ละกระโดดเสียความหมายไปนิด ถึง th (ไทย) ก็เป็นข้อมูลมือสี่

ถูก: แปลแบบรัศมี ล็อก zh → สร้าง en / ja / ko / ar / id / ... ตรงจากต้นฉบับ
ทุกภาษาออกจากต้นฉบับโดยตรง ไม่มีจุดแวะ

โครงสร้าง prompt (ห่ออยู่ใน /write-article):

นี่คือบทความบล็อกเทคนิคเรื่อง X ต้นฉบับภาษาจีน:
[zh.md เต็ม]

แปลเป็นภาษาต่อไปนี้ พร้อมข้อกำหนดรายภาษา:
- ja.md: น้ำเสียงบล็อกเทคนิค, ญี่ปุ่นธรรมชาติ
- ko.md: น้ำเสียงบล็อกเทคนิค, เกาหลีธรรมชาติ
- ar.md: อาหรับมาตรฐานสมัยใหม่ (เขียน)
...

กฎ:
1. รักษาน้ำเสียงผู้เขียนที่ตรงไปตรงมา เป็นมืออาชีพ และหยอกตัวเองเล็กน้อย
2. อย่าแปลโค้ดบล็อก คำสั่ง ชื่อ API URL
3. หัวเรื่อง หัวเรื่องย่อย การไหลของย่อหน้าปรับโครงสร้างได้
4. ออก title แยกต่อภาษา — สั้น มีตะขอ ไม่ใช่แปลตรงตัวจากหัวเรื่องต้นฉบับ

แปล 18 ภาษาแบบขนาน เซสชันเดียวของ Claude จบ รายละเอียดสำคัญข้อหนึ่ง: ทำในเซสชันเดียว / รุ่นโมเดลเดียว — เสียงจะลอยไปเมื่อข้ามเซสชันหรือข้ามรุ่นโมเดล

5 จุดที่พังจริง

1. ขีดจำกัดตัวอักษรทวีตต่างกันตามภาษา

X นับตัวอักษร CJK (จีน/ญี่ปุ่น/เกาหลี) เข้มกว่า ผมให้ Claude สร้างทวีตตามเงื่อนไขนี้:

  • ทวีตจีน ≤ 140 ตัวอักษร
  • ภาษาอื่น ≤ 280 ตัวอักษร

รอบแรกทวีตจีนสามตัวทะลุ (160, 164, 152) Claude แปลทวีตอังกฤษตามตัวอักษร — ทวีตอังกฤษ 260 ตัวอักษรแปลเป็นจีนแล้วแตะขีดจำกัดพอดี

กฎ: ทวีตจีนต้องเขียนใหม่ ไม่ใช่แปล ข้อกำหนด: เพดาน 140 ตัวอักษร ต้องมีตะขอ ยอมเสียรายละเอียดบ้างได้

2. zh-TW ไม่ใช่การแปลงตัวอักษร

zhzh-TW ชวนให้ขี้เกียจ: ผ่านเครื่องแปลงอักษรตัวย่อ-เป็น-ตัวเต็ม ตัวอักษรตรง คำศัพท์ไม่ตรง:

zh zh-TW (ผิด) zh-TW (ถูก)
文件 文件 檔案
信息 信息 資訊
软件 軟件 軟體
视频 視頻 影片

เวลาสั่ง zh-TW จาก Claude ให้พูดทั้งสอง: "การใช้แบบไต้หวัน อักษรตัวเต็ม" "ตัวเต็มอย่างเดียว" จะได้แค่การแปลงอักษร

3. ภาษา RTL (ar, he) ทำเลย์เอาต์พัง

อาหรับและฮีบรูอ่านจากขวาไปซ้าย ฝั่ง Rails ต้องใช้ <html dir="rtl"> และ variants rtl: ของ Tailwind แต่การแปลเองก็มีกับดัก:

  • โค้ดบล็อกยังคงเป็นอังกฤษ แต่เมื่อย่อหน้าอาหรับห่อโค้ดบล็อก เบราว์เซอร์ต้องมี unicode-bidi: isolate ไม่งั้นโค้ดจะโดน "ดูด" เข้าไปในกระแส RTL
  • เครื่องหมายวรรคตอนผสม: อาหรับใช้ ، แทน , และ ؟ แทน ? Claude ค่าเริ่มต้นใช้เครื่องหมายอังกฤษ; ต้องระบุชัด
  • ทิศทางตัวเลข: อาหรับเขียนตัวเลขซ้ายไปขวา (2026) ภายในย่อหน้าที่ไหลขวาไปซ้าย เบราว์เซอร์จัดการเอง แต่ Claude มักสลับตอนเขียนข้อความดิบ

4. Claude ค่าเริ่มต้น "ทำให้เสียงผู้เขียนทางการขึ้น"

สำนวนพูดในต้นฉบับ ("ทีเดียวจบ", "พลาดท่า", "โดนเท") Claude แปลเป็นญี่ปุ่น/เกาหลีโดยปริยายเป็นรูปเขียนทางการ (「一気に実装」「落とし穴」「失敗」) — ความหมายตรง แต่น้ำเสียงหายไป

วิธีแก้: เขียนใน prompt — "รักษาน้ำเสียงบล็อกเทคนิคที่ตรงไปตรงมา หยอกตัวเองเล็กน้อย ไม่ทางการ อย่าทำให้เป็นวิชาการ" แม้กระนั้นบางภาษา (เยอรมัน รัสเซีย) จะลงจอดเป็นทางการกว่าต้นฉบับเล็กน้อย — ภาษาเองมี bias ไปทางระดับเขียน

5. Placeholder และตัวแปรไม่แปล

สตริงในโค้ดแบ่งเป็นสองตะกร้า — ข้อความ UI (แปล) และ placeholder/ชื่อตัวแปร (ไม่):

t("pricing.page_title")        # ไม่แปล (i18n key)
"user_id"                      # ไม่แปล (ชื่อตัวแปร)
"Monthly subscription"         # แสดงเป็นตัวอย่างในเนื้อหาให้ผู้อ่าน → ไม่แปล

สำหรับทุกอย่างที่อยู่ติดโค้ด "ไม่แปล" เป็นค่าเริ่มต้นที่ปลอดภัยกว่า ที่ต้องแปลจริงๆ คือไฟล์ i18n locale (config/locales/xx.yml) นั่นเป็นงานคนละเรื่อง

เผยแพร่: POST เดียว 19 ภาษา

/publish-article ส่ง POST ของร่างไปยัง how2claude.com/api/articles:

{
  "category_slug": "use-cases",
  "series_slug": "writing",
  "free": true,
  "thread": true,
  "title":   { "zh": "...", "en": "...", "ja": "...", ... },
  "summary": { "zh": "...", "en": "...", ... },
  "content": { "zh": "<md>", "en": "<md>", ... },
  "tweets":  { "en": ["...", "..."], "zh": [...], ... }
}

หนึ่งคำขอ ~300KB (19 ภาษา × ~15KB) เซิร์ฟเวอร์แยกไปตารางฐานข้อมูล:

  • ตาราง articles, title / summary / content เป็น jsonb คีย์ตาม locale
  • ตาราง x_queue_tweets, ตาม locale + account, ส่งเข้าคิวจัดเวลา

ทวีตส่งเฉพาะ locale ที่มีบัญชี X เชื่อมต่อแล้ว (ปัจจุบัน en/zh/ja/ko/ar/id — 6 บัญชี) ภาษาที่ไม่มีบัญชีส่ง [] ตรวจสอบบัญชี:

Account.all.each { |a| puts "#{a.locale}: #{a.name}" }
# en: @how2claude
# zh: @howtoclaude
# ja: @how2claude_ja
# ko: @how2claude_ko
# ar: @how2claude_ar
# id: @how2claude_id

เช็คลิสต์

เช็คลิสต์ครบถ้วนสำหรับให้ Claude แปลบทความหนึ่งเรื่องเป็น 19 ภาษา:

  1. ล็อก zh (หรือ en) ก่อน จากนั้นกระจายอีก 18 บทแปลจากแหล่งนั้นแบบรัศมี ไม่ต่อโซ่
  2. ข้อกำหนดสไตล์รายภาษาเข้า prompt "ญี่ปุ่นธรรมชาติ" ไม่พอ — ต้องพูด "น้ำเสียงบล็อกเทคนิค ญี่ปุ่นธรรมชาติ"
  3. แปล title และ summary แยก ไม่ดึงจากย่อหน้าแรกของเนื้อหา รวมศูนย์ 19 title/summary ไว้ใน meta.json
  4. รายการสิ่งที่ไม่แปลให้ชัด: โค้ดบล็อก คำสั่ง ชื่อ API URL คีย์ i18n ชื่อตัวแปร ที่แปล: ข้อความอธิบาย อุปมา โครงสร้างย่อหน้า
  5. ทวีตต้องเขียนใหม่ ไม่ใช่แปล 140 ตัวอักษรสำหรับจีน 280 สำหรับที่เหลือ แปลตรงตัวอังกฤษ-เป็น-จีนเกินขีดเสมอ
  6. zh-TW ต้องพูด "การใช้แบบไต้หวัน + อักษรตัวเต็ม" ไม่อย่างนั้นได้แค่การแปลงอักษรและคำศัพท์ยังเป็นแผ่นดินใหญ่
  7. ภาษา RTL (ar, he) ต้องการ dir="rtl" + variants rtl: ของ Tailwind ฝั่ง Rails เครื่องหมายวรรคตอนผสมและแยกโค้ดบล็อก — จัดการแยก
  8. ส่งทุกภาษาด้วย POST ครั้งเดียว — 19 content + 19 title/summary + ทวีตสำหรับแต่ละบัญชีที่เชื่อมต่อ หนึ่งคำขอไป backend

คอขวดจริงไม่ใช่คุณภาพการแปล — โมเดลระดับ Claude 4 แปลเป็นญี่ปุ่น/เกาหลี/อาหรับ/รัสเซียคุณภาพใกล้เจ้าของภาษา คอขวดคือ คุณยอมเอาบทความหนึ่งไปวางหน้าผู้อ่าน 19 ภาษาพร้อมกันหรือไม่ ทางเทคนิค 5 นาทีจบ ทางเนื้อหา ต้องมีความตั้งใจจะบริการผู้ชม 200 เท่าพร้อมกัน