跳转到主要内容

脚本转换器

脚本转换器是确定性的、无需 LLM 的翻译后处理钩子,可将文本从一种书写系统转换为另一种。它们支持"翻译一次,多脚本渲染"的工作流——你翻译成一种可用的脚本(通常是拉丁字母),然后在同步时自动转换为显示脚本。

为什么需要脚本转换器?

某些语言对同一种口语使用多种脚本:

  • 平原克里语:SRO(拉丁字母)用于编辑 → 音节文字(ᓀᐦᐃᔭᐍᐏᐣ)用于显示
  • 塞尔维亚语:拉丁字母用于国际使用 → 西里尔字母用于国内使用
  • 克林贡语:罗马化用于输入 → pIqaD( )用于显示

直接翻译成非拉丁脚本会产生问题:LLM 会产生字符幻觉、JSON 文件难以版本控制、diff 工具无法比较变更。脚本转换器通过在版本控制友好的脚本中保留翻译,并在同步时确定性地转换来解决这个问题。

可用的转换器

Champollion 内置五个脚本转换器:

语言代码源脚本目标脚本类型需要字体?
crkSRO(标准罗马正字法)克里音节文字确定性否 — 原生 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 + ê

使用脚本转换器

当语言代码与已注册的转换器匹配时,脚本转换器自动激活。无需配置——只需设置目标语言代码:

champollion.config.json
{
"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

  1. 创建转换映射 — 一个有序的 [from, to] 对数组,最长序列优先
  2. 创建转换器函数 — 一个贪心左到右扫描器(使用 sroToSyllabics 作为模板)
  3. SCRIPT_CONVERTERS 对象中注册 以语言代码作为键
  4. 添加 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,
};

另见