构造语言、文字系统与正字法
champollion 通过 LLM 寄存器和确定性文字转换器为构造语言提供一流支持。本指南涵盖构造语言支持的工作原理、所需字体以及如何添加自己的构造语言。
:::tip 为什么构造语言很重要 构造语言不仅仅是新奇之物——它们使用与真实低资源语言完全相同的基础设施。质量门、教练系统和文字转换管道对克林贡语和平原克里语的处理方式完全相同。如果你的构造语言管道有效,你的低资源语言管道也会有效。 :::
支持的构造语言
| 语言 | 代码 | 文字转换器 | 所需字体 |
|---|---|---|---|
| Klingon | tlh | ✅ 罗马字 → pIqaD | PUA 字体(例如 pIqaD qolqoS) |
| Sindarin(托尔金精灵语) | x-elvish-s | ✅ 拉丁字 → Tengwar | CSUR PUA 字体 |
| Kryptonian | x-kryptonian | ✅ 拉丁字 → Kryptonian | PUA 字体 |
| Pirate English | x-pirate | ❌ 仅寄存器 | 无 |
| Shakespearean English | x-shakespeare | ❌ 仅寄存器 | 无 |
| Yoda-speak | x-yoda | ❌ 仅寄存器 | 无 |
构造语言代码按照 BCP-47 私有使用约定使用 x- 前缀,克林贡语除外(tlh),它拥有由 SIL International 分配的 ISO 639-3 代码。
Unicode、PUA 和字体要求
私有使用区
Klingon(pIqaD)、Sindarin(Tengwar)和 Kryptonian 使用 Unicode 私有使用区(PUA)字符。PUA 是 U+E000–U+F8FF 范围——这些码位没有标准分配。ConScript Unicode Registry(CSUR)维护虚构文字的社区约定映射,但这些不是 Unicode 标准的一部分。
实际含义:
- 没有加载正确字体的 PUA 文本呈现为空框(□□□)
- 不同字体可能将不同的字形映射到相同的 PUA 码位
- champollion 不捆绑 PUA 字体——你必须自己加载它们
- 系统字体永远不会呈现这些字符
按文字系统的 PUA 范围
| 文字系统 | PUA 范围 | CSUR 参考 |
|---|---|---|
| Klingon(pIqaD) | U+F8D0–U+F8FF | CSUR Klingon |
| Tengwar(精灵语) | U+E000–U+E07F | CSUR Tengwar |
| Kryptonian | 因字体而异 | 无 CSUR 标准 |
加载 PUA 网络字体
champollion 包含一个内置命令来下载和管理 PUA 网络字体:
# See which fonts are needed for your configured languages
champollion fonts list
# Download all needed fonts (auto-detects project type for output directory)
champollion fonts install
# Also generate a CSS snippet with @font-face declarations
champollion fonts install --css
fonts install 命令从经过验证的开源仓库下载:
| 字体 | 文字系统 | 许可证 | 来源 |
|---|---|---|---|
| pIqaD qolqoS | Klingon | SIL Open Font License 1.1 | GitHub |
| FreeMonoTengwar | Tengwar | GNU GPL v3(含字体例外) | SourceForge |
| (用户提供) | Kryptonian | 因字体而异 | 无可用的开源 PUA 字体 |
输出目录从你的项目结构自动检测(Docusaurus → static/fonts/、Hugo → static/fonts/、默认 → public/fonts/)。使用 --dir 覆盖。
如果你更喜欢手动管理字体,在你的 CSS 中添加 @font-face 规则:
@font-face {
font-family: 'pIqaD';
src: url('/fonts/pIqaDqolqoS.ttf') format('truetype');
font-display: swap;
unicode-range: U+F8D0-F8FF;
}
/* Apply to Klingon text elements */
[lang="tlh"], [data-script="piqad"] {
font-family: 'pIqaD', sans-serif;
}
:::warning Unicode 支持不保证 Unicode 联盟已明确拒绝在标准中编码虚构文字。PUA 分配由社区维护,可能在字体实现之间产生冲突。始终指定你的项目使用的确切字体,并在浏览器中测试呈现。 :::
文字转换器
工作原理
champollion 的文字转换是一个后翻译钩子:
- LLM 将文本翻译成工作文字(通常是拉丁字或 SRO)
- 质量门验证输出
- 确定性转换器将验证的文本转换为显示文字
- 转换后的文本写入磁盘
这种两步方法有效是因为 LLM 在使用基于拉丁字的文字时产生更好的输出。确定性转换器保证正确的文字输出,无需依赖模型的(通常不可靠的)文字知识。
全部五个转换器
champollion 附带五个内置文字转换器:
Plains Cree:SRO → 音节文字(crk)
标准罗马正字法到加拿大土著音节文字。
Input: "tawâw"
Output: "ᑕᐚᐤ"
长元音使用长音符/抑扬符:ê、î、ô、â。转换器处理所有 SRO 变音符号并将其映射到正确的音节字符。参见支持低资源语言了解完整的克里语管道。
塞尔维亚语:拉丁字 → 西里尔字(sr)
塞尔维亚语的确定性拉丁字到西里尔字转换。
Input: "zdravo"
Output: "здраво"
这处理完整的塞尔维亚字母映射,包括二合字母(lj → љ、nj → њ、dž → џ)。
Klingon:罗马字 → pIqaD(tlh)
Marc Okrand 的罗马字系统到 pIqaD PUA 字符。
Input: "Qapla'" (romanized Klingon)
Output: [pIqaD PUA] (requires pIqaD font to render)
Sindarin:拉丁字 → Tengwar(x-elvish-s)
托尔金的 Sindarin 模式 Tengwar 映射。
Input: "elen síla" (Latin Sindarin)
Output: [Tengwar PUA] (requires Tengwar font to render)
Kryptonian:拉丁字 → Kryptonian(x-kryptonian)
粉丝词汇表 Kryptonian 文字映射。
Input: "Kal-El"
Output: [Kryptonian PUA] (requires Kryptonian font to render)
触发转换器
在你的语言配置中设置 scripts 字段。对于内置转换器,这从语言代码自动检测:
{
"languages": {
"sr": { "scripts": "sr" },
"crk": {}
}
}
Plains Cree(crk)自动检测——你不需要显式设置 scripts。
多文字系统语言
某些真实语言使用多个活跃文字系统:
| 语言 | 文字系统 | champollion 方法 |
|---|---|---|
| 塞尔维亚语 | 拉丁字 + 西里尔字 | 文字转换器(sr)——用拉丁字翻译,转换为西里尔字 |
| 中文 | 简体 + 繁体 | 单独的区域代码(zh vs zh-TW)带有不同的寄存器 |
对于两种文字都服务于同一受众的语言(塞尔维亚语),使用文字转换器。对于文字服务于不同受众的语言(中文简体用于中国大陆,繁体用于台湾/香港),使用单独的区域代码。
正字法注记
寄存器不仅仅是语调——它们携带正字法指令,引导 LLM 朝向正确的书写约定。
正式称呼形式
champollion 的内置寄存器包括每种语言文化上适当的正式称呼:
| 语言 | 正式形式 | 寄存器指令 |
|---|---|---|
| 德语 | Sie | Use Sie-form for formal address |
| 法语 | vous | Use vous-form |
| 俄语 | вы | Professional register with вы-form |
| 土耳其语 | siz | Professional register with siz-form |
| 韩语 | 합쇼체 | Formal Korean (합쇼체) |
| 日语 | です/ます | Polite professional register (です/ます form) |
| 波兰语 | Pan/Pani | Professional register with Pan/Pani form |
性别包容性写作
每个语言卡都有一个 gender.inclusiveGuidance 字段,包含特定于语言的建议。这被单独注入到 LLM 翻译提示中,与寄存器预设分开,因此无论用户选择哪个正式性预设,它都一致适用:
- 法语:包容性写作,带有中点符号(例如"Connecté·e")
- 德语:冒号符号(例如"Benutzer:innen")
- 西班牙语:首选性别中立重组;斜杠符号(例如"usuario/a")作为备选
对于其语言卡中没有特定指导的语言(例如韩语、构造语言),系统回退到通用规则:"优先使用性别中立形式或最具包容性的可用选项。"
RTL 文字要求
阿拉伯语、希伯来语、波斯语和乌尔都语寄存器都注明从右到左要求:Ensure text reads naturally in RTL layout contexts.
覆盖任何寄存器
每个寄存器都是一个配置值——覆盖它以匹配你的项目的声调:
{
"languages": {
"fr": {
"register": "Casual French. Use tu-form. Conversational blog tone. Gender-neutral when possible."
},
"de": {
"register": "Informal German. Use du-form. Tech startup voice."
}
}
}
参见配置了解完整的配置参考。
添加新的构造语言
逐步说明
-
选择 BCP-47 私有使用代码:使用
x-前缀(例如x-dothraki、x-valyrian)。 -
添加到你的配置:
{
"languages": {
"x-dothraki": {
"register": "Dothraki language. Use David J. Peterson's vocabulary from the Living Language Dothraki textbook. Harsh, direct tone. No articles, no verb 'to be'."
}
}
}
-
(可选)添加文字转换器:如果你的构造语言使用非拉丁显示文字,在
lib/scripts.js中添加转换器并在SCRIPT_CONVERTERS中注册它。 -
测试:运行
champollion sync --dry预览翻译而不写入文件。 -
检查质量门:质量门可能需要为你的构造语言调整——特别是如果你的构造语言使用 PUA 字符,
requireNonLatin检查可能需要调整。
:::note 构造语言质量取决于 LLM 知识 LLM 只能翻译成它在训练数据中见过的构造语言。文档完善的构造语言(Klingon、Sindarin、Dothraki)效果很好。晦涩或新创造的构造语言可能产生不一致的结果。使用教练数据来改进质量。 :::