ข้ามไปยังเนื้อหาหลัก

ตัวแปลงอักษร

ตัวแปลงอักษร (Script Converters) คือ hooks หลังการแปลที่ทำงานแบบ deterministic และไม่ใช้ LLM เพื่อแปลงข้อความจากระบบการเขียนหนึ่งไปยังอีกระบบหนึ่ง ช่วยให้สามารถใช้ workflow แบบ "แปลครั้งเดียว แสดงผลได้หลายอักษร" — คุณแปลเป็นอักษรที่ใช้งานได้ (โดยทั่วไปคือ Latin) แล้วแปลงเป็นอักษรสำหรับแสดงผลโดยอัตโนมัติ

เหตุใดจึงต้องใช้ตัวแปลงอักษร?

บางภาษาใช้หลายอักษรสำหรับภาษาพูดเดียวกัน:

  • Plains Cree: SRO (Latin) สำหรับการแก้ไข → Syllabics (ᓀᐦᐃᔭᐍᐏᐣ) สำหรับการแสดงผล
  • Serbian: Latin สำหรับการใช้งานระดับสากล → Cyrillic สำหรับการใช้งานภายในประเทศ
  • Klingon: Romanization สำหรับการพิมพ์ → pIqaD ( ) สำหรับการแสดงผล

การแปลโดยตรงเป็นอักษรที่ไม่ใช่ Latin ก่อให้เกิดปัญหา: LLM มักสร้างตัวอักษรที่ผิดพลาด ไฟล์ JSON ยากต่อการควบคุมเวอร์ชัน และเครื่องมือ diff ไม่สามารถเปรียบเทียบการเปลี่ยนแปลงได้ ตัวแปลงอักษรแก้ปัญหานี้โดยเก็บการแปลในอักษรที่เหมาะกับการควบคุมเวอร์ชัน แล้วแปลงแบบ deterministic ในขั้นตอน sync

ตัวแปลงที่มีให้ใช้งาน

Champollion มาพร้อมตัวแปลงอักษรในตัว 5 รายการ:

Localeจากไปยังประเภทต้องใช้ฟอนต์?
crkSRO (Standard Roman Orthography)Cree SyllabicsDeterministicไม่ — เป็น Unicode มาตรฐาน
srLatinCyrillicDeterministicไม่ — เป็น Unicode มาตรฐาน
tlhRomanizationpIqaDDeterministicใช่ — PUA U+F8D0–F8FF
x-elvish-sLatinTengwar (Mode of Beleriand)Deterministicใช่ — PUA U+E000–E07F
x-kryptonianLatinKryptonianFont-based cipherใช่ — PUA U+E100–E119

Deterministic เทียบกับ Font-Based

  • ตัวแปลงแบบ Deterministic (Cree, Serbian, Klingon, Tengwar) ทำการแมปตัวอักษรต่อตัวอักษรโดยใช้กฎทางภาษาศาสตร์ ผลลัพธ์ประกอบด้วยตัวอักษร Unicode จริง
  • ตัวแปลงแบบ Font-based (Kryptonian) เป็น cipher แบบแทนที่ 1:1 โดยผลลัพธ์เป็นตัวอักษร Unicode PUA ที่แสดงผลได้ถูกต้องเฉพาะเมื่อโหลดฟอนต์เฉพาะเท่านั้น

หลักการทำงาน

ตัวแปลงอักษรทำงานหลังจากการแปลในฐานะขั้นตอน post-processing โดย pipeline มีดังนี้:

Source (English) → LLM Translation → Working Script → Script Converter → Display Script

ตัวอย่างเช่น Plains Cree:

"Welcome" → LLM → "tānisi" (SRO) → Converter → "ᑖᓂᓯ" (Syllabics)

การจับคู่แบบ Greedy Left-to-Right

ตัวแปลงทั้งหมดใช้อัลกอริทึมเดียวกัน: ที่แต่ละตำแหน่งตัวอักษร จะลองจับคู่ที่ยาวที่สุดก่อน แล้วจึงลองจับคู่ที่สั้นลงตามลำดับ ตัวอักษรที่ไม่ตรงกับรูปแบบใด (เช่น ช่องว่าง เครื่องหมายวรรคตอน ตัวเลข) จะถูกส่งผ่านโดยไม่เปลี่ยนแปลง

วิธีนี้จัดการ digraph และ trigraph ได้อย่างถูกต้อง:

  • Klingon: tlh → ตัวอักษร pIqaD ตัวเดียว (ไม่ใช่ t + l + h)
  • Serbian: njњ (ไม่ใช่ н + ј)
  • Cree: twê → syllabic ตัวเดียว (ไม่ใช่ t + w + ê)

การใช้งานตัวแปลงอักษร

ตัวแปลงอักษรจะเปิดใช้งานโดยอัตโนมัติเมื่อรหัส locale ตรงกับตัวแปลงที่ลงทะเบียนไว้ ไม่จำเป็นต้องตั้งค่าใด ๆ — เพียงกำหนด locale เป้าหมาย:

champollion.config.json
{
"pairs": {
"en:crk": {
"method": "llm-coached",
"model": "google/gemini-2.5-pro"
}
}
}

เมื่อ champollion sync คู่ en:crk การแปลจะถูกสร้างใน SRO ก่อน จากนั้นแปลงเป็น Syllabics โดยอัตโนมัติก่อนเขียนลงใน crk.json

การตรวจสอบสถานะตัวแปลง

npx champollion status

ผลลัพธ์ status จะแสดงว่าคู่ใดมีตัวแปลงอักษรที่ใช้งานอยู่และทำการแปลงอะไร

ข้อกำหนดด้าน Web Font

ตัวแปลงสามรายการส่งออกตัวอักษร Unicode Private Use Area (PUA) ที่ต้องใช้ web font แบบกำหนดเอง:

Klingon (pIqaD)

ติดตั้งฟอนต์ pIqaD ที่รองรับ CSUR (เช่น "pIqaD qolqoS" หรือ "Klingon pIqaD HaSta"):

@font-face {
font-family: 'pIqaD';
src: url('/fonts/pIqaD.woff2') format('woff2');
unicode-range: U+F8D0-F8FF;
}

:lang(tlh) {
font-family: 'pIqaD', sans-serif;
}

Tengwar (Sindarin)

ติดตั้งฟอนต์ Tengwar ที่รองรับ CSUR (เช่น "Tengwar Formal CSUR", "Tengwar Annatar"):

@font-face {
font-family: 'Tengwar';
src: url('/fonts/tengwar-formal-csur.woff2') format('woff2');
unicode-range: U+E000-E07F;
}

:lang(x-elvish-s) {
font-family: 'Tengwar', serif;
}

Kryptonian

ติดตั้งฟอนต์ Kryptonian ที่แมปกับ PUA codepoints U+E100–E119:

@font-face {
font-family: 'Kryptonian';
src: url('/fonts/kryptonian.woff2') format('woff2');
unicode-range: U+E100-E119;
}

:lang(x-kryptonian) {
font-family: 'Kryptonian', sans-serif;
}

:::tip แนวทางทางเลือกสำหรับ Kryptonian เนื่องจาก Kryptonian เป็น cipher แบบ A-Z ล้วน ๆ คุณสามารถข้ามตัวแปลงอักษรได้เลยและใช้ฟอนต์กับข้อความ Latin ผ่าน CSS แทน วิธีนี้มักง่ายกว่าสำหรับการ deploy บนเว็บ — เพียงให้บริการฟอนต์ Kryptonian และตั้งค่า font-family บน element ที่เกี่ยวข้อง :::

การเพิ่มตัวแปลงแบบกำหนดเอง

หากต้องการเพิ่มตัวแปลงสำหรับภาษาใหม่ ให้แก้ไข lib/scripts.js:

  1. สร้าง conversion map — อาร์เรย์แบบเรียงลำดับของคู่ [from, to] โดยเรียงลำดับจากลำดับที่ยาวที่สุดก่อน
  2. สร้างฟังก์ชัน converter — scanner แบบ greedy left-to-right (ใช้ sroToSyllabics เป็นแม่แบบ)
  3. ลงทะเบียน ใน object SCRIPT_CONVERTERS โดยใช้รหัส locale เป็น key
  4. เพิ่มฟิลด์ script ในรายการ register ของภาษานั้นใน registers.js
// Example: adding a converter for Cherokee (chr)
const LATIN_TO_CHEROKEE_MAP = [
['ga', 'Ꭶ'], ['ka', 'Ꭷ'], ['ge', 'Ꭸ'], // ...
];

function latinToCherokee(text) {
// Same greedy left-to-right pattern as other converters
}

SCRIPT_CONVERTERS['chr'] = {
from: 'Latin',
to: 'Cherokee Syllabary',
type: 'deterministic',
converter: latinToCherokee,
};

ดูเพิ่มเติม