ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LunaTranslator 内嵌翻译(Embedded Translation)完全指南:工作原理、使用流程与乱码排查实战

LunaTranslator 内嵌翻译(Embedded Translation)完全指南:工作原理、使用流程与乱码排查实战 LunaTranslator 内嵌翻译Embedded Translation完全指南工作原理、使用流程与乱码排查实战【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator内嵌翻译是 LunaTranslator 中一种特殊的文本输出方式它不是把译文显示在翻译器自己的窗口里而是直接修改游戏进程内存中的文本让译文“内嵌”到游戏画面原本显示原文的位置实现接近原生汉化的效果。本篇指南以仓库内 内嵌翻译文档英文版见 docs/en/embedtranslate.md为主线结合 texthook.py 与 textinput.py 的源码实现系统讲解内嵌翻译的支持性判断、启用方法、全部设置项参数以及最常见的乱码问题的排查与修复思路。读完本文你将能独立完成从“选择内嵌文本条目”到“调整字体与编码解决乱码”的完整实战流程。内嵌翻译是什么从源码看它的工作原理在深入操作之前先理解内嵌翻译的底层机制有助于你判断它为什么会出现卡顿、乱码等现象。根据 texthook.py 中getembedtext的实现内嵌翻译的完整流程可以概括为游戏暂停LunaHost 注入游戏后会在游戏准备显示文本的某个函数处停住游戏线程把即将显示的原文通过EmbedCallback回调源码中注册为self.getembedtext发送给翻译器主程序等待翻译主程序调用waitfortranslation(text)把文本交给翻译引擎并阻塞等待翻译完成返回结果校验源码中的__safechecktransresult会检查原文与译文中的方括号[...]、花括号{...}标记是否一一对应若不一致则丢弃翻译结果避免把游戏自身的控制符破坏掉写入内存翻译完成后调用Luna_EmbedCallback(tp, text, trans)把译文写回游戏进程内存中该文本对应的位置随后放行游戏继续运行游戏画面便直接显示出译文。因为游戏在这整个过程中是“停住等你翻译”的所以文档中强调了一个关键结论当使用的翻译速度较慢时一定会导致游戏卡顿。这也是“翻译等待时间”这一设置存在的根本原因详见下文设置详解。此外从 selecthook.py 可以看到是否对某个文本条目启用内嵌是通过Luna_UseEmbed(tp, use)这个 DLL 接口动态切换的而不是固定配置——这也解释了为什么你可以在运行中随时打开/关闭某个条目的内嵌开关。支持性判断与启用方法不是所有游戏都支持内嵌文档开篇就给出了两个明确警告不是所有游戏都支持内嵌。内嵌翻译依赖对游戏特定显示函数的 HOOK 和内存修改只有被 LunaHook 识别为“可内嵌”的文本线程才具备该能力内嵌有一定概率导致游戏崩溃。修改游戏内存本身带有风险使用时应有心理预期必要时先存档。判断方法很直观在选中文本时如果条目右键菜单或对应面板中没有“内嵌”这一行选项就说明该游戏不支持内嵌。这与源码中的embedablehook机制对应——只有被标记为可内嵌的 HOOK 线程才会在界面中渲染出内嵌开关参见 selecthook.py 中对embedablenum与内嵌开关的动态增减逻辑。显示与内嵌两种开关的自由组合对于支持内嵌的文本条目“显示”和“内嵌”是两个相互独立的开关可以随意组合组合方式效果同时开启“显示”“内嵌”游戏画面内内嵌译文同时翻译器软件窗口也正常显示翻译内容原文/译文列表等信息量最大只开启“内嵌”仅在游戏内显示译文软件窗口不显示任何内容画面最干净这种设计让你可以根据个人习惯选择想要对照学习可以两者都开追求沉浸式体验可以只开内嵌。启用步骤启动游戏并让 LunaTranslator 完成 HOOK参见 HOOK 设置文档选中支持内嵌的文本条目确认其菜单中存在“内嵌”选项激活“内嵌”开关必要时同时激活“显示”观察游戏画面内是否出现译文按需进入下方“内嵌翻译设置”调整细节。乱码问题排查字符集问题还是字体问题开始内嵌翻译后最常遇到的现象就是乱码。根据文档游戏乱码一般只来自两种原因字符集编码问题和字体问题。排查思路可以按游戏类型快速分类。字体问题英文游戏的主流原因对于英文游戏乱码通常是因为游戏缺少中文字体。游戏字体表里没有中文字形自然无法渲染译文中的汉字。此时需要激活“修改游戏字体”设置项选择一个包含中文字形的合适字体如常见的宋体、黑体类字体字体修改完成后中文即可正常显示。需要说明的是即使游戏本身使用 UTF-8 等 Unicode 编码只要缺字体依然会乱码——字体缺失与编码是否正确是两个独立维度。字符集问题古早日系 Galgame 的特殊情况对于许多古早日本 Galgame它们使用自己内置的Shift-JIS 字符集处理文本无法正确处理中文字符此时可以尝试开启“将汉字转换成繁体/日式汉字”来减少乱码出现——繁体/日式汉字与 Shift-JIS 字符集的兼容性通常更好能显著降低乱码比例。现代引擎优先怀疑字体对于较新的游戏引擎和大部分英文游戏一般使用 UTF-8 或 UTF-16 等 Unicode 字符集常见的如KiriKiri吉里吉里RenpyTyranoScriptRPGMakerMV这类游戏即使出现乱码一般也是字体问题而不是字符集问题优先按“修改游戏字体”的思路处理。简体中文显示异常的补充手段“将汉字转换成繁体/日式汉字”这个开关默认是关闭的关闭状态下可以正常显示简体中文。但对于部分无法正常显示简体中文的游戏可以尝试激活该选项看能否恢复为正常显示——也就是说这个开关既可能用来解决 Shift-JIS 乱码也可以作为简体中文显示异常的备选方案。内嵌翻译设置详解逐项参数与源码对照内嵌翻译的设置项在界面中集中呈现其界面定义位于 gethookgrid_em。这些设置既可以在全局配置中修改也可以针对单个游戏/条目单独覆盖配置存储机制见下文“配置存储结构”一节。下面逐项说明并附上源码中的参数范围与默认值。1. 显示模式由于游戏能显示的文本行数有限默认情况下翻译与原文之间不会插入换行即默认只显示译文本身。如果确认游戏文本区域有足够空间容纳多行可以通过“翻译优化→翻译结果修正”添加一条正则表达式在翻译前面插入一个换行来实现分行显示。该设置对应源码中的displaymode参数可选值有三种取值含义0仅翻译1原文_翻译原文在上译文在下2翻译_原文译文在上原文在下默认值为0。关于“翻译结果修正”的完整用法如何添加正则、替换规则等可参考 翻译优化文档 及其实现 transerrorfix.py。2. 翻译等待时间这是内嵌翻译最重要的防卡顿参数。如“工作原理”一节所述内嵌翻译会让游戏暂停等待翻译结果因此翻译越慢游戏卡顿越久。通过限制等待时间上限可以避免翻译过慢导致长时间卡顿当等待超时后游戏会放弃本次内嵌并继续运行。源码参数名timeout_translate取值范围0~30秒支持小数默认值2秒底层实现该值在 set_settings_ex 中会被乘以1000转换为毫秒通过Luna_SettingsEx传入 LunaHost由宿主 DLL 控制超时逻辑。如果你的翻译引擎尤其是大模型类引擎响应较慢建议根据实际体验适当调大该值但要接受游戏卡顿时间随之变长的代价。3. 将汉字转换成繁体/日式汉字即文档与源码中反复提到的trans_kanji开关默认关闭。开启后译文会先通过zhconv.convert(trans, zh-tw)转换为繁体中文再经过kanjitrans进一步转换为日式汉字参见 getembedtext 与 kanjitrans.py。适用场景已在“乱码排查”一节详述主要用于 Shift-JIS 字符集的古早日系游戏也可作为简体中文显示异常的备选方案。注意该转换是在译文上进行的不影响原文显示。4. 限制每行字数有些游戏每行能显示的字符数是有限的超出长度的内容会显示到文本框右侧更外边而无法看到。该设置通过手动分行来避免这一情况。开关参数名limittextlength_use默认关闭长度参数名limittextlength_length取值范围0~1000默认40其分行算法实现在 splitembedlines 中先按原文语言的空格规则切分单词再按长度限制重新拼接换行对于无空格分隔的语言如中日文则按字符长度直接截断。该处理作用于译文文本在写回游戏内存前完成。5. 修改游戏字体对应changefont开关默认关闭与changefont_font字体选择。开启后LunaHost 在渲染内嵌文本时会强制替换游戏使用的字体从而让缺少中文字形的游戏正确显示汉字。选择字体时请挑选明确包含中文字形的字体。特别地对于Unity 引擎游戏源码中有专门的逻辑开启changefont后set_settings_ex 会调用find_unity_font_dir尝试自动定位 Unity 的字体资源目录并把该目录路径一并传给 LunaHost以更可靠地完成字体替换selecthook.py 中也有对应提示逻辑。6. 修改游戏字体相对大小当替换字体后字号可能偏大或偏小、与原文排版不协调可开启该设置微调。开关参数名changefontsize_use默认关闭缩放参数名changefontsize取值范围0.5~2步进0.01默认1.0即不缩放该值通过Luna_SettingsEx传入宿主由宿主在渲染时对字体大小做相对缩放。7. 清除游戏内显示的文字该开关对应源码中的clearText参数默认关闭。激活后游戏内将要显示内嵌文本位置处的原文内容会被清空。文档给出了该选项可能满足的三类需求伪装内嵌效果当内嵌翻译遇到无法解决的字符编码和字体显示问题时开启该选项然后把软件窗口覆盖到原本游戏中显示文字的位置即可看起来像是内嵌翻译的效果此时译文实际由软件窗口渲染外挂翻译的更优布局当使用外挂翻译窗口显示译文时若把窗口放在文字区会和原文本重叠、放在其他地方会遮挡画面此时清空游戏原文后把窗口放在文字区即可避免重叠日语学习场景只想用游戏来学习日语但游戏文本没有加注音或双语对照功能时可以清空原文再用软件窗口显示带注音或双语对照的内容。本质上该选项让你在“内嵌”与“外挂”两种形态之间获得更灵活的混合使用方式。配置存储结构全局默认与单条目私有配置从源码 embedconfig 的实现可以看出内嵌设置遵循“全局默认 条目私有覆盖”的两级结构这与普通 HOOK 设置的hooksetting_follow_default机制一致全局默认配置存放在globalconfig[embedded]中即 defaultconfig/config.json 里的embedded: {}字段默认全为空即全部使用界面上的内置默认值条目私有配置存放在 config.py 中定义的embed_setting_private: {}字段开关embed_follow_default默认True控制当前条目是否跟随全局默认关闭后启用私有配置且私有配置中未显式设置的键会自动回落到全局值源码中通过自定义 dict 的__getitem__实现每个游戏记录中还维护embedablehook列表用于标记该游戏下哪些 HOOK 线程支持内嵌。这套设计意味着你既可以在全局设置里统一调优内嵌参数也可以针对某个特定的卡顿/乱码条目单独覆盖设置互不干扰。实战建议与注意事项综合文档与源码给出几条实操建议先存档再开启内嵌内嵌翻译有一定概率导致游戏崩溃重要进度前先存档乱码先分类再动手英文/现代引擎游戏优先查字体开启“修改游戏字体”古早日系 Shift-JIS 游戏优先尝试“转换繁体/日式汉字”慢翻译引擎务必设置等待时间上限如果你用的是响应较慢的在线翻译或大模型翻译timeout_translate是防止游戏长时间卡死的保命设置建议从默认的 2 秒开始按体验调整多行显示依赖正则默认译文与原文之间无换行需要双语对照时请在“翻译结果修正”中添加插入换行的正则并确认游戏文本区域有足够空间善用“清除游戏内显示的文字”遇到内嵌无法解决的编码/字体问题时不要死磕切换为“清除原文 软件窗口覆盖”的混合方案往往更省事单条目覆盖配置某个特定条目的内嵌效果不理想时优先尝试为其关闭embed_follow_default并单独设置避免影响全局体验。延伸阅读内嵌翻译官方文档中文 / 英文 / 日文 / 韩文HOOK 与文本线程选择理解哪些线程可被 HOOK、如何选中目标文本翻译优化与翻译结果修正添加正则实现译文换行、结果修正的完整方法文本处理相关配置文本过滤、预处理等与内嵌翻译联动的配置核心源码texthook.py内嵌流程与设置下发、textinput.py设置界面定义、selecthook.py内嵌开关交互【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表