Skip to content

TRANSLATION_GUIDE

github-actions[bot] edited this page Oct 1, 2026 · 2 revisions

翻译指南 (Translation Guide)

本文档基于 src/services/ai/tasks/translation-service.ts 中的 AI 提示词,详细说明了小说翻译的规则、流程和最佳实践。原文不限语言;日语敬语等规则只在对应语言的原文片段中适用。

目录

  1. 翻译原则
  2. 敬语翻译规范
  3. 工具使用说明
  4. 术语管理
  5. 角色管理
  6. 翻译格式要求
  7. 常见问题

翻译原则

基本要求

  • 目标语言: 书籍设置的目标语言(简体中文 / 繁体中文 / 英文)
  • 翻译风格: 符合原作文体(如轻小说)习惯,自然流畅
  • 段落对应: 严格保证 1:1 对应(1个原文段落 = 1个翻译段落)
  • 术语一致性: 使用术语表和角色设定表确保翻译一致性

质量标准

  1. 准确性: 忠实原文,准确传达原意
  2. 流畅性: 译文自然,符合目标语言表达习惯
  3. 一致性: 术语、角色名称、说话风格保持一致
  4. 完整性: 不遗漏、不添加原文没有的内容

敬语翻译规范

敬语类型与翻译原则

日语敬语在翻译时必须根据上下文和角色关系正确处理:

敬语 用途 翻译建议 示例
さん 通用敬语 "先生"、"小姐"、"女士"、"同学",或根据关系省略 田中さん → 田中先生 / 田中
くん 男性(非正式) "君",或根据语境省略 太郎くん → 太郎君 / 太郎
ちゃん 亲近/年幼 "~酱",或根据语境处理 美咲ちゃん → 美咲酱 / 美咲
様 正式敬语 "大人"、"阁下",或根据语境处理 お客様 → 客人 / 尊贵的客人
殿 古风敬语 "殿"、"阁下" 将军殿 → 将军殿
先輩 前辈 "前辈"、"学长/学姐" 田中先輩 → 田中前辈
後輩 后辈 "后辈"、"学弟/学妹" 佐藤後輩 → 佐藤

敬语翻译流程(必须执行)

1. 优先检查角色别名翻译(最高优先级)

⚠️ 这是最重要的步骤!

  • 在翻译包含敬语的对话时,必须首先检查【相关角色参考】中该角色的 aliases 列表
  • 如果文本中的角色名称(带敬语)与某个别名完全匹配,且该别名已有翻译(translation 字段),必须直接使用该翻译,不得重新翻译
  • 如果别名中包含敬语但翻译为空,应使用 update_character 工具补充该别名的翻译

示例:

文本: "田中さん"
别名列表: [{ name: "田中さん", translation: "田中先生" }]
结果: 必须使用 "田中先生",不得翻译为 "田中小姐" 或其他

⚠️ 重要: 不要自动添加新的别名用于敬语翻译。只使用已存在的别名。

2. 查看角色设定

如果别名中没有找到匹配的翻译:

  • 查看【相关角色参考】中角色的 description 字段
  • 角色描述应包含角色关系信息(如"主角的妹妹"、"同班同学"、"上司"等)
  • 如果描述中缺少关系信息,应使用 update_character 工具补充

角色关系与敬语的对应:

  • 亲密关系(妹妹、青梅竹马、好友): 可考虑省略敬语或使用亲密称呼
  • 正式关系(上司、老师、长辈): 必须保留敬语并翻译为相应中文敬语
  • 不明确关系: 根据对话场景和上下文判断

3. 检查历史翻译一致性

在翻译敬语前,必须使用 find_paragraph_by_keywords 工具:

// 搜索该角色在之前段落中的翻译
find_paragraph_by_keywords({
  keywords: ["田中さん", "田中"],  // 关键词数组(返回包含任一关键词的段落)
  only_with_translation: true,  // 只返回已翻译的段落
  max_paragraphs: 3
  // chapter_id: "章节ID"  // 可选:如果提供,则仅在指定章节内搜索;否则搜索所有章节
})
  • 查看之前如何翻译这个敬语组合
  • 如果找到之前的翻译,必须保持一致
  • 如果是首次出现,根据角色关系和上下文决定

4. 应用角色关系

根据角色描述中的关系信息决定翻译方式:

关系类型 → 翻译策略
━━━━━━━━━━━━━━━━━━
妹妹、好友 → 可省略敬语
上司、老师 → 必须保留敬语
同学、同事 → 根据场景判断
初次见面 → 保留正式敬语

5. 翻译并保持一致性

  • 根据以上步骤确定翻译方式后进行翻译
  • 不要自动添加新的别名
  • 如果用户希望固定某个敬语翻译为别名,应由用户手动添加

工具使用说明

自动提供的参考

每个翻译块中会自动提供:

  • 【相关术语参考】: 当前段落中出现的术语
  • 【相关角色参考】: 当前段落中出现的角色

你可以直接使用这些参考,无需调用工具查询。

术语工具 (Terminology Tools)

工具名称 用途 何时使用
create_term 创建新术语 遇到新的专有名词或特殊概念
get_term 查询术语 需要确认术语当前翻译
update_term 更新术语 发现术语翻译为空或需要修正
delete_term 删除术语 发现无用或错误分类的术语
list_terms 列出所有术语 需要查看全部术语表
get_occurrences_by_keywords 查询词频 决定是否添加/删除术语前确认使用频率

角色工具 (Character Tools)

工具名称 用途 何时使用
create_character 创建新角色 ⚠️ 确认是新角色(不是别名)后创建
get_character 查询角色 需要确认角色当前信息
update_character 更新角色 补充翻译、添加别名、更新描述/口吻
delete_character 删除角色 删除重复角色或错误分类的术语
list_characters 列出所有角色 查看全部角色或检查别名冲突

段落查询工具 (Paragraph Tools)

工具名称 用途 何时使用
get_previous_paragraphs 获取前文段落 需要查看上文语境
get_next_paragraphs 获取后文段落 需要查看下文语境
find_paragraph_by_keywords 关键词搜索 ⚠️ 翻译敬语前必须使用,确保一致性(支持多个关键词)。如果提供 chapter_id 参数,则仅在指定章节内搜索;否则搜索所有章节

关键工具使用示例

搜索历史翻译(敬语翻译必用)

find_paragraph_by_keywords({
  keywords: ["田中さん", "田中"],  // 关键词数组(返回包含任一关键词的段落)
  only_with_translation: true,  // 只返回已翻译的段落
  max_paragraphs: 3
  // chapter_id: "章节ID"  // 可选:如果提供,则仅在指定章节内搜索;否则搜索所有章节
})

检查词频(术语管理必用)

get_occurrences_by_keywords({
  keywords: ["魔法陣", "召喚術"]
})

术语管理

⚠️ 术语与角色严格分离

绝对规则:

  • ✅ 术语表:专有名词、特殊概念、技能、地名、物品等
  • ❌ 术语表中绝对不能包含角色名称(人名)
  • ✅ 角色表:人物、角色名称、别名
  • ❌ 角色表中绝对不能包含术语

如果发现分类错误,必须立即纠正:

  1. 术语表中有人名 → delete_term + create_character
  2. 角色表中有术语 → delete_character + create_term

术语创建原则

只在确实需要时才添加新术语:

✅ 应该添加的术语:

  • 专有名词(地名、组织名、物品名)
  • 特殊概念(魔法体系、技能名称)
  • 具有特殊含义的词汇
  • 反复出现且翻译固定的词汇

❌ 不应该添加的术语:

  • 仅由汉字组成且无特殊含义的普通词汇
  • 常见助词、介词(的、了、在等)
  • 通用词汇(学校、学生等)
  • 出现次数少于 3 次的词汇

创建前必须检查:

// 1. 检查词频
get_occurrences_by_keywords({ keywords: ["新术语"] })

// 2. 检查上下文
find_paragraph_by_keywords({ keywords: ["新术语"] })

术语更新原则(必须执行)

发现以下情况必须立即更新:

  1. 翻译为空: translation 字段为空、空白或占位符
  2. 描述为空: description 缺失但应该补充
  3. 描述不匹配: 描述与当前上下文不符

更新步骤:

// 1. 查询当前状态
get_term({ name: "术语名" })

// 2. 更新翻译或描述
update_term({
  term_id: "xxx",
  translation: "新翻译",
  description: "新描述"
})

术语删除原则(必须执行)

发现以下术语必须删除:

  • 非固有名词、无特殊含义的普通词汇
  • 仅由汉字组成的通用词汇
  • 出现次数 < 3 次的词汇(使用 get_occurrences_by_keywords 确认)
  • 误分类的角色名称
  • 重复的术语

删除流程:

// 1. 检查词频
get_occurrences_by_keywords({ keywords: ["可疑术语"] })

// 2. 确认删除
delete_term({ term_id: "xxx" })

术语维护流程

翻译前
  ↓
检查【相关术语参考】
  ├─ 确认术语/角色分离
  ├─ 检查空翻译 → 更新
  ├─ 检查描述匹配 → 更新
  └─ 识别无用术语 → 标记
  ↓
翻译中
  ├─ 发现空翻译 → 立即更新
  └─ 发现需要新术语 → 检查词频后创建
  ↓
翻译后
  └─ 删除所有标记的无用术语

角色管理

角色名称和别名规范

核心规则:

  • 主名称 (name): 必须是全名(如 "田中太郎")
  • 别名 (aliases): 名字或姓氏的单独部分(如 "田中"、"太郎")

示例:

{
  "name": "田中太郎",
  "translation": "田中太郎",
  "aliases": [
    { "name": "田中", "translation": "田中" },
    { "name": "太郎", "translation": "太郎" },
    { "name": "田中さん", "translation": "田中先生" }  // 敬语也可作为别名
  ]
}

角色创建原则(⚠️ 必须检查别名)

创建前必须执行的检查:

  1. 检查是否已存在该角色:
// 使用 list_characters 或 get_character 检查
list_characters()
get_character({ name: "太郎" })
  1. 判断是全名还是别名:

    • 如果是全名(如 "田中太郎")且不存在 → 创建新角色
    • 如果是单独部分(如 "太郎")→ 检查是否为已存在角色的别名
  2. 检查重复:

    • 如果发现重复角色(相同角色但不同名称)→ 删除重复,添加为别名

创建示例:

// ✅ 正确:全名创建,包含别名
create_character({
  name: "田中太郎",
  translation: "田中太郎",
  sex: "male",
  description: "主角的同学",
  aliases: [
    { name: "田中", translation: "田中" },
    { name: "太郎", translation: "太郎" }
  ]
})

// ❌ 错误:只用名字创建
create_character({
  name: "太郎",  // 应该作为别名添加到全名角色
  translation: "太郎"
})

角色更新原则(必须执行)

1. 更新空翻译

发现翻译为空时必须更新:

update_character({
  character_id: "xxx",
  translation: "新翻译"
})

2. 更新别名(⚠️ 必须检查冲突)

发现新别名时的流程:

// 1. 首先检查该别名是否属于其他角色
list_characters()

// 2. 确认不冲突后添加别名
update_character({
  character_id: "xxx",
  aliases: [
    // 包含所有现有别名 + 新别名
    { name: "田中", translation: "田中" },
    { name: "太郎", translation: "太郎" },
    { name: "小太", translation: "小太" }  // 新增
  ]
})

⚠️ 重要:

  • 更新别名时,数组中只能包含该角色自己的别名
  • 不能包含其他角色的名称或别名
  • 更新前必须用 list_characters 检查每个别名

3. 更新描述(必须执行)

何时更新描述:

  • 描述为空但应该补充
  • 现有描述不完整或不准确
  • 描述与当前上下文不匹配(如角色关系信息错误)

描述应包含的信息:

  • 角色身份(学生、老师、商人等)
  • 角色性别(男性、女性、其他)⚠️ 对代词翻译很重要(优先使用 sex 字段,也可在描述中补充)
  • 角色关系(主角的妹妹、同班同学、上司等)⚠️ 对敬语翻译很重要
  • 角色特征(性格、外貌等)
update_character({
  character_id: "xxx",
  description: "主角的妹妹,性格活泼,擅长魔法"
})

4. 更新说话口吻(必须执行)

何时更新:

  • 角色有独特语气、口癖
  • 古风、方言等特殊说话风格
update_character({
  character_id: "xxx",
  speaking_style: "傲娇,经常说'才不是为了你呢'"
})

角色删除与合并(必须执行)

删除场景:

  1. 误分类的术语 → delete_character + create_term
  2. 重复角色 → 删除重复,添加为别名
  3. 主名称不是全名 → 更新为全名,原名称改为别名

合并重复角色示例:

// 假设存在两个角色:"田中太郎"(全名)和 "太郎"(名字)

// 1. 删除重复的 "太郎"
delete_character({ character_id: "太郎的ID" })

// 2. 将 "太郎" 添加为 "田中太郎" 的别名
update_character({
  character_id: "田中太郎的ID",
  aliases: [
    { name: "田中", translation: "田中" },
    { name: "太郎", translation: "太郎" }
  ]
})

角色维护流程

翻译前
  ↓
检查【相关角色参考】
  ├─ 确认术语/角色分离
  ├─ 检查空翻译 → 更新
  ├─ 检查描述/口吻 → 更新
  └─ 检查重复角色 → 合并
  ↓
翻译中
  ├─ 遇到新角色 → ⚠️ 先检查是否为别名
  ├─ 发现别名 → 添加(⚠️ 先检查冲突)
  ├─ 发现重复 → 删除并合并
  └─ 描述需补充 → 更新
  ↓
翻译后
  ├─ 检查所有信息完整性
  └─ 检查并合并重复角色

翻译格式要求

输入格式

每段文本包含:

  • 段落 ID(格式:[ID: xxx] 原文)
  • 可选:章节标题
  • 可选:相关术语参考
  • 可选:相关角色参考

输出格式(JSON)

必须返回有效的 JSON 对象:

{
  "titleTranslation": "章节标题的翻译(如果有)",
  "translation": "完整翻译文本(所有段落合并,段落间用\\n\\n分隔)",
  "paragraphs": [
    { "id": "段落ID1", "translation": "段落1的翻译" },
    { "id": "段落ID2", "translation": "段落2的翻译" }
  ]
}

格式要求清单

  • 如果有章节标题,必须包含 titleTranslation 字段
  • paragraphs 数组中每个对象必须包含 id 和 translation
  • 段落 ID 必须与原文完全一致
  • 段落数量必须1:1 对应(不能合并或拆分段落)
  • translation 字段包含所有段落合并文本,段落间用 \n\n 分隔
  • 必须是有效的 JSON(注意转义特殊字符)

常见问题

Q1: 什么时候应该添加新术语?

A: 只在以下情况添加:

  • 专有名词(地名、组织名、物品名)
  • 特殊概念(魔法体系、技能)
  • 反复出现(≥3次)且翻译固定

添加前必须:

  1. 使用 get_occurrences_by_keywords 检查词频
  2. 使用 find_paragraph_by_keywords 查看上下文

Q2: 如何判断是创建新角色还是添加别名?

A: 遵循以下流程:

遇到角色名称
  ↓
判断:是全名还是部分?
  ├─ 全名(如"田中太郎")
  │   ↓
  │   检查:是否已存在?
  │   ├─ 不存在 → 创建新角色(包含别名)
  │   └─ 已存在 → 检查是否为重复 → 合并
  │
  └─ 部分(如"太郎"或"田中")
      ↓
      检查:是否为已存在角色的别名?
      ├─ 是 → 添加为该角色的别名
      └─ 否 → 可能是新角色,需更多上下文

Q3: 敬语翻译为什么要检查别名?

A: 别名系统是敬语翻译一致性的核心:

  1. 用户可能手动添加了敬语别名(如 "田中さん" → "田中先生")
  2. AI 之前可能已翻译过该敬语组合
  3. 必须保持一致性,不能同一角色不同段落使用不同敬语翻译

流程:

别名中有匹配的敬语翻译 → 直接使用(最高优先级)
  ↓ 如果没有
查看角色描述中的关系信息 → 判断敬语处理方式
  ↓ 同时
使用 find_paragraph_by_keywords 搜索历史翻译 → 保持一致

Q4: 如何处理重复角色?

A: 发现重复角色时:

// 1. 删除重复的角色
delete_character({ character_id: "重复角色ID" })

// 2. 将删除的角色名称添加为保留角色的别名
update_character({
  character_id: "保留角色ID",
  aliases: [
    // 现有别名
    ...existingAliases,
    // 添加删除的角色名称
    { name: "删除的角色名", translation: "翻译" }
  ]
})

Q5: 术语和角色如何区分?

A: 严格分离原则:

类型 应该在术语表 应该在角色表
人名 ❌ ✅
角色 ❌ ✅
地名 ✅ ❌
物品 ✅ ❌
技能 ✅ ❌
组织 ✅ ❌

如果发现错误分类:

// 术语表中有人名 "田中太郎"
delete_term({ term_id: "xxx" })
create_character({ name: "田中太郎", ... })

// 角色表中有技能 "火球术"
delete_character({ character_id: "xxx" })
create_term({ name: "火球術", translation: "火球术", ... })

Q6: 为什么不能自动添加敬语别名?

A: 原因:

  1. 避免别名爆炸: 自动添加会导致大量别名(田中さん、田中くん、田中先輩等)
  2. 用户意图: 用户可能希望灵活翻译敬语,不固定为别名
  3. 一致性控制: 只使用已存在的别名,确保翻译一致性由用户或明确的历史翻译控制

正确做法:

  • ✅ 使用已存在的别名翻译
  • ✅ 使用 find_paragraph_by_keywords 查找历史翻译
  • ✅ 根据角色关系和上下文翻译
  • ❌ 不自动添加新的敬语别名

Q7: 如何确保翻译一致性?

A: 多层一致性保障:

  1. 术语表: 专有名词、特殊概念翻译固定
  2. 角色表: 角色名称翻译固定
  3. 别名系统: 角色不同称呼(包括敬语)翻译固定
  4. 历史搜索: 使用 find_paragraph_by_keywords 查找之前的翻译
  5. 上下文: 根据角色关系和场景确保敬语翻译合理

总结

关键原则

  1. 敬语翻译: 别名优先 → 角色关系 → 历史一致 → 上下文判断
  2. 术语管理: 只添加必要术语,定期清理无用术语
  3. 角色管理: 全名为主,别名为辅,严格检查重复
  4. 严格分离: 术语和角色绝对不能混淆
  5. 格式要求: 严格 1:1 段落对应,返回有效 JSON

必须执行的检查

  • ⚠️ 翻译敬语前检查别名
  • ⚠️ 创建角色前检查是否为别名
  • ⚠️ 更新别名前检查是否冲突
  • ⚠️ 发现空翻译立即更新
  • ⚠️ 发现描述不匹配立即更新
  • ⚠️ 发现重复角色立即合并
  • ⚠️ 发现无用术语翻译后删除

工具使用优先级

高频必用:

  1. find_paragraph_by_keywords - 敬语翻译、术语一致性(支持多个关键词。如果提供 chapter_id 参数,则仅在指定章节内搜索;否则搜索所有章节)
  2. update_character - 补充翻译、添加别名、更新描述
  3. update_term - 补充术语翻译
  4. list_characters - 检查别名冲突、查找重复角色

按需使用:

  1. create_character / create_term - 确认需要时创建
  2. delete_character / delete_term - 清理无用或重复项
  3. get_occurrences_by_keywords - 决定术语添加/删除前确认词频
  4. get_previous_paragraphs / get_next_paragraphs - 需要更多上下文时

文档版本: 1.0
最后更新: 2025-11-24
基于: translation-service.ts 系统提示词

Clone this wiki locally