脚本转换器
脚本转换器是确定性的、无需 LLM 的翻译后处理钩子,可将文本从一种书写系统转换为另一种。它们支持"翻译一次,多脚本渲染"的工作流——你翻译成一种可用的脚本(通常是拉丁字母),然后在同步时自动转换为显示脚本。
为什么需要脚本转换器?
某些语言对同一种口语使用多种脚本:
- 平原克里语:SRO(拉丁字母)用于编辑 → 音节文字(ᓀᐦᐃᔭᐍᐏᐣ)用于显示
- 塞尔维亚语:拉丁字母用于国际使用 → 西里尔字母用于国内使用
- 克林贡语:罗马化用于输入 → pIqaD( )用于显示
直接翻译成非拉丁脚本会产生问题:LLM 会产生字符幻觉、JSON 文件难以版本控制、diff 工具无法比较变更。脚本转换器通过在版本控制友好的脚本中保留翻译,并在同步时确定性地转换来解决这个问题。
可用的转换器
Champollion 内置五个脚本转换器:
| 语言代码 | 源脚本 | 目标脚本 | 类型 | 需要字体? |
|---|---|---|---|---|
crk | SRO(标准罗马正字法) | 克里音节文字 | 确定性 | 否 — 原生 Unicode |
sr | 拉丁字母 | 西里尔字母 | 确定性 | 否 — 原生 Unicode |
tlh | 罗马化 | pIqaD | 确定性 | 是 — PUA U+F8D0–F8FF |
x-elvish-s | 拉丁字母 | 腾瓦字母(贝勒瑞安德模式) | 确定性 | 是 — PUA U+E000–E07F |
x-kryptonian | 拉丁字母 | 氪星文 | 基于字体的密码 | 是 — PUA U+E100–E119 |
确定性 vs. 基于字体
- 确定性转换器(克里语、塞尔维亚语、克林贡语、腾瓦字母)使用语言学规则执行真正的字符到字符映射。输出包含实际的 Unicode 字符。
- 基于字体的转换器(氪星文)是 1:1 替换密码,输出是 Unicode 私有使用区(PUA)字符,只有在加载特定字体时才能正确渲染。
工作原理
脚本转换器在翻译之后作为后处理步骤运行。管道如下:
Source (English) → LLM Translation → Working Script → Script Converter → Display Script
例如,平原克里语:
"Welcome" → LLM → "tānisi" (SRO) → Converter → "ᑖᓂᓯ" (Syllabics)
贪心左到右匹配
所有转换器使用相同的算法:在每个字符位置,先尝试最长的可能匹配,然后逐步尝试更短的匹配。不匹配任何模式的字符(空格、标点、数字)原样通过。
这正确处理了二合字母和三合字母:
- 克林贡语:
tlh→ 单个 pIqaD 字符(不是t+l+h) - 塞尔维亚语:
nj→њ(不是н+ј) - 克里语:
twê→ 单个音节文字(不是t+w+ê)
使用脚本转换器
当语言代码与已注册的转换器匹配时,脚本转换器自动激活。无需配置——只需设置目标语言代码:
{
"pairs": {
"en:crk": {
"method": "llm-coached",
"model": "google/gemini-2.5-pro"
}
}
}
当 champollion 同步 en:crk 对时,翻译首先以 SRO 生成,然后在写入 crk.json 之前自动转换为音节文字。
检查转换器状态
npx champollion status
状态输出显示哪些对具有活跃的脚本转换器以及它们执行的转换。
Web 字体要求
三个转换器输出需要自定义 web 字体的 Unicode 私有使用区(PUA)字符:
克林贡语(pIqaD)
安装 CSUR 兼容的 pIqaD 字体(例如"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;
}
腾瓦字母(辛达林语)
安装 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;
}
氪星文
安装映射到 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 氪星文的替代方法
由于氪星文是纯 A-Z 密码,你可以完全跳过脚本转换器,通过 CSS 将字体应用于拉丁文本。这对于 web 部署通常更简单——只需提供氪星文字体并在相关元素上设置 font-family。
:::
添加自定义转换器
要为新语言添加转换器,编辑 lib/scripts.js:
- 创建转换映射 — 一个有序的
[from, to]对数组,最长序列优先 - 创建转换器函数 — 一个贪心左到右扫描器(使用
sroToSyllabics作为模板) - 在
SCRIPT_CONVERTERS对象中注册 以语言代码作为键 - 添加
script字段 到语言在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,
};
另见
- 人造语言、脚本与正字法 — PUA 字体、Unicode、添加新转换器
- 质量门 — 在脚本转换前运行的验证
- 支持的语言 — 哪些语言具有脚本转换器
- 支持低资源语言 — SRO→音节文字的实际应用
- 食谱:FST 门控管道 — 多阶段管道中的脚本转换