การแก้ไขปัญหา
ปัญหาที่พบบ่อยและวิธีแก้ไขสำหรับ i18n-rosetta
API และการยืนยันตัวตน
"OPENROUTER_API_KEY not found"
Rosetta จำเป็นต้องใช้ API key สำหรับการแปลภาษาด้วย LLM คุณสามารถตั้งค่าเป็น environment variable ได้ดังนี้:
export OPENROUTER_API_KEY="sk-or-v1-..."
หรือในไฟล์ .env (หากโปรเจกต์ของคุณโหลดไฟล์ .env):
OPENROUTER_API_KEY=sk-or-v1-...
หากคุณมีเพียง Google Translate API key ระบบ rosetta จะตรวจจับอัตโนมัติและใช้ Google Translate เป็นวิธีการเริ่มต้น โดยไม่จำเป็นต้องเปลี่ยนการตั้งค่าใดๆ
"401 Unauthorized" จาก OpenRouter
API key ของคุณไม่ถูกต้องหรือหมดอายุ โปรดตรวจสอบที่ openrouter.ai/keys
"429 Too Many Requests" / การจำกัดอัตราการเรียกใช้งาน (Rate Limiting)
Rosetta จัดการการจำกัดอัตราการเรียกใช้งานภายในระบบด้วย exponential backoff หากคุณพบปัญหาการจำกัดอัตราการเรียกใช้งานอย่างต่อเนื่อง:
- ลดขนาด batch ในการตั้งค่าของคุณ:
{ "batchSize": 15 }
- ใช้โมเดลที่มีขีดจำกัดสูงกว่า (เช่น
google/gemini-3.5-flashมีขีดจำกัดที่ค่อนข้างสูง) - ใช้วิธีที่ถูกกว่า/เร็วกว่า สำหรับคู่ภาษาที่มีปริมาณมาก — Google Translate ไม่มีการจำกัดอัตราการเรียกใช้งาน:
{ "pairs": { "en:it": { "method": "google-translate" } } }
ไม่พบโมเดล / ข้อผิดพลาด 404
ผู้ให้บริการ LLM โดยตรง (openai, anthropic, gemini) จะตรวจสอบสตริงโมเดลของคุณในการใช้งานครั้งแรก หากคุณเห็นคำเตือน:
"looks like an OpenRouter path" — คุณกำลังใช้โมเดลรูปแบบ OpenRouter (google/gemini-3.5-flash) กับผู้ให้บริการโดยตรง ผู้ให้บริการโดยตรงจะใช้ชื่อโมเดลแบบปกติ:
- { "method": "gemini", "model": "google/gemini-3.5-flash" }
+ { "method": "gemini", "model": "gemini-2.5-flash" }
หรือเปลี่ยนไปใช้วิธี llm เพื่อใช้งาน OpenRouter:
{ "method": "llm", "model": "google/gemini-3.5-flash" }
"is an Anthropic/OpenAI/Gemini model" — คุณกำลังส่งโมเดลไปยังผู้ให้บริการที่ไม่ถูกต้อง:
- { "method": "gemini", "model": "claude-sonnet-4-6" }
+ { "method": "anthropic", "model": "claude-sonnet-4-6" }
"not found in available models" — โมเดลอาจถูกยกเลิกการใช้งานหรือสะกดผิด Rosetta จะดึงรายการโมเดลล่าสุดของผู้ให้บริการและแนะนำทางเลือกอื่น โปรดตรวจสอบเอกสารประกอบของผู้ให้บริการสำหรับชื่อโมเดลปัจจุบัน
:::tip การยกเลิกการใช้งานโมเดลสามารถเกิดขึ้นได้
ผู้ให้บริการมักจะยกเลิกชื่อโมเดลอยู่เป็นประจำ หากการแปลล้มเหลวกะทันหันหลังจากการอัปเดตของผู้ให้บริการ โปรดตรวจสอบผลลัพธ์ [WARN] — ระบบจะแสดงทางเลือกปัจจุบันให้คุณทราบ
:::
คุณภาพการแปล
คำแปลเหมือนกับภาษาต้นทาง
Quality gate จะดักจับปัญหานี้ หากคำแปลเหมือนกับภาษาอังกฤษต้นทางทุกประการ ระบบจะปฏิเสธและลองใหม่อีกครั้ง หากยังคงพบปัญหา:
- ตรวจสอบโมเดล — บางโมเดลอาจทำงานได้ไม่ดีสำหรับคู่ภาษาเฉพาะ
- เพิ่มคำแนะนำระดับภาษา (register instructions) — บอกโมเดลว่าต้องการให้สร้างภาษาอะไร:
{"languages": {"ja": { "name": "Japanese", "register": "Polite/formal Japanese" }}}
- ลองใช้โมเดลอื่น — เปลี่ยนจาก
gpt-4o-miniเป็นgpt-4oหรือgoogle/gemini-2.5-pro
ผลลัพธ์ตัวอักษรผิด (เช่น ข้อความละตินสำหรับภาษาญี่ปุ่น)
การตรวจสอบความสอดคล้องของตัวอักษร (script compliance) ของ quality gate จะดักจับกรณีส่วนใหญ่ได้ หากยังคงพบปัญหา:
- ตรวจสอบว่ารหัส locale ถูกต้อง (
jaไม่ใช่jp) - เพิ่มคำแนะนำตัวอักษรที่ชัดเจนในฟิลด์
register:{ "register": "Japanese using hiragana, katakana, and kanji" }
รูปแบบการหลอน (Hallucination) ในผลลัพธ์
รูปแบบ trigram ที่ซ้ำกัน (เช่น "hello hello hello") จะถูกดักจับโดยตัวตรวจจับลูปการหลอน (hallucination loop detector) หากผลลัพธ์อ่านไม่รู้เรื่องแต่ผ่านตัวตรวจจับมาได้:
- ลดขนาด batch — batch ที่เล็กลงจะให้ผลลัพธ์ที่ตรงจุดมากขึ้น
- ใช้โมเดลที่มีประสิทธิภาพสูงขึ้น — โมเดลขนาดใหญ่จะเกิดการหลอนน้อยกว่าในตัวอักษรที่ไม่ใช่ภาษาละติน
- เพิ่มข้อมูลการสอน (coaching data) — คำศัพท์ในพจนานุกรมจะช่วยยึดโยงการแปลให้ถูกต้อง
ปัญหาเกี่ยวกับไฟล์และรูปแบบ
"No locale files found"
Rosetta จะตรวจจับไฟล์ locale โดยอัตโนมัติ หากไม่พบไฟล์:
- ตรวจสอบ
localesDir— ต้องชี้ไปยังไดเรกทอรีที่มีไฟล์ locale:{ "localesDir": "./locales" } - ตรวจสอบการตั้งชื่อไฟล์ — ไฟล์ต้องตั้งชื่อตามรหัส locale:
en.json,fr.jsonเป็นต้น - ตรวจสอบรูปแบบ — รูปแบบที่รองรับ: JSON, nested JSON, YAML, TOML
ข้อขัดแย้งของไฟล์ Lock
หาก .i18n-rosetta.lock อยู่ในสถานะที่ไม่ถูกต้อง:
# Reset the lock file (next sync will retranslate everything)
rm .i18n-rosetta.lock
npx i18n-rosetta sync
การลบไฟล์ lock หมายความว่าการซิงค์ครั้งต่อไปจะแปลคีย์ทั้งหมดใหม่ ไม่ใช่เฉพาะคีย์ที่มีการเปลี่ยนแปลง ซึ่งจะส่งผลต่อค่าใช้จ่าย API สำหรับโปรเจกต์ขนาดใหญ่
การแปลเฉพาะบางคีย์ใหม่
หากการแปลบางรายการไม่ถูกต้องและคุณต้องการบังคับให้แปลใหม่โดยไม่ต้องลบไฟล์ lock:
# Re-translate a single key
npx i18n-rosetta sync --force-keys "hero.title"
# Re-translate multiple keys
npx i18n-rosetta sync --force-keys "nav.home,nav.about,footer.copyright"
แฟล็ก --force-keys จะข้ามการตรวจสอบแฮชของไฟล์ lock สำหรับคีย์เฉพาะเหล่านั้น เพื่อบังคับให้แปลใหม่โดยไม่ส่งผลกระทบต่อคีย์อื่นๆ
การแปลเนื้อหาทำให้บล็อกโค้ดเสียหาย
ปัญหานี้ไม่ควรเกิดขึ้น — บล็อกโค้ดจะถูกป้องกันไว้ก่อนการแปล หากเกิดขึ้น:
- ตรวจสอบว่าบล็อกโค้ดใช้รูปแบบมาตรฐาน (backticks สามตัว)
- ตรวจสอบหาบล็อกโค้ดที่ไม่ได้ปิดใน Markdown ต้นทาง
- แจ้งปัญหา — นี่คือบั๊กในระบบป้องกัน sentinel
ปัญหาเกี่ยวกับ CLI
--watch ไม่ตรวจจับการเปลี่ยนแปลง
การเฝ้าดูไฟล์ใช้ fs.watch แบบเนทีฟของ Node.js ปัญหาที่ทราบ:
- Network drives —
fs.watchทำงานได้ไม่เสถียรบนการเมานท์ NFS/SMB - Docker volumes — ให้ใช้โหมด polling หรือรัน rosetta ภายในคอนเทนเนอร์
- ไดเรกทอรีขนาดใหญ่ — ตัวเฝ้าดูจะตรวจสอบ
localesDirแบบเรียกซ้ำ (recursively); โครงสร้างที่ลึกมากอาจเกินขีดจำกัดของระบบปฏิบัติการ
npx รันเวอร์ชันเก่า
# Clear the npx cache
npx --yes i18n-rosetta@latest sync
หรือติดตั้งแบบ global:
npm install -g i18n-rosetta
i18n-rosetta sync
ประสิทธิภาพ
การซิงค์ช้าสำหรับหลายภาษา
โดยค่าเริ่มต้น Rosetta จะแปลคู่ภาษาตามลำดับ หากต้องการเร่งความเร็วการซิงค์หลายภาษา:
- ใช้ Google Translate สำหรับคู่ภาษาที่มีปริมาณมาก — เร็วกว่าการแปลด้วย LLM 10–50 เท่า
- เพิ่มขนาด batch (สูงสุด 50, ค่าเริ่มต้นคือ 30):
{ "batchSize": 50 }
- ใช้โมเดลที่รวดเร็ว —
gpt-4o-miniเร็วกว่าgpt-4oอย่างเห็นได้ชัด
ค่าใช้จ่าย API สูง
- ตรวจสอบขนาด batch — batch ที่ใหญ่ขึ้น = การเรียก API น้อยลง = ค่าใช้จ่ายลดลง
- ใช้ prompt caching — Rosetta จะแยกข้อความระบบ/ผู้ใช้เพื่อให้เกิด cache hits บนโมเดลของ Anthropic และ Google
- ใช้ Google Translate สำหรับภาษา Tier 2 — ดูคู่มือ Translate 30 Languages
ยังคงติดปัญหาอยู่ใช่ไหม?
- GitHub Issues — ค้นหาปัญหาที่มีอยู่หรือแจ้งปัญหาใหม่
- Architecture Docs — ทำความเข้าใจการออกแบบระบบ
- Quality Gate — การตรวจสอบความถูกต้องทำงานอย่างไรในเบื้องหลัง