《巫师3》双字幕支持 - 重制版兼容

《巫师3》双字幕支持 - 重制版兼容

W3 Dual Subtitle Manager 是一款 Windows 应用,用于为《巫师3》创建和管理双语字幕模组。选择两种受支持的语言,预览合并后的文本,然后安装、修改或卸载该模组。它还支持过场动画字幕,这可能需要大量磁盘空间。

Witcher 3 Dual Subtitle Manager

你也可以从源码构建:undertaq/w3sub: The Witcher 3 dual subtitle manager

你也可以从此处下载预编译程序:Release The Wicher 3 remastered version dual subtitle · undertaq/w3sub

一个 Windows 桌面应用,用于为 The Witcher 3: Wild Hunt — Remastered 5.00 生成和管理双语 .w3strings 更新。

窗口标题显示程序构建版本。

环境要求与启动

  • Windows。独立可执行文件内含 Python 和 Tkinter;无需单独安装 Python。
  • 游戏通过 Steam、GOG 或 Epic Games 安装,或游戏文件夹可用于手动选择。

从可执行文件下载或构建输出中启动 W3DualSubtitleManager.exe。从本地构建启动:

.\dist\W3DualSubtitleManager.exe

从源码启动时,安装 Python 3.10 或更新版本并包含 Tkinter(Windows 标准 Python 安装程序已包含),然后在本项目文件夹中运行:

python w3sub.py

这将打开 GUI。启动程序仅会发现和扫描游戏文件夹;不会自动生成或安装文件。

构建 Windows 可执行文件

在 Windows x64 上使用 Python 3.14 和 Tkinter 构建。PyInstaller 为运行它的平台构建;此配方生成单文件、窗口化的 Windows 可执行文件。

python -m pip install -r requirements-build.txt
.\build.ps1

输出为 dist/W3DualSubtitleManager.exe。构建包含应用、Python/Tk 运行时、内置编解码器及其许可证和声明。游戏资源、每用户数据和可选的外部转换器不包含在内。自定义转换器仍是外部可执行文件,在运行时通过 Browse 选择。配置、日志和生成数据继续使用下文所述的每用户应用程序数据文件夹。

选择并扫描游戏

启动时,应用检查本地 Steam、GOG 和 Epic 安装记录,包括 Steam 库/清单、GOG 注册表记录和 Epic 清单/注册表记录。在显示每个候选项之前会进行验证。如果未找到候选项,或你想使用另一份副本,请使用 Browse 直接选择游戏文件夹。

扫描器检查 bin\x64_dx12 或 bin\x64 下的可执行文件,并接受 Remastered 5.0.x 可执行文件版本(5.00 发行版)。例如,本地 Steam 安装报告 5.0.0.1044392。应用还会扫描 content 和 dlc 下的本地化 .w3strings 资源。每当你选择或浏览到某个文件夹时,它会重新扫描可执行文件版本、可用的商店构建版本以及语言文件。语言菜单包含在该安装中检测到的代码,因此可用性可能因已安装内容和 DLC 而异。

当语言菜单加载时,应用从当前用户的 Documents\The Witcher 3\user.settings(包括重定向的文档文件夹)读取活动的 TextLanguage,并在该资源可用时将其用作默认主语言。当主语言为其他语言时,副语言默认为英语;当主语言为英语时,副语言默认为中文;如果首选副语言不可用,应用会选择另一个已安装语言。应用打开期间,手动选择保持不变;仅当两者否则将相同时,更改主语言才会调整副语言。

选择语言并生成预览

从检测到的菜单中选择不同的 Primary 和 Secondary 语言。主语言是输出资源,并在每个合并记录中保持第一位。任一语言中没有键哈希的条目被视为对话,并按字符串 ID 配对;带键的条目按字符串 ID 加共享键哈希配对。分隔符基于所选语言文本:当配对中包含西文条目时,应用检查西文条目,否则检查主条目。仅当该文本以适合区域的终端标点符号结尾(可选后跟结束引号)时,才插入 <br />;否则插入空格。仅主语言存在的记录保留,而仅存在于副语言文件中的记录不会添加。

仅对话是默认模式。它合并所选两种语言中没有键哈希的条目,按字符串 ID 匹配。全文模式处理所选资源中所有匹配的对话和带键记录。

无哈希匹配是基于解码后的 .w3strings 关联表的启发式方法。对于此模式,两个所选文件中没有键哈希的任何条目都被视为对话。

无键规则可能将没有键哈希的非对话文本归类为对话;未匹配报告有助于检查未配对的语言身份。

内置编解码器 是默认选项,仅需 Python 标准库。它支持已验证的格式 162–163 (UTF-16LE) 和 164 (严格 UTF-8)。启动和选择更改会检查资源路径、配对和编解码器可用性。在预览生成期间,应用通过解码/编码/解码对每个所选资源的隔离副本检查一次,在发布输出前比较容器版本、语言键、每个字符串 ID 和文本,以及每个本地化键关联。嵌入的 CR、LF 和 CRLF 文本通过结构化合并在整个过程中精确保留。未知格式或语言键、无效 Unicode、重复字符串 ID 以及完全重复的键关联会失败关闭。

全文模式按键字符串 ID 匹配无键 ID,按键字符串 ID 加共享键哈希匹配带键条目。仅对话使用相同的无键 ID 标准并排除带键条目。西文终端标点包括 .、..、...、…、?、! 和 ,;东方区域设置识别 ..、... 和 … 以及其对应的标点符号。每次生成文件夹中都会保存一个新的 unmatched_entries.csv,列出两种所选语言中未匹配的身份,包括资源、语言、侧、ID、键哈希、文本和原因。使用预览中的 Open unmatched list 查看它。所有主语言关联都保留,包括一个 ID 的不同哈希以及对存储在其他资源中的 ID 的引用。

使用编解码器选择旁边的 Browse 显式选择用于传统 CSV 路径的外部可执行文件,或使用 Use built-in 清除已保存的覆盖。外部路径对于嵌入换行符保留其面向行的 CSV 限制。旧的 w3strings.exe v0.4.1 仅支持格式 162–163,在格式 164 上将无法通过兼容性检查。内置字符串编解码器无需下载转换器、.NET 运行时或第三方 Python 依赖。编解码器署名和上游 MIT 许可证位于 w3sub_app/third_party/w3strings_codec/。

选择 Generate preview 以运行兼容性验证并生成预览。预览状态报告已处理的合并主条目数占已处理主条目总数的比例和百分比,以及未匹配身份计数。生成的文件、未匹配 CSV,以及所选配对、游戏版本、输入哈希、编解码器类型、实现路径/版本/SHA-256(或外部转换器身份)、输出哈希和合并计数的记录都写入应用程序数据,位于游戏文件夹之外。在继续之前,请查看 GUI 显示的准确目标路径和哈希。

过场动画字幕(.subs 和 .usm)

Include cutscene subtitles 默认开启。在生成预览前清除它,以仅生成交互式 .w3strings 文件。启用时,应用扫描活动游戏捆绑包中的 .subs sidecar 和 .usm 影片。更改的 sidecar 及其完整的伴随 .usm 文件一起打包成一个 movies.bundle,并带有匹配的 metadata.store;游戏要求完整影片与 sidecar 覆盖一起提供。Sidecar 按影片名称、播放文件夹(subs 或 altsubs)和区域后缀配对。两个播放文件夹独立处理,因为它们的提示文本和数量可能不同;仅当相应的主语言资源缺失时才发出别名。

仅当提示的开始和结束时间完全匹配时才配对。重复的时间配对按源顺序一一匹配。没有配对的提示保留在主语言中;来自任一语言的未匹配提示以及无法处理的资源会列在该次生成的 cutscene_unmatched.csv 中。预览的 Cutscene unmatched CSV 按钮打开报告。它包括资源、区域设置、提示时间、文本,以及未匹配提示或被跳过资源的原因。

对于嵌入的 USM 轨道,已确认区域 ID 包括 en、pl、de、it、fr、cz、es、zh、ru、cn、jp、kr、br、esmx 和 ar。没有确认 USM 区域 ID 的所选区域代码,包括 hu、tr 和 ua,会被跳过并报告;未选择的数字区域轨道会保留。不支持的 USM 块/表布局、多个字幕流、未验证的时间配置文件,或合并文本超过影片现有字幕容量,也会报告为跳过。如果所选区域缺失、副本不一致、文件超过 16 MiB 解析限制,或其编码/行与识别的 CRI 格式不匹配,则跳过 sidecar。捆绑包完整性或提取失败会停止生成,而不是发布部分预览。

第二语言在 .subs sidecar 提示内跟随主文本后的回车符(U+000D)。提示记录仍以 CRLF 分隔。嵌入的 USM 字幕提示使用相同的回车换行,已在回顾影片中确认。应用不会将 HTML <br /> 标记插入过场动画文件。嵌入的 USM 修补保留原始提示的区域设置和时间,仅更新已验证的字幕字节、容器大小、填充和视频跳转偏移。

过场动画生成会哈希捆绑包索引以及包含候选过场动画资源的捆绑包内容。启动新鲜度检查使用捆绑包元数据进行快速扫描;生成期间在哈希和处理资源时报告字节进度,安装会在更改文件前重新检查源内容。这可能会读取数 GB 数据并需要一段时间。预览报告估计的扫描/工作字节数、实际的 movies.bundle 包大小和提示匹配计数。影片资源和字幕 sidecar 在生成的捆绑包中保持未压缩,以匹配发布的影片捆绑包布局。完整影片文件很大:用于开发的 5.00 安装包含约 7.2 GiB 的唯一 USM 视频负载,而所选语言包可能更小。生成的输出、临时捆绑包创建、安装暂存和已安装的 Mods 副本需要额外空间;确切的包大小显示在预览中。

开场回顾已在游戏中验证,其修改后的 .subs 和完整 .usm 一起打包:两种语言显示在不同行上。其他过场动画和语言对仍需要游戏内检查。对于观察到的 zh+cn 集,30 个带字幕的 USM 中有 27 个满足当前的静态布局、时间和容量检查;两个超过已验证的字幕容量,一个具有未验证的非零时间头值。其他语言对可能有不同的容量跳过。实时预览报告显示所选游戏和语言的结果。

安装、修改和卸载

  • Install 将交互式 .w3strings 以及 content/bundles/movies.bundle 和 content/metadata.store 写入 Mods/modW3DualSubtitleManager 下。游戏的基础 content 和 DLC 文件保持不动。管理器在写入每个目标之前检查它是新的还是已属于其活动安装。
  • Modify install 更新管理器 mod 覆盖以匹配新预览。生成读取未更改的基础游戏字符串资源。
  • Uninstall 仅在管理器 mod 文件仍与已安装哈希匹配时删除它们。基础游戏文件保持不动。

应用在更改游戏文件前检查是否有正在运行的 Witcher 3 进程。它在生成和安装时存储游戏版本和源资源指纹,然后在启动时和文件夹更改后进行比较。如果源资源在游戏更新后发生变化,预览已过时,必须重新生成。如果活动安装已过期,请安全卸载后再生成替代。版本元数据更改而源资源未变的情况与资源内容更改分开跟踪。

历史生成记录和管理器 mod 安装清单保持可读。旧分类器摘要不影响新鲜度或安全卸载。直接游戏文件安装不受此版本管理;在使用管理器之前,请通过游戏的商店平台恢复这些文件。

如果受管理文件不再与其保存的哈希匹配,或者专用 Mods 文件夹包含管理器不拥有的文件,应用会报告确切的冲突路径并保留意外数据。在修改或卸载期间,它不会覆盖或删除冲突文件。请手动解决冲突,然后重新扫描游戏。

应用数据和恢复文件

在 Windows 上,配置、日志、生成记录、暂存输出和清单存储在:

%LOCALAPPDATA%\W3DualSubtitle\

所选游戏路径保存在 config.json 中。每游戏状态以规范化游戏文件夹路径为键:

%LOCALAPPDATA%\W3DualSubtitle\games\<game-path-hash>\

测试和实时游戏安全

自动化工作流测试在临时目录下创建最小游戏 fixture 的一次性副本。它从不对实时游戏文件夹运行安装、修改或卸载。对于正常 GUI 使用,应用仅在你明确确认 Install 或 Modify 后更改管理器 mod 文件;Uninstall 也需要其自己的确认。