fishjar / kiss-translator

A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本)
https://github.com/fishjar/kiss-translator
GNU General Public License v3.0
2.89k stars 114 forks source link

github ipynb无法加载 #95

Closed Long0x0 closed 8 months ago

Long0x0 commented 8 months ago

扩展和页面的通信,影响了页面和iframe的通信。很多翻译扩展都会有这个问题。 https://github.com/crimx/ext-saladict/issues/2093 https://github.com/orgs/community/discussions/64876

测试页面

或许可以用runtime.connect替换sendMessage

fishjar commented 8 months ago

具体原因不清楚,把iframe页面加入禁用翻译黑名单即可简单解决:

https://notebooks.githubusercontent.com/view/ipynb*

Screenshot from 2024-02-22 11-42-01

Long0x0 commented 8 months ago

加入禁用确实正常了,但是就不能翻译了。 immersive translate没有这个问题,不过也不开源,不知道是怎么实现的。 目前写了一个油猴脚本强行patch:

// ==UserScript==
// @name         github .ipynb preview patch
// @version      0.0.1
// @description  fix github .ipynb preview bug
// @license      MIT
// @match        https://github.com/*.ipynb
// @run-at       document-start
// @grant        none
// ==/UserScript==

const __addEventListener = window.addEventListener;
window.addEventListener = function(type, listener, options) {
    if(type === "message" && listener.toString().includes(`("ERROR")`)) {
        const __listener = listener;
        listener = function(event) {
            if(event.data?.action === "trans_getrule") {
                console.log('ignore', event.data);
            } else {
                __listener(event);
            }
        }
    }
    __addEventListener(type, listener, options);
}
fishjar commented 8 months ago

1、这个很可能是github代码的问题,类似这个 issue: https://github.com/fishjar/kiss-translator/issues/50#issuecomment-1825126129

2、在iframe中发送消息给parent会触发问题,接受消息则没有问题,所以应该可以修复一下,ifame中只单向接受消息即可。

3、关于iframe页面,其实之前就有个纠结的问题,即iframe中的规则要不要和parent的规则共用。

之前的做法是选择共用,所以iframe需要从parent获取规则信息。通过修复这个bug,顺便改变一下这个规则,即iframe和parent规则分开定义,状态混淆的问题可以设置一致的初始状态即可避免。

fishjar commented 8 months ago

下个版本将修复,需要添加iframe页面的规则:

Screenshot from 2024-02-22 17-29-07

效果如下:

Screenshot from 2024-02-22 17-28-08

fishjar commented 8 months ago

1、这个很可能是github代码的问题,类似这个 issue: #50 (comment)

2、在iframe中发送消息给parent会触发问题,接受消息则没有问题,所以应该可以修复一下,ifame中只单向接受消息即可。

3、关于iframe页面,其实之前就有个纠结的问题,即iframe中的规则要不要和parent的规则共用。

  • 如果规则不共用,但快捷键等操作肯定要共用,则可能会造成是否翻译的状态混乱。
  • 如果共用的话也不太合理,ifame和parent页面元素结构完全不同,规则大相径庭。

之前的做法是选择共用,所以iframe需要从parent获取规则信息。通过修复这个bug,顺便改变一下这个规则,即iframe和parent规则分开定义,状态混淆的问题可以设置一致的初始状态即可避免。

规则分开定义还有个好处,即使单独打开irame页面的链接,也将按照规则定义翻译。 比如 打开页面

Long0x0 commented 8 months ago

嗯,还是分开定义更合理一些。 另外选择器能不能支持引用全局选择器呢,类似于#notebook-container :is(GLOBAL_SELECTOR),这样自定义规则就不用再写一遍。

fishjar commented 8 months ago

另外选择器能不能支持引用全局选择器呢,类似于#notebook-container :is(GLOBAL_SELECTOR),这样自定义规则就不用再写一遍。

需要时到全局规则或订阅规则复制一份即可,不算太麻烦。

而且如果这样的话,还需要一个能编辑 GLOBAL_SELECTOR 定义的地方,暂时还是不增加这个特性吧。