10 KiB
10 KiB
ichni Official 本地化工作流程(Unity Localization)
当前状态
LOC-001:已完成。工作流、范围、命名规则与验收门已确定。LOC-002:代码实现已完成,等待 Unity Play Mode / Use Existing Build 手工验证。- 后续阶段:未开始;在
LOC-002验证通过前,不迁移 String Table、Prefab、场景或 I2。
1. 目标与边界
本流程用于将项目统一迁移到 Unity Localization,并保证首发版本完整支持下列七种语言:
| Locale Code | 语言 | 用途 |
|---|---|---|
zh-CN |
简体中文 | 原文与默认回退语言 |
en |
英文 | 首发语言 |
zh-TW |
繁体中文 | 首发语言 |
ja |
日文 | 首发语言 |
ko |
韩文 | 首发语言 |
vi-VN |
越南文 | 首发语言 |
th |
泰文 | 首发语言 |
范围包含菜单、设置、游戏内提示、结算、剧情树、Helper、Tutorial、歌曲元数据与当前 Chapter 0 的 Yarn 对话。
不在本轮范围内:配音、多语言图片资产、章节 1 的未完成剧情、CreatorStudio 的完整 UI 本地化。CreatorStudio 仅在 Theme TextObject 的共享数据契约受到影响时同步处理。
2. 不可违反的工作规则
- 一次只执行一个阶段。 每一阶段完成后,先进行代码构建和 Unity 手工验证,再批准下一阶段。
- 不直接手改 Unity 自动生成的 String Table
.asset。 表、Locale、Addressables 关系通过 Unity Localization Editor 或专用导入工具创建和更新;CSV/XLSX 是可审阅的文本源。 - 迁移期间不删除 I2。 只有对应界面已切换、所有引用已扫描为零、并完成 Use Existing Build 回归后,才进入删除阶段。
- 稳定 ID 与显示文本分离。 解锁 Key、
SongItemData.songName、Yarn Node 名称、Story Block ID 永远不翻译;只为玩家可见文本配置 Localization Key。 - 动态文本不拼接。 使用 Smart String 与命名参数,例如
"已解锁歌曲:{song_name}";参数在弹窗实际显示时解析,以支持语言切换后的队列内容。 - 每条文本必须有上下文。 导出给翻译使用的表要包含界面位置、用途、占位符说明、最大长度或布局注意事项。
- 字体与布局是验收项。 虽然 TMP 通用字体已准备完成,仍必须在七种语言、PC 与移动端实机上检查字形、断行、溢出与字号。
3. 表结构与 Key 规范
3.1 目标 String Table Collections
| Collection | 内容 | 示例 Key |
|---|---|---|
UI |
所有静态菜单、设置、Gameplay 标签与通用按钮 | ui_common_confirm |
Message |
解锁、确认、错误及其它运行时动态消息模板 | system_unlock_song_content |
Chapter0_Content |
Chapter 0 的歌曲显示名、章节元数据、Timeline、Helper 与教程文本 | chapter0_song_world_for_white_lies_name |
Chapter0_Lines |
Yarn Spinner 自动生成的 Chapter 0 台词与选项 | Yarn #line ID |
这四张表按加载生命周期划分,而不是按每一个页面拆分。Chapter0_Lines 规模最大,必须保持独立;其它表保持小而稳定。后续章节只新增 ChapterN_Content 与 ChapterN_Lines 两张表。
UI.csv 同时保留当前仍被场景或 Prefab 使用的旧 Key,直至对应页面完成迁移;旧 Key 不得在确认没有引用前从 Unity Table 或 CSV 中删除。
3.2 Key 命名
- 仅使用小写英文、数字和下划线。
- 格式为
<域>_<模块>_<语义>,不包含显示语言或版本号。 - 不把原文、屏幕坐标、Prefab 名称写入 Key。
*_title、*_content、*_desc成对出现时必须共享同一语义前缀。- 智能字符串只允许命名参数:
{song_name}、{count}、{chapter_name};禁止{0}和 C# 字符串拼接。
4. 执行阶段与验收门
LOC-001:基线盘点与迁移冻结(当前阶段)
操作
- 保存本文件,并建立文本资产、I2 引用、硬编码文本、Yarn 表和现有 Locale 的清单。
- 为每个待迁移对象标注目标 Collection、Key、上下文和责任阶段。
- 确认
zh-CN作为原文、七种 Locale 作为首发范围、TMP 通用字体作为字体基线。
不得操作
- 不改运行时代码、Prefab、场景、String Table、I2 文件或 Addressables。
验收
- 清单明确列出所有 I2 依赖入口和所有已存在的 Unity Localization Collection。
- 后续阶段有明确的输入、输出、回滚边界与手工测试项。
LOC-002:运行时本地化基础层
操作
- 将设置存档的语言选择从不稳定的
languageIndex迁移为languageCode,并保留旧索引到旧顺序的单次迁移逻辑。 - 保留现有 Unity Localization 官方
InitializationOperation流程;不得重新引入自定义 Bootstrap 或被阻塞的场景预加载。 - 新增统一的异步文本解析入口,供动态 UI、Story 元数据与弹窗使用。
验收
- 删除
SettingsSave后,系统语言和默认zh-CN均可稳定启动。 - 七个代码可从设置界面切换,切换后
LocalizedString自动刷新。 - Windows/Android/iOS 的 Use Existing Build 均不出现 String Table 长时间
0%加载。
LOC-003:表与导入流水线
操作
- 由内容维护者在 Unity Localization Editor 中手动创建并维护四个 Collection,以及全部七个 Locale 的表。
- 代码与内容侧只维护版本控制中的 UTF-8 CSV 源表;由内容维护者将 CSV 转录到对应的 Unity Table。
- 每次转录前校验 Key、Yarn 行 ID、缺失翻译、重复 Key 与 Smart String 占位符。
验收
- 四张 CSV 与对应 Collection 同名,列顺序统一为七种首发 Locale。
- CSV 校验可报告缺失翻译、额外 Key、占位符不一致和重复 Key。
Message至少包含可验证的 Smart String 示例。
LOC-004:静态 UI 与系统文本迁移
操作
- 分批迁移
UI中的静态页面、系统按钮与 Gameplay 标签。 - 静态 TMP 文本使用
LocalizeStringEvent或等价的 Unity Localization 组件;动态生成的 Button / Settings 控件改为统一解析入口。 - 迁移 Summary、Pause、确认框、设置项、选曲与章节页可见文本。
验收
- 每完成一个页面,I2 与 Unity Localization 不会同时驱动同一 TMP_Text。
- 七语切换后页面不出现 Key、空文本、Missing Script 或旧 I2 文本。
LOC-005:动态消息与内容元数据迁移
操作
- 将
MessageUIPage队列改为保存LocalizedString和命名参数,而非已解析的裸字符串。 unlock_song通过Chapter0_Content取歌曲显示名,并用system_unlock_song_title/system_unlock_song_content显示提示。- 迁移歌曲、章节、角色、难度、Timeline Marker、Helper 的可见元数据。
验收
- 解锁消息能正确代入任意歌曲名;消息排队期间切换语言后,实际显示时使用新语言。
- ID、存档 Key、Story Block ID 和解锁行为不因翻译改变。
LOC-006:剧情与对话迁移
操作
- 使用 Yarn Spinner 的 Unity Localization 导入/导出流程维护
Chapter0_Lines;不手写或复用错误的#lineID。 - 导出当前 Chapter 0 全部台词、选项与行 ID,填入七种测试翻译。
- 将 StoryData 的标题、Marker、Helper 对话等非 Yarn 文本迁入
Chapter0_Content。
验收
- 每种语言均可打开所有已配置 TextBlock,选项、跳转、变量、回滚和历史记录正常。
- Yarn 行 ID、节点名称和命令参数没有被翻译或改写。
LOC-007:Theme TextObject 与 CreatorStudio 契约
操作
- 将 Official Theme
TextObject的 I2 调用替换为 Unity Localization,同时保留isLocalized/content的序列化含义。 - 对应更新 CreatorStudio 的共享
TextObject_BM读写契约,但不在 Creator 中维护第二套权威翻译表。 - 重建 Windows、Android、iOS Theme AssetBundle。
验收
- 旧 BM / Bundle 可安全读取;本地化文字在三个目标 Bundle 中正确显示。
- Bundle Manifest 与运行时日志均不存在
I2.Loc类型引用。
LOC-008:I2 清理
操作
- 先导出 I2 旧表作为只读迁移备份。
- 逐项确认所有场景、Prefab、脚本、Theme Bundle 和 Creator 共享元素已无 I2 引用。
- 删除
Assets/I2、根目录 I2 配置及依赖代码;将SimpleJSON用途迁至项目已有的 Newtonsoft JSON。
验收
- 全项目扫描
I2.Loc、LocalizationManager、Localize均无业务引用。 - 打开场景无 Missing Script,三平台构建通过。
LOC-009:七语翻译完成与发布 QA
操作
- 完成当前 UI、系统消息、内容元数据、Chapter 0 测试剧情的七语翻译。
- 执行占位符、字体、长度、断行、输入、回退、保存与 Addressables 回归。
- 冻结当前字符串;新文本必须走 CSV -> Review -> Import 流程。
验收
- 每个 Collection 在七种语言中均无缺失条目和占位符错误。
- PC、Android、iOS 依次验证默认语言、切换语言、重启持久化、剧情、解锁、选曲、结算、设置。
- 文本溢出和文化语义问题归零或有明确的发布豁免记录。
5. 阶段执行模板
每一阶段均按以下顺序执行:
- 只读复查相关代码、Prefab、场景和当前 String Table。
- 输出该阶段的精确文件清单、风险和回滚方法。
- 只修改该阶段授权范围内的文件。
- 执行 C# 构建与定向文本扫描。
- 提供 Unity 手工测试清单;在用户确认通过前,不进入下一阶段。
6. 关键回归场景
- 首次启动、系统语言匹配、默认
zh-CN回退。 - 设置页连续切换七种语言并立即关闭/重开游戏。
- Use Asset Database 与 Use Existing Build 的 Menu -> Story -> Song -> Game 全路径。
- MessageBox / SelectionBox 排队时切换语言;歌曲解锁时显示本地化歌曲名。
- Story Timeline、Helper、TextBlock、TutorialBlock、SongBlock、Dialog History、回滚 Marker。
- 结算页、暂停页、设置页、章节选择、选曲页在窄屏手机和 PC 窗口模式下的溢出检查。
7. 当前阶段后的下一步
LOC-001 完成后,先单独提交并评估 LOC-002:运行时本地化基础层。它只涉及语言存档契约、统一动态文本解析入口和初始化回归,不触碰 I2、Prefab 或现有 String Table 内容。