1. 项目概述:XUnity.AutoTranslator 是什么,以及它能为你做什么
如果你是一名Unity游戏的爱好者,尤其是经常接触那些尚未推出官方中文版本的作品,那么你一定对游戏内大段的日文、英文文本感到头疼。手动截图、切图、丢进翻译软件,再对照着修改游戏文件?这套流程不仅繁琐,而且破坏了沉浸式体验。XUnity.AutoTranslator(以下简称XUA)就是为了解决这个痛点而生的神器。它是一个高级的、可高度定制的翻译插件,能够自动拦截并翻译Unity引擎游戏中显示的文本,实现近乎实时的“内嵌汉化”效果。
简单来说,XUA就像是一个潜伏在游戏进程内的同声传译。当游戏试图在屏幕上显示一段文字时,XUA会先“听到”这段原文,然后立刻在自己的“词库”(包括在线翻译服务和本地翻译文件)里查找对应的译文,最后将译文替换上去显示给玩家。整个过程对游戏本身是透明的,你无需修改任何游戏原始文件,也无需等待漫长的汉化组发布补丁。无论是视觉小说(VN)中的大段对话,还是角色扮演游戏(RPG)里的物品描述和技能说明,甚至是其他Mod的界面文字,它都有能力处理。
这个项目的核心价值在于其“自动化”和“可扩展性”。自动化意味着开箱即用,配置好翻译服务(如谷歌翻译)后,首次遇到的文本会被自动翻译并缓存,下次再见时直接显示,速度极快。可扩展性则体现在它不仅仅是一个翻译器,更是一个强大的游戏文本修改框架。你可以手动润色自动生成的生硬翻译,可以编写正则表达式(Regex)处理复杂的文本组合,可以替换游戏内的图片资源(如UI图标),甚至可以为其开发新的翻译服务接口。对于Mod作者,它还提供了丰富的API,允许其他插件与之交互或避免冲突。
因此,无论你是一名只想轻松玩上外语游戏的普通玩家,还是一个希望为社区贡献高质量翻译的汉化者,亦或是一名想要深度定制游戏体验的开发者,XUnity.AutoTranslator都提供了一个从入门到精通的、功能强大的平台。接下来,我将带你从零开始,彻底掌握这个工具。
2. 核心架构与工作原理解析
要高效使用XUA,不能只停留在“怎么安装”的层面,理解其核心架构和工作原理,能让你在遇到问题时快速定位,并充分发挥其潜力。XUA并非一个简单的“文本替换器”,而是一个由多个模块协同工作的复杂系统。
2.1 核心模块分工
XUA主要由两大核心模块构成:AutoTranslator(自动翻译器)和ResourceRedirector(资源重定向器)。它们的关系类似于“前台”和“后台”。
AutoTranslator(前台-文本处理核心):这是用户直接交互的部分。它负责:
- 文本钩取(Hooking):利用Harmony或MonoMod等技术,在游戏运行时拦截所有对UI文本组件(如UnityEngine.UI.Text, TextMeshPro)的赋值操作。这是实现实时翻译的基础。
- 翻译查询(Translation Lookup):当拦截到一段文本后,插件会按照预设的优先级进行查询。优先级从高到低通常是:手动翻译文件(.txt) -> 内存中的缓存翻译 -> 在线翻译服务。
- 文本处理流水线:查询到的译文并非直接显示。它会经过一个处理流水线,包括预处理(如移除多余空格)、翻译、后处理(如罗马字音标处理)以及UI适配(如字体替换、文本框自动缩放)。
- 配置与管理:提供热键(如ALT+T开关翻译、ALT+R重载翻译)、配置界面和丰富的配置文件(
Config.ini)来管理所有行为。
ResourceRedirector(后台-资源劫持引擎):这是一个独立且更底层的库,为AutoTranslator提供强大的扩展能力。它允许插件在游戏加载资源(如文本资产TextAsset、纹理Texture)的瞬间,将其重定向到外部自定义文件。这意味着:
- 文本资源替换:游戏原本从
resources.assets包内读取的脚本文件,可以被重定向到Translation/目录下的同名文件,实现更彻底、更稳定的文本修改。 - 纹理替换:游戏内的图片、UI图标可以被替换,这对于完整汉化(比如替换带有文字的按钮图片)至关重要。
- 通用性:ResourceRedirector本身不依赖AutoTranslator,任何其他Mod也可以利用它来修改游戏资源,这使得XUA生态非常强大。
2.2 翻译流程与缓存机制
一次完整的翻译请求,其内部流程如下:
- 触发:游戏代码调用
textComponent.text = “おはよう”。 - 拦截:XUA的钩子函数捕获到这个调用和文本内容
“おはよう”。 - 标准化:插件对原始文本进行标准化处理,例如去除首尾空白字符,处理内部的换行符和连续空格,生成一个用于查询的“键(Key)”。这是为了应对游戏在不同场景下可能对同一段文本进行微小格式调整的情况。
- 四级查询:插件会尝试用四个不同严格程度的“键”去查询翻译:
- 键1:原始文本。
- 键2:去除首尾空白的文本。
- 键3:去除内部换行符周围空白的文本。
- 键4:同时去除首尾空白和内部换行空白的文本。 只要任一查询命中,即返回对应的翻译,并保留原始文本的空白格式。这个设计非常巧妙,确保了翻译的鲁棒性。
- 命中缓存:如果在本地翻译文件或内存缓存中找到译文,则直接进入步骤7。
- 调用在线服务:如果未命中缓存,且配置了在线翻译端点(如GoogleTranslate),插件会将文本发送给该服务。收到回复后,译文会被同时写入屏幕和自动生成翻译文件(
_AutoGeneratedTranslations.txt)中,以备下次使用。 - 后处理与渲染:对译文进行可能的后处理(如罗马字转换),然后根据配置决定是否替换字体、调整UI组件大小,最后将处理后的文本设置回游戏的UI组件。
缓存机制是XUA流畅体验的关键。首次运行游戏时,由于所有文本都需要在线翻译,可能会有明显的卡顿和网络请求。但随着游戏进行,_AutoGeneratedTranslations.txt文件会不断增长,下次启动游戏时,绝大部分文本都直接从本地文件读取,速度极快。这也是为什么社区汉化组可以分享这个文件——它本质上就是一个积累了高质量翻译的词典。
2.3 配置文件(Config.ini)的核心作用
BepInEx/config/AutoTranslatorConfig.ini是XUA的大脑。几乎所有功能都通过它来开关和微调。理解几个关键区块至关重要:
[General]:设置源语言、目标语言、翻译端点等全局选项。[Behaviour]:控制插件核心行为,如是否启用UI重设大小、字体覆盖、批处理翻译等。[Texture]:控制纹理(图片)替换功能的开关和行为。[Http]:网络相关设置,如用户代理。- 各个翻译服务(如
[Google],[Baidu])的专属配置区块,用于填写API密钥。
实操心得:不要被长长的默认配置文件吓到。对于新手,90%的选项保持默认即可。你只需要关注
[General]里的Language(目标语言,如zh-CN)和Endpoint(翻译服务,如GoogleTranslate)。其他高级选项,等你有特定需求(如字体显示不正常、文本框显示不全)时,再按图索骥去修改。
3. 从零开始:安装、配置与基础使用
理论说得再多,不如动手实践。我们以最流行的Mod管理器BepInEx为例,讲解完整的安装和配置流程。
3.1 环境准备与插件安装
- 安装BepInEx:首先确保你的目标Unity游戏已经安装了正确版本的BepInEx。通常,将BepInEx压缩包内的文件解压到游戏根目录即可。运行一次游戏,生成
BepInEx文件夹结构。 - 下载XUnity.AutoTranslator:前往GitHub的Release页面,下载对应你Mod管理器的版本。对于BepInEx 5.x,选择
XUnity.AutoTranslator-BepInEx-5.x-{VERSION}.zip。 - 安装插件:将下载的ZIP文件解压,你会看到
BepInEx文件夹。将其直接拖拽到游戏根目录,与现有的BepInEx文件夹合并。关键路径是BepInEx/plugins/XUnity.AutoTranslator。 - 安装ResourceRedirector:通常,上述插件包内已包含必需的
XUnity.ResourceRedirector.dll。确保它存在于BepInEx/plugins或BepInEx/patchers目录下(根据版本不同)。这是纹理替换和高级资源重定向功能的基础。
3.2 首次运行与基础配置
- 启动游戏:运行游戏,如果安装成功,游戏启动时在日志中应该能看到XUnity.AutoTranslator的加载信息(通常BepInEx会在游戏窗口标题栏或控制台显示)。
- 生成配置文件:首次运行后,关闭游戏。在
BepInEx/config目录下,会生成AutoTranslatorConfig.ini。 - 编辑核心配置:用记事本或任何文本编辑器打开
AutoTranslatorConfig.ini。找到并修改以下关键参数:[General] ; 设置目标语言为简体中文 Language=zh-CN ; 设置在线翻译服务为谷歌翻译(免费版) Endpoint=GoogleTranslate ; 翻译输出目录,通常保持默认即可 Directory=Translation\{Lang}\Text ; 自动生成翻译的文件名 OutputFile=_AutoGeneratedTranslations.txt - 配置在线翻译服务(以GoogleTranslate为例):默认的谷歌翻译端点使用的是公开的网页接口,可能不稳定或被限制。如果遇到翻译失败,可以尝试以下两种方案之一:
- 方案A:使用备用公共接口。在配置文件中找到
[Google]区块,尝试修改ServiceUrl(注意:此操作需自行寻找可用且合规的公共服务接口,并确保其符合相关法律法规和使用条款)。 - 方案B(推荐,更稳定):使用其他翻译服务。将
Endpoint改为BaiduTranslate或YandexTranslate等,并在对应的配置区块(如[Baidu])填入你从相应平台申请的合法API密钥(AppId和AppSecret)。这是最可靠的方式。
- 方案A:使用备用公共接口。在配置文件中找到
3.3 基础使用与热键
配置完成后,再次启动游戏。你会发现游戏内的文本正在被逐步翻译。以下是几个必须掌握的基础热键:
- ALT+0:打开翻译端点选择菜单。如果你配置了多个翻译服务,可以在这里实时切换。
- ALT+T:全局翻译开关。这是最重要的热键,可以一键开启或关闭所有文本翻译。当翻译导致游戏UI错乱或你想看原文时,就用它。
- ALT+R:重新加载翻译文件。当你手动修改了
Translation\zh-CN\Text\目录下的任何.txt翻译文件后,按此热键无需重启游戏即可生效。 - ALT+`(反引号键):打开插件的控制台(如果启用),可以查看详细日志。
注意事项:首次运行游戏,翻译速度取决于你的网络和翻译服务的响应速度。建议在游戏主菜单或非关键剧情处等待一段时间,让插件完成一批初始文本的翻译和缓存。后续游戏体验会非常流畅。
4. 进阶实战:手动翻译、正则表达式与资源替换
当自动翻译无法满足你对质量的要求,或者遇到一些特殊文本格式时,就需要手动介入。这是XUA从“能用”到“好用”的关键。
4.1 创建与维护手动翻译文件
自动生成的_AutoGeneratedTranslations.txt文件是翻译的起点,但直接编辑它并非最佳实践,因为游戏更新或插件重装可能会覆盖它。正确的方法是创建独立的手动翻译文件。
- 定位目录:打开
BepInEx\plugins\XUnity.AutoTranslator\Translation\zh-CN\Text\(假设目标语言是简体中文)。 - 创建新文件:新建一个文本文件,例如
MyManualTranslations.txt。文件名可以任意,只要扩展名是.txt。 - 编写翻译:文件内容遵循“原文=译文”的格式,一行一条。例如:
おはようございます=早上好 アイテム=物品 これはテストです=这是一个测试 - 优先级规则:XUA会读取
Text目录下所有的.txt文件。手动翻译文件的优先级高于自动生成的文件。如果同一原文出现在多个文件,后加载的文件会覆盖先加载的(通常按文件名排序)。你可以利用这一点来修正自动翻译的错误。 - 使用正则表达式:对于有规律的文本,可以使用正则表达式进行批量匹配。在翻译行前加上
r:标识。例如,游戏中有很多“リング + 数字”格式的物品名:
这条规则会将“シンプルリング 1”翻译为“简易戒指 1”。r:"^シンプルリング ([0-9]+)$"=简易戒指 $1$1代表正则表达式中第一个括号捕获的内容。
4.2 处理复杂文本:拆分器正则表达式(Splitter Regex)
这是XUA的一个杀手级功能。有些游戏会将多个文本片段在代码中拼接后再显示,例如“[ATK+10] 炎の剑”。如果我们只为“炎の剑”提供了翻译,那么面对这个拼接后的字符串,插件将无法匹配。
此时,可以使用拆分器正则表达式(以sr:开头),先拆解,再分别翻译各部分,最后重组。
sr:"^\[(?<stat>[\w\s]+)(?<num_i>[\+\-]{1}[0-9]+)?\](?<after>[\s\S]+)?$"="[${stat}${num_i}]${after}"让我们拆解这个复杂的例子:
sr::声明这是一个拆分器正则表达式。^\[...\]...$:匹配以[开头,后面跟着],再跟着其他内容的字符串。(?<stat>[\w\s]+):命名捕获组stat,匹配属性名(如ATK, DEF),包含字母、数字、下划线和空格。(?<num_i>[\+\-]{1}[0-9]+)?:命名捕获组num_i,匹配+或-后跟数字(如+10)。?表示这个组是可选的。_i后缀是关键,它告诉插件这个组的内容不需要翻译,原样传递。(?<after>[\s\S]+)?:命名捕获组after,匹配]之后的所有内容(即“炎の剑”)。[\s\S]匹配任何字符包括换行。="[${stat}${num_i}]${after}":重组格式。${stat}和${after}会被送去翻译(如果词库里有),${num_i}则直接原样插入。
这样,插件遇到“[ATK+10] 炎の剑”时,会将其拆分为stat=“ATK”,num_i=“+10”,after=“炎の剑”。然后查找“炎の剑”的翻译(比如“Flame Sword”),最后组合成“[ATK+10] Flame Sword”显示出来。
实操心得:编写正则表达式时,务必先在小型文本上测试。可以将游戏中的原文日志(通过开启
EnableLog=True查看)复制出来,在正则表达式测试工具中验证。过度复杂或低效的正则表达式会影响游戏性能。
4.3 纹理(图片)替换实战
对于UI中包含文字的图片(如菜单按钮、图标),纯文本翻译无能为力。这时就需要纹理替换功能。
- 启用功能:在
Config.ini中,找到[Texture]区块,进行如下设置:[Texture] EnableTextureTranslation=True EnableTextureDumping=True ; 首次使用时开启,用于导出游戏内图片 TextureDirectory=Translation\Texture TextureHashGenerationStrategy=FromImageName ; 大多数情况用这个,性能最好 - 导出纹理:启动游戏,并进入包含目标图片的场景。XUA会将检测到的纹理图片自动导出到
Translation\Texture目录下。文件名会包含哈希值,如button_ok [ABCD1234-EF567890].png。 - 编辑图片:用图像处理软件(如Photoshop, GIMP)打开导出的图片,将其中的外文修改为中文。重要:保存时务必保留原文件名和哈希值部分。你可以修改哈希值之前的部分,例如将
button_ok [ABCD1234-EF567890].png重命名为确认按钮 [ABCD1234-EF567890].png,但[ABCD1234-EF567890]必须原封不动。 - 关闭导出,享受成果:编辑完成后,将配置中的
EnableTextureDumping=False,以防止后续游戏继续导出已处理的图片。重启游戏,修改后的图片就应该显示出来了。
注意事项:纹理替换功能对性能有一定影响,尤其是开启
EnableTextureScanOnSceneLoad时。建议只替换必要的UI图片,对于大量的3D模型贴图,通常没有替换必要且会显著增加内存占用。在发布整合包时,绝对不要开启EnableTextureDumping、EnableTextureToggling等调试选项。
5. 高级定制与故障排除指南
当你熟悉基础操作后,可能会遇到一些特殊需求或棘手问题。本章节将深入高级配置和常见故障的解决方案。
5.1 字体显示问题与解决方案
翻译为中文、韩文等非拉丁语系文字时,游戏原版字体可能缺少对应字形,导致显示为方框(□□□)。
解决方案1:字体覆盖(OverrideFont)在[Behaviour]部分设置OverrideFont(针对UGUI)或OverrideFontTextMeshPro(针对TextMeshPro)。这会将游戏中所有文本的字体强制替换为你指定的字体。
- 对于UGUI:你需要提供一个
.ttf或.otf字体文件,放在游戏根目录,然后在配置中指定文件名(如OverrideFont=myfont.ttf)。更可靠的方式是制作一个包含该字体资源的AssetBundle,但这需要Unity Editor知识。 - 对于TextMeshPro:你可以指定一个系统字体名(如
Microsoft YaHei),或者使用插件作者提供的预编译字体AssetBundle(在Release页面的TMP_Font_AssetBundles压缩包中),解压后放入游戏根目录并配置路径。
解决方案2:后备字体(FallbackFontTextMeshPro)这是更优雅的解决方案,仅当主字体缺失字符时,才使用后备字体。配置FallbackFontTextMeshPro指向一个支持目标语言的TMP字体资源(如Fonts & Materials/LiberationSans SDF Fallback)。这需要游戏内置或通过AssetBundle提供了相应的后备字体资源。
实操心得:优先尝试
FallbackFontTextMeshPro。如果游戏使用的是TextMeshPro且资源包中包含多语言字体资源,此方法能完美解决缺字问题且不影响原有字体风格。如果不行,再使用全局覆盖OverrideFontTextMeshPro。
5.2 UI布局错乱与自动重设大小
翻译后的文本长度通常与原文不同,可能导致文本框装不下,文字被截断或重叠。
启用自动重设大小:在[Behaviour]中确保EnableUIResizing=True。XUA会尝试自动调整文本框的HorizontalOverflow和VerticalOverflow属性,并可能微调字体大小和行间距(通过ResizeUILineSpacingScale)。
手动精细控制:如果自动调整效果不佳,可以使用resizer.txt文件进行手动控制。首先,在配置中开启EnableTextPathLogging=True,然后游戏中操作需要调整的UI,查看日志输出中该UI的完整路径。接着,在Translation\zh-CN\Text\目录下创建resizer.txt,添加如下规则:
UI/Canvas/Panel/Text=ChangeFontSizeByPercentage(0.9);AutoResize(true, 12, 36)这条规则将匹配路径包含UI/Canvas/Panel/Text的所有文本组件,将其字体大小缩放至90%,并启用自动重设大小,限制最小字体12,最大字体36。
5.3 常见问题与排查技巧实录
即使配置正确,在实际使用中也可能遇到各种问题。下面是一个快速排查清单:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 游戏启动崩溃或黑屏 | 1. BepInEx或XUA版本与游戏不兼容。 2. 与其他Mod冲突。 | 1. 检查游戏社区,确认使用的BepInEx和XUA版本是否正确。 2. 暂时移除其他Mod,仅保留XUA测试。使用BepInEx的 Doorstop日志和LogOutput.log定位错误。 |
| 翻译完全不生效 | 1. 配置文件Language或Endpoint设置错误。2. 插件未正确加载。 | 1. 检查AutoTranslatorConfig.ini,确保Language和Endpoint有效。2. 查看游戏启动日志,确认 XUnity.AutoTranslator已加载。按ALT+0看是否有菜单弹出。 |
| 部分文本未被翻译 | 1. 文本来自IMGUI(其他Mod的界面)。 2. 文本被游戏特殊处理(如动态拼接)。 3. 文本长度超过 MaxCharactersPerTranslation(默认1000)。 | 1. 尝试在配置中设置EnableIMGUI=True(注意性能)。2. 使用拆分器正则表达式( sr:)处理。3. 适当调大 MaxCharactersPerTranslation,但注意不要超过400(出于对翻译服务的尊重)。 |
| 翻译后游戏逻辑出错 | 游戏通过检查显示的文本来决定分支逻辑(常见于一些ADV游戏)。 | 在[Behaviour]中设置TextGetterCompatibilityMode=True。这会让插件“欺骗”游戏,使其认为显示的仍是原文。 |
| 在线翻译失败(错误429等) | 使用的公共翻译接口达到请求限制或被屏蔽。 | 1. 更换Endpoint,如使用BaiduTranslate或YandexTranslate并配置API密钥。2. 增加 [Http]下的MaxConcurrentRequests(最大并发请求数)和RequestInterval(请求间隔)来降低请求频率。 |
| 内存占用过高或游戏变卡 | 1. 启用了纹理替换且CacheTexturesInMemory=True。2. 正则表达式过于复杂或低效。 3. 启用了 EnableTextureScanOnSceneLoad。 | 1. 关闭不必要的纹理替换,或设置CacheTexturesInMemory=False。2. 审查并优化翻译文件中的正则表达式。 3. 仅在需要导出纹理时开启此选项,完成后关闭。 |
| 自动生成的翻译文件混乱 | 插件输出了大量无意义或重复的文本。 | 检查配置中OutputUntranslatableText和CacheWhitespaceDifferences是否为False。确保MaxCharactersPerTranslation设置合理。定期清理_AutoGeneratedTranslations.txt中的垃圾条目。 |
日志是你的最佳朋友:遇到任何疑难杂症,第一件事是开启详细日志。在Config.ini中设置[Debug]部分的EnableConsole=True和EnableLog=True。然后重启游戏,操作复现问题,最后仔细查看控制台输出的日志信息,里面通常包含了插件每一步的操作和可能的错误原因。
掌握XUnity.AutoTranslator的过程,是一个从“自动翻译使用者”到“游戏本地化工程师”的转变。它提供的不仅是一个工具,更是一套方法论。从基础的配置使用,到手动翻译维护,再到利用正则表达式和资源重定向解决复杂问题,每一步都让你对游戏本地化的理解更深一层。这个工具的强大之处在于其社区生态,无数玩家和汉化者贡献的翻译文件、正则规则和字体资源,让许多小众游戏也能享受到高质量的本地化体验。希望这篇指南能成为你探索这个世界的坚实起点。