Skip to content
woctordho edited this page Mar 21, 2023 · 14 revisions

多语言支持

文件组织

  • 演出脚本、图片等文件的翻译版放在Resources/LocalizedResources/<语言名>/ + 原版相对于Resources/的路径。比如原版是Resources/Scenarios/ch1.txt,英文版就是Resources/LocalizedResources/English/Scenarios/ch1.txt
    • Resources/LocalizedResourcePaths.txt记录所有其他语言的资源文件,由Tools/Resources/generate_localized_paths.py生成
  • 不在LocalizedResources文件夹里的资源文件视为默认语言的版本。AssetLoader首先查找当前语言的翻译版,如果找不到就使用默认语言的版本
    • 绝大多数时候(演出代码、AssetLoader的cache等)用到的文件名都是不带语言的文件名
  • 语言名用UnityEngine.SystemLanguage表示,目前不考虑ISO 639定义的更多语言
  • UI文本的翻译版为Resources/LocalizedStrings/<语言名>.json
  • UI图片的翻译版放在原版的旁边,文件名加一个后缀。UI图片不是由AssetLoader加载的,而是在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)

演出图片的翻译

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

UI的翻译

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

图片/音乐鉴赏的翻译

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

其他

  • 第一次启动游戏,或者重置默认设置之后,根据玩家的操作系统选择语言
    • 这时,I18n.FallbackLocaleChineseChineseTraditional fallback到ChineseSimplified,其他语言fallback到English
    • 如果你支持更多语言,需要修改这个函数
  • 玩家在游戏中可以随时切换语言
  • AssetLoader的cache记录的是不带语言的文件名。切换语言时,cache里的asset如果需要就会重新加载

目前先不管的事情

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