P7 · 可迭代、可维护、可本地化的文本架构
P7 · 可迭代、可维护、可本地化的文本架构
独立游戏一定会改玩法、一定会重写、一定会做多语言。 架构的目标是:改一句台词,只动一个文件;加一种语言,不动任何代码;删一个场景,不炸掉别的场景。
7.1 单一真相源
所有文本只存在于一处(字符串表 / CSV / JSON / Ink / Yarn),不在代码里硬编码,不在预制体里内联。
违规代价示例(真实高频):台词写在 12 个预制体上 → 改一句人称要开 12 个文件 → 漏改 3 处 → 上线后被玩家截图。
结构:
文本(ID + 内容 + 元数据) ← 唯一真相源
↑
逻辑(节点图/脚本)只引用 ID,不持有文本
↑
表现(UI/对话系统)按 ID 取文本并渲染
7.2 ID 规范
<类别>.<场景或系统>.<序号>[.<变体>]
dlg.q07_blacksmith.01
dlg.q07_blacksmith.02.well_dried
opt.q07_blacksmith.01a
bark.combat.lowhp.03
item.rope_q01.desc
log.q01_note.body
ui.menu.settings
规则:
- ID 永不复用(废弃标
deprecated,不删除,以免旧存档引用崩坏) - 禁止中文、空格、大小写混用
- 变量:
flag.<事件>/num.<计数>/q<章号>_<事件> - 同一事件全项目统一命名(建一张变量字典)
7.3 文本分类标签(裁剪与优先级的依据)
每条文本打 tier 标签:
| Tier | 含义 | 裁剪策略 |
|---|---|---|
| core | 关键路径必需,缺失则无法通关/看不懂 | 永不删 |
| plot | 剧情重要,但缺失不阻断 | 极端情况才删 |
| flavor | 风味、可选、氛围 | 工期吃紧时第一批砍 |
| debug | 占位文本 | 上线前必须清零 |
开工前就标好 tier,你才能在工期吃紧时有依据地砍,而不是随机删。
7.4 工具选型(按团队规模)
| 规模 | 推荐 | 理由 |
|---|---|---|
| 1 人,文本 < 3 万字 | Google Sheets / Excel + CSV 导出 | 零学习成本,diff 友好,可直接给翻译 |
| 1–3 人,有分支 | Ink 或 Yarn Spinner | 纯文本、可版本管理、Unity/Godot 有成熟集成、变量与条件内建 |
| 需要节点可视化 | Twine(原型)/ Articy Draft(免费层) | 注意:图形化工具有供应商锁定与协作成本 |
| 需要多语言协作 | Sheets + Crowdin / Lokalise(小项目先用 Sheets) | 翻译记忆与 Glossary 值得,但先确认文本量 |
无论选什么,必须满足:纯文本可 diff、可导出、可批量替换、ID 稳定。
7.5 重写成本控制
- 场景自包含:一个场景的文本尽量在自己的文件/表里,不跨文件引用他人台词。
- 依赖登记:每个场景简报标注"我依赖哪些 flag、我写入哪些 flag"。改动时先看依赖表。
- 改动词条的代价模型:改一处 ≤ 影响 2 个文件。超过 → 架构有问题。
- 版本管理:文本按文件提交,提交信息写清"改了哪些 ID、为什么"。
- 废弃不删:保留 deprecated 行,避免旧存档与旧分支引用断裂。
7.6 本地化就绪(开工第一天就要做)
| 事项 | 规范 |
|---|---|
| 文本膨胀 | 中文 → 英文/德文/俄文通常膨胀 30–50%;UI 按 +50% 预留或提供缩略版 |
| 图片内嵌文字 | 禁止。要做就分层导出,文字层可替换 |
| UI 定宽 | 按钮/对话框不能写死宽度;提供自动换行与溢出策略 |
| 双关与谐音 | 登记到 translator note,提供"功能等价替换"而非直译 |
| 复数与性别 | 避免依赖目标语言语法的字符串拼接({n} 个{物品} 在俄语里有 3 种形式) |
| 变量插值 | 给插值加注释:第 {day} 天 // day = 整数 1-7 |
| 专有名词表 | 叙事统一维护 Glossary(人名/地名/物品名),禁止各处自译 |
| 引号与标点 | 中文引号""在本地化时需按目标语言替换,不要写死在文本里 |
成本预警:中文 5 万字 → 英文本地化通常是四位数到五位数人民币的支出,且需要 LQA 一轮。若预算为零,至少保证文本架构支持以后再加(而不是重写)。
7.7 配音决策
配音的真实代价不只是钱:
- 成本:按条或按分钟计费,5 万字对白的配音可轻松超过美术预算
- 锁死改词:录完就改不动了(改一句 = 重录一条 = 再花钱)
- 工期:排期、录音、剪辑、植入、口型(若有)
- 本地化:每种语言都要重新配
独立游戏默认策略:不配音,或只配"关键句 + 语气音效"(咕哝、笑声、呼吸)。 若一定要配音:先定稿、先冻结、只配 core 与 plot,flavor 不配。
7.8 交付表结构
见 templates/04-string-table-schema.md。最小字段:
id | tier | 源文本 | 语气/情绪标记 | 场景 | 条件 | 字数 | 译注 | 状态
7.9 架构自检
- 改一句台词需要打开几个文件?> 2 → 重构
- 所有文本都能被 grep 到吗?有没有藏在预制体/脚本里的硬编码?
- 每条文本都有 tier 吗?工期砍半时你知道先砍哪些吗?
- 加一种语言需要改代码吗?
- 有图片内嵌文字吗?
- 变量字典存在吗?同一事件是否只有一种命名?