使用 ChatGPT 突破能力边界 之 前端小白实现沉浸式翻译的核心功能

查看 86|回复 6
作者:zapll   
作为一个后端开发, 一直比较好奇沉浸式翻译的效果是如何实现的, 所以咱也当了回甲方, 让 ChatGPT 帮我实现想要的效果
场景
为了锻炼英文阅读能力, 在英文文章阅读时还是期望能多读外文, 如果一把梭翻译一遍, 普遍是只读中文不看英文了, 那么也就起不到我们锻炼英文能力的要求了.
需求
如果我遇到了一些不认识或者不确定意思的单词,我希望得到一个贴合当前语境的翻译,这样既能理解文章,又能在语境中学习单词。
需求拆解
如果鼠标在某个单词上方悬浮超过 xx 毫秒, 那么则结合当前语境翻译这个单词及这个句子.
好的, 需求有了, 思路也有了, 具体咋做咱就不知道了, 现在轮到我最强的小弟 ChatGPT 大显身手了
效果图

具体功能点:
[ol]
  • 关键词的翻译, 译文紧跟在关键词后面
  • 当前语句的翻译
    [/ol]
    实现此效果的完整 ChatGPT 对话: 实现沉浸式翻译的核心功能
    插播广告:
    推荐一个 ChatGPT Plus 拼车服务, 客服wx, 无需科学上网/会话隔离
    最终完整代码
    import type { PlasmoCSConfig } from "plasmo"
    import { generate } from 'short-uuid'
    export const config: PlasmoCSConfig = {
        matches: [""],
        all_frames: true
    }
    const loading = `
    `
    const cssCode = `
    .ct-loading {
        width: 1em;
        display: inline-block;
    }
    .ct-span {
        display: inline-block;
        margin-right: 2px;
        margin-left: 2px;
    }
    `
    var xy = { x: 0, y: 0 }
    document.head.insertAdjacentHTML('beforeend', '' + cssCode + '');
    // 存储已经翻译过的单词,以避免重复翻译
    var translatedWords = new Set(); // 用于存储已翻译的单词及其父元素
    var pool = {}
    document.addEventListener('mousemove', function (event) {
        // 获取鼠标位置
        var x = event.clientX, y = event.clientY;
        xy = { x, y }
        // 获取鼠标位置下的文本范围
        var range, textNode, offset;
        range = document.caretRangeFromPoint(x, y);
        textNode = range.startContainer;
        if (!textNode) {
            return
        }
        if (textNode.parentElement.hasAttribute('data-ct-translation')) { // 翻译结果节点
            return;
        }
        if (hasPreOrCodeParent(textNode)) {
            return
        }
        offset = range.startOffset;
        var text = textNode.textContent;
        var words = text.split(/\s+/);
        for (var i = 0; i = rect.left && x = rect.top && y  {
        for (const wordId in pool) {
            const wordElement = document.getElementById(wordId);
            if (!wordElement) {
                continue;
            }
            const rect = wordElement.getAttribute('data-ct-rect').split(',').map(Number);
            const word = wordElement.getAttribute('data-ct-word');
            const pid = wordElement.getAttribute('data-pid');
            if (!isMouseOnTranslation({ left: rect[0], right: rect[1], top: rect[2], bottom: rect[3] }, xy.x, xy.y)) {
                translatedWords.delete(word + '-' + pid)
                wordElement.remove()
                delete pool[wordId]
                continue
            }
            wordElement.classList.add('ct-loading')
            wordElement.innerHTML = loading
            fetch('http://localhost:8787/translate', {
                method: "POST",
                headers: {
                    "Content-Type": "application/json"
                },
                body: JSON.stringify({
                    word: word,
                    sentence: wordElement.getAttribute('data-ct-parent')
                })
            }).then(res => res.json()).then(res => {
                console.log(res)
                wordElement.classList.remove('ct-loading')
                wordElement.classList.add('ct-span')
                wordElement.innerHTML = `(${res.word_result})`
                const p = document.querySelector(`[data-ct-id="${pid}"]`)
                const cp = p.cloneNode(true)
                cp.textContent = res.sentence_result
                p.after(cp)
            }).catch(e => console.log)
            wordElement.setAttribute('data-ct-translation', '1');
            delete pool[wordId]
        }
    }, 1500)
    // 判断鼠标是否在翻译内容上
    function isMouseOnTranslation(rect, mouseX, mouseY) {
        return rect && mouseX >= rect.left && mouseX = rect.top && mouseY

    var, Rect, word, const

  • w2er   
    很棒,谢谢分享,在用一个类似的插件
    vipfts   
    我倒希望有那种点一下单词然后详细翻译单词的沉浸式翻译
    0o0O0o0O0o   
    虽然是推广,但是比没有内容的推广好很多,建议多来点
    zapll
    OP
      
    @vipfts #2 这个触发方式跟悬浮类似, 应该也不难, 可以扔个 ChatGPT 让他改改, 😄
    zapll
    OP
      
    @0o0O0o0O0o 😄感谢认可, 后续多分享一些我日常使用 ChatGPT 的体验, 在创造性工作上, 帮助我们突破一下现在的能力边界还是蛮有用的
    Sniper000   
    现在 mac 上用的比较香的有三个,1 ,bob 翻译 option+s 直接截图翻译类似

    2.

    这个也相当好用

    选中文字后,cmd+cc 多点击一下 C ,就呼出来了。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部