Isayama-Kagura / TsubakiTranslator

一款Galgame文本翻译工具,支持Textractor/剪切板/OCR翻译
GNU General Public License v3.0
264 stars 21 forks source link

换行文本无法完全读取问题 #37

Open cztBlue opened 1 year ago

cztBlue commented 1 year ago

在阅读《IxSHE Tell》的的时候发现了一个bug实例。此游戏经过一次国外的英化,英化组用
标签表示文本换行。(2020版的hook会将\<br>不处理的展示出来) Clip_20230223_185917

作者所用的当前的最新版本的Textractor会将该\<br>标签自动处理成换行文本,采用的BeginOutputReadLine() 方法一次event只能读取导致一行控制台文本导致了这一bug。 Clip_20230223_183149
Clip_20230223_183041

该bug导致游戏中大段文本的丢失:每次HookDisplay()只能展示游戏中第一行的文本,而完整的hook文本分多次event放出,第一行\<b\r>后的文本被丢弃(注:"pretty grloomy girl"不会被翻译器展示)
Clip_20230223_185523 Clip_20230223_185513 Clip_20230223_185613 Clip_20230223_185811 以上就是一个bug实例,作者能给出一个比较好的解决方案吗?。

cztBlue commented 1 year ago

Misaka采用的是一个根据Textractor2020年(不知道是哪一个版本)特制的一个HOOK(该HOOK已经很久没更新了......) Clip_20230223_194118
我恰好发现其能够获取不被处理的完整源文本(但是Misaka开始翻译后会有HOOK丢失这种更大的bug,所以我没有用那个翻译器)。
我试着将旧版HOOK替换新版后重新编译,结果由于特制版的HOOK参数似乎与原版差异较大,在TsubakiTranslator不能正常工作,尝试将TsubakiTranslator的HOOK调用文件重构与旧版HOOK适配,但囿于个人水平,目前没有成功。

cztBlue commented 1 year ago

2fcd4d082e21e4393272c897906c51bc#5038181583#IxSHE Tell.7z
这里提供实例中使用的游戏资源。

cztBlue commented 1 year ago

我利用文本特性添加了一个正则,以此更改了一些On_TextHook_OutputDataReceived()中的调用逻辑来解决这个问题: 现在这个(特定的)游戏可以正常显示原文了,但是这个方法太过愚.蠢以至于问题没有真正被解决。 Clip_20230223_210558

Isayama-Kagura commented 1 year ago

最好的解决方法还是到textractor提issue,让原项目的作者对这类引擎的提取做优化,因为这个问题肯定也不止在我这存在

其实也可以匹配前面的[*],但这种解决方法不优雅,回调函数本来的目的就是每次处理一个hook结果,每次调用都是独立无关联的,对于绝大部分游戏都能符合这个规则,为了其中一个引擎去改这里的核心逻辑我感觉不太合适

在此@DDWSdwqdq 大佬,我对逆向和c++都不懂,就先闪了

luojunyuan commented 1 year ago

感谢探讨

其实翻译器开发者自己直接控制textractor是最好的。lgztx老哥弄有一个texthost可以直接将几个文本提取器cli的几个函数提出来作为dll供其他语言使用。

这比cli通过管道更高效,而且可控性更大,还可以卸载不需要的钩子。直接用texthost也是原生的文本没有处理br和其他换行符之类的。

jacklishufan commented 1 year ago

textractor 的CLI 好像维护不是很积极,而且也不支持GUI的extension. Ad-Hoc 的解决方法是手动打开textractor-> 用extension 替换<br>-> 监视剪贴板. 最好解决方法是直接魔改CLI.

当前框架下的解决方案只能是把管道输出当成file-stream 并且维护一个当前钩子的state. 因为适用范围有限做成一个可选的tickbox比较符合逻辑,这样也不会影响原有的功能. image

https://github.com/jacklishufan/TsubakiTranslator/commit/30d10276c4dd9b1f24fca0d40f2ade729127f0b8