Skip to content
woctordho edited this page Aug 23, 2021 · 14 revisions

翻译系统

文件组织

  • 演出脚本、图片等文件的翻译版放在Resources/Locales/<语言名>/ + 原版的路径。比如原版是Resources/Colorless/Scenarios/ch1.txt,英文版就是Resources/Locales/English/Colorless/Scenarios/ch1.txt
    • Resources/LocalizedResourcePaths.txt记录所有其他语言的资源文件,由Tools/Resources/generate_localized_paths.py生成
  • 不在Locales文件夹里的文件视为默认语言的版本。AssetLoader首先查找当前语言 + 文件名的版本,如果找不到就使用默认语言的版本
    • 绝大多数时候(演出代码、AssetLoader的cache等)用到的文件名都是不带语言的文件名
  • 语言名用UnityEngine.SystemLanguage,目前不考虑ISO支持的更多语言
  • UI文本的翻译版为Resources/Locales/<语言名>.json
  • UI图片的翻译版放在原版的旁边,文件名加一个后缀。UI图片不是从Resources中加载的,而是在Unity Editor里设置引用

演出脚本的翻译

  • 不同语言中对话的条数相同(否则存档太难搞了)
    • 一条对话的行数和字数可以随意改变,我们目前的UI已经可以比较好地处理很大范围内的行数和字数
  • 不同语言中的演出代码相同
    • 可以把当前语言传入演出代码,然后做一些判断
  • 章节标题的内部名称和显示名称要分开,FlowChartNode只记录内部名称,I18nHelper.NodeNames记录每种语言的显示名称
  • 翻译版的脚本的文件格式与原版脚本类似,但是没有lazy execution block。Eager execution block用来给标题和选项增加这种语言的显示名称,不需要jump_to之类的命令
  • 开始点和结局目前只有内部名称,没有显示名称,所以不用考虑翻译
  • 每条对话中,角色名字与台词用两个中文冒号或两个英文冒号分隔
    • 这是NovaScript语法的一部分,跟<| ... |>一样
    • 一个中文冒号 + 一个英文冒号就不要支持了,太丑了(
    • 台词两边的引号不是语法的一部分,游戏制作者也可以选择直角引号等其他排版
  • 程序启动时parse所有语言的脚本
  • 每个DialogueEntry记录角色名字和台词的每种语言版本,LogEntryController可以直接用DialogueEntry里的信息
  • 切换语言时,DialogueEntryControllerLogEntryController会刷新
  • Lazy execution block的前后可以插入hook,hook可以传入角色名字。(比如当角色名字是“黑匣子”时,就让黑匣子闪一下。)这时使用的角色名字是默认语言的版本,在parse默认语言的脚本时处理
    • 只有hook需要把角色名字当变量处理。Lazy execution block本身不需要把角色名字当变量处理,因为下面的对话已经确定了角色名字
  • FontSizeController支持根据语言把字体大小乘一个系数。TextSpeedConfigReader就不管了,让用户自己调吧
  • I18nFont支持根据语言改变字体(比如把Noto Sans SC变成Noto Sans TC)
  • TODO:目前AdvancedDialogueHelper.Override()还没实现,如果要做的话,游戏制作者需要在默认语言的脚本里定义所有语言的override,而且存档里可以只存override之后的DialogueDisplayData

演出图片的翻译

  • 演出代码用到的文件名与语言无关
  • 切换语言时,SpriteController会刷新(CharacterController先不管了)
  • TODO:图像鉴赏界面要根据语言显示图片和缩略图
  • TODO:选项图片要根据语言改变

UI的翻译

  • UI文本要加上I18nText,记录翻译时使用的key。切换语言时,I18nText会刷新
  • I18nText支持根据语言把字体大小乘一个系数
  • UI图片要加上I18nImage,记录图片的所有语言版本的引用,对按钮也适用。切换语言时,I18nImage会刷新

图片/音乐鉴赏的翻译

  • ImageEntryMusicEntry记录每种语言的显示名称

其他

  • 第一次启动程序,或者重置默认设置之后,根据用户的操作系统选择语言
    • 这时有一个函数把ChineseChineseTraditional fallback到ChineseSimplified,其他语言fallback到English。除此之外不会有需要fallback的时候,我们只给出ChineseSimplifiedEnglish两个选项
  • 用户在游戏中可以随时切换语言
  • AssetLoader的cache记录的是不带语言的文件名。切换语言时,cache里的有些asset会重新加载。先判断每个asset要不要重新加载,再加载文件

目前先不管的事情

  • 先不管从右到左的UI
  • 日期/时间格式在存档里会用到,目前先不管不同语言的日期/时间格式
  • 存档的description不用动,以存档时的语言为准
Clone this wiki locally