专名本土化(信达雅):冻结译名表 + 渲染层,并修掉校验器的正则盲点

- 新增 dfannals/glossary.py(译名表)与 dfannals/localize.py(渲染层)
  人名=音译+绰号意译(Ral Fastenhatchets→拉尔·缚斧、朗古德·商熊「剖胎之寒」),
  地名整体意译(Fordedwinds→涉风渡、The Volcano Of Ravens→渡鸦火山)
- 生成链路本土化:素材渲染、人物表、扩写白名单全部走译名;已有产物做确定性替换
- 修复 factcheck 的 \b 盲点:Unicode 下汉字也算词字符,紧贴汉字的英文名不被检查
  (曾因此漏掉编造专名)。修好后抓出并定点修掉长版第 1 集的 2 处编造
- 修正 title_form 大小写(YETI→Yeti),此前 Yeti/Goblin 一直漏译
- 新增 tests/test_localize.py(13 项回归)
This commit is contained in:
Chen Yi
2026-10-05 22:39:53 +08:00
parent 8630dcad55
commit 16b476167e
14 changed files with 924 additions and 350 deletions
+4 -3
View File
@@ -12,7 +12,7 @@ from dataclasses import dataclass, replace
from pathlib import Path
from dfannals import episodes as ep_mod
from dfannals import gate
from dfannals import gate, localize
from dfannals.cast import collect_rows
from dfannals.chronicle import cjk_length
from dfannals.config import (
@@ -194,12 +194,13 @@ def render_material(
"",
"### 写作要求",
"",
f"- 本集 {CHAPTER_MIN_CHARS}–{CHAPTER_MAX_CHARS} 字,中文正文,专名保留英文。",
f"- 本集 {CHAPTER_MIN_CHARS}–{CHAPTER_MAX_CHARS} 字,中文正文,人名地名用上面给出的中文译名。",
"- 贴着主角写:他们的目标、算计、得失做主语;对手要是个具体的人。",
"- 性别按上面卡片写,不要默认“他”;史料未载性别时用名字或身份称呼。",
"- 史料之外的世界大事不要写;只有影响到主角时才提一句。",
]
return "\n".join(lines)
# 专名本土化:素材里的英文原名换成中文译名,让模型直接用中文写
return localize.for_world(world).render("\n".join(lines))
def build_messages(