ตัวแปลงอักษร
ตัวแปลงอักษร (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 | จาก | ไปยัง | ประเภท | ต้องใช้ฟอนต์? |
|---|---|---|---|---|
crk | SRO (Standard Roman Orthography) | Cree Syllabics | Deterministic | ไม่ — เป็น Unicode มาตรฐาน |
sr | Latin | Cyrillic | Deterministic | ไม่ — เป็น Unicode มาตรฐาน |
tlh | Romanization | pIqaD | Deterministic | ใช่ — PUA U+F8D0–F8FF |
x-elvish-s | Latin | Tengwar (Mode of Beleriand) | Deterministic | ใช่ — PUA U+E000–E07F |
x-kryptonian | Latin | Kryptonian | Font-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 เป้าหมาย:
{
"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:
- สร้าง conversion map — อาร์เรย์แบบเรียงลำดับของคู่
[from, to]โดยเรียงลำดับจากลำดับที่ยาวที่สุดก่อน - สร้างฟังก์ชัน converter — scanner แบบ greedy left-to-right (ใช้
sroToSyllabicsเป็นแม่แบบ) - ลงทะเบียน ใน object
SCRIPT_CONVERTERSโดยใช้รหัส locale เป็น key - เพิ่มฟิลด์
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,
};
ดูเพิ่มเติม
- Conlangs, Scripts & Orthography — ฟอนต์ PUA, Unicode, การเพิ่มตัวแปลงใหม่
- Quality Gate — การตรวจสอบที่ทำงานก่อนการแปลงอักษร
- Supported Languages — ภาษาใดบ้างที่มีตัวแปลงอักษร
- Support a Low-Resource Language — SRO→Syllabics ในบริบท
- Cookbook: FST-Gated Pipeline — การแปลงอักษรใน pipeline แบบหลายขั้นตอน