Chuyển đến nội dung chính

Bộ chuyển đổi chữ viết

Bộ chuyển đổi chữ viết (Script converters) là các hook hậu dịch thuật mang tính xác định (deterministic), không phụ thuộc vào LLM, giúp chuyển đổi văn bản từ hệ thống chữ viết này sang hệ thống chữ viết khác. Chúng cho phép quy trình làm việc "dịch một lần, hiển thị bằng nhiều hệ chữ" — bạn dịch sang một hệ chữ làm việc (thường là chữ Latinh), sau đó tự động chuyển đổi sang hệ chữ hiển thị.

Tại sao nên dùng Bộ chuyển đổi chữ viết?

Một số ngôn ngữ sử dụng nhiều hệ chữ viết cho cùng một ngôn ngữ nói:

  • Plains Cree: SRO (chữ Latinh) để chỉnh sửa → Chữ tượng thanh (Syllabics - ᓀᐦᐃᔭᐍᐏᐣ) để hiển thị
  • Serbian: Chữ Latinh cho mục đích quốc tế → Chữ Cyrillic cho mục đích nội địa
  • Klingon: Chữ Latinh hóa (Romanization) để gõ → pIqaD ( ) để hiển thị

Việc dịch trực tiếp sang các hệ chữ không phải Latinh sẽ gây ra nhiều vấn đề: LLM bị ảo giác ký tự, các tệp JSON trở nên khó quản lý phiên bản (version-control) và các công cụ so sánh (diff) không thể so sánh các thay đổi. Bộ chuyển đổi chữ viết giải quyết vấn đề này bằng cách giữ các bản dịch ở một hệ chữ thân thiện với hệ thống quản lý phiên bản và chuyển đổi một cách xác định (deterministic) tại thời điểm đồng bộ hóa.

Các bộ chuyển đổi hiện có

Champollion đi kèm với năm bộ chuyển đổi chữ viết tích hợp sẵn:

LocaleTừSangLoạiYêu cầu Font?
crkSRO (Standard Roman Orthography)Cree SyllabicsXác định (Deterministic)Không — Unicode gốc
srLatinCyrillicXác định (Deterministic)Không — Unicode gốc
tlhChữ Latinh hóapIqaDXác định (Deterministic)Có — PUA U+F8D0–F8FF
x-elvish-sLatinTengwar (Chế độ Beleriand)Xác định (Deterministic)Có — PUA U+E000–E07F
x-kryptonianLatinKryptonianMã hóa dựa trên fontCó — PUA U+E100–E119

Xác định (Deterministic) so với Dựa trên Font (Font-Based)

  • Bộ chuyển đổi xác định (Cree, Serbian, Klingon, Tengwar) thực hiện ánh xạ ký tự-sang-ký tự thực tế bằng cách sử dụng các quy tắc ngôn ngữ. Đầu ra chứa các ký tự Unicode thực tế.
  • Bộ chuyển đổi dựa trên font (Kryptonian) là các phép mã hóa thay thế 1:1, trong đó đầu ra là các ký tự Unicode PUA chỉ hiển thị chính xác khi một font chữ cụ thể được tải.

Cách thức hoạt động

Các bộ chuyển đổi chữ viết chạy sau khi dịch như một bước hậu xử lý. Quy trình (pipeline) là:

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

Ví dụ, đối với tiếng Plains Cree:

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

Khớp tham lam từ trái sang phải (Greedy Left-to-Right Matching)

Tất cả các bộ chuyển đổi đều sử dụng cùng một thuật toán: tại mỗi vị trí ký tự, thử khớp chuỗi dài nhất có thể trước, sau đó giảm dần độ dài. Các ký tự không khớp với bất kỳ mẫu nào (khoảng trắng, dấu câu, chữ số) sẽ được giữ nguyên.

Cách này giúp xử lý chính xác các chữ ghép đôi (digraph) và chữ ghép ba (trigraph):

  • Klingon: tlh → một ký tự pIqaD duy nhất (không phải t + l + h)
  • Serbian: njњ (không phải н + ј)
  • Cree: twê → một ký tự tượng thanh duy nhất (không phải t + w + ê)

Sử dụng Bộ chuyển đổi chữ viết

Bộ chuyển đổi chữ viết tự động kích hoạt khi mã locale khớp với một bộ chuyển đổi đã đăng ký. Không cần cấu hình — chỉ cần thiết lập locale đích của bạn:

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

Khi Champollion đồng bộ hóa cặp en:crk, các bản dịch trước tiên sẽ được tạo bằng SRO, sau đó tự động chuyển đổi sang chữ tượng thanh (Syllabics) trước khi ghi vào crk.json.

Kiểm tra trạng thái bộ chuyển đổi

npx champollion status

Kết quả trạng thái hiển thị cặp ngôn ngữ nào có bộ chuyển đổi chữ viết đang hoạt động và chúng thực hiện chuyển đổi gì.

Yêu cầu về Web Font

Ba bộ chuyển đổi cho ra các ký tự thuộc Vùng sử dụng riêng (PUA) của Unicode, yêu cầu phải có web font tùy chỉnh:

Klingon (pIqaD)

Cài đặt một font pIqaD tương thích với CSUR (ví dụ: "pIqaD qolqoS" hoặc "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)

Cài đặt một font Tengwar tương thích với CSUR (ví dụ: "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

Cài đặt một font Kryptonian được ánh xạ tới các điểm mã PUA 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 Cách tiếp cận thay thế cho Kryptonian Vì Kryptonian là một phép mã hóa A-Z thuần túy, bạn có thể bỏ qua hoàn toàn bộ chuyển đổi chữ viết và áp dụng font chữ cho văn bản Latinh thông qua CSS. Cách này thường đơn giản hơn cho việc triển khai web — chỉ cần cung cấp font Kryptonian và thiết lập font-family trên các phần tử liên quan. :::

Thêm bộ chuyển đổi tùy chỉnh

Để thêm bộ chuyển đổi cho một ngôn ngữ mới, hãy chỉnh sửa lib/scripts.js:

  1. Tạo bản đồ chuyển đổi (conversion map) — một mảng có thứ tự gồm các cặp [from, to], các chuỗi dài nhất được xếp trước
  2. Tạo hàm chuyển đổi (converter function) — một trình quét tham lam từ trái sang phải (sử dụng sroToSyllabics làm mẫu)
  3. Đăng ký nó trong đối tượng SCRIPT_CONVERTERS với mã locale làm khóa (key)
  4. Thêm trường script vào mục đăng ký của ngôn ngữ trong 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,
};

Xem thêm