自定义一个Chrome翻译插件

article/2025/9/23 5:40:56

做为一名程序员,难免要和各种英文文档打交道。然而大部分程序员的英文水平,只能用一个字来形容,那就是烂。我深知自己英语水平低下,需要一款翻译插件来治疗一下。网上的翻译插件有很多,但是这里是自己来定制一款属于自己的chrome翻译插件。

1.了解chrome插件开发

不了解的同学可以先看看下面的资料

Chrome插件官方文档主页

【干货】Chrome插件(扩展)开发全攻略

2.插件的结构

当你了解了chrome基本开发了,下面就这就直接撸代码了。插件的目录结构
在这里插入图片描述

2.1 manifest.json

这是一个Chrome插件最重要也是必不可少的文件,用来配置所有和插件相关的配置,必须放在根目录。其中,manifest_versionnameversion3个是必不可少的,descriptionicons是推荐的。

{"name": "自定义翻译插件","version": "1.0","description": "百度翻译插件简化版",//图标信息"icons": {"16": "imgs/icon16.png","32": "imgs/icon32.png","48": "imgs/icon48.png","128": "imgs/icon128.png"},"manifest_version": 2,//拥有的权限"permissions": [ "*://*/*", "activeTab", "tabs", "contextMenus", "webRequest", "webRequestBlocking", "storage" ],//浏览器右上角插件设置,browser_action、page_action、app必须三选一"browser_action": {"default_icon": "imgs/icon32.png","default_popup": "popup.html"},//会一直常驻的后台JS或后台页面"background": {"page": "background.html"},// 需要注入到目标页面的JS"content_scripts": [{"js": ["js/lib/jquery-1.11.3.min.js",//context.js需要用到jq所以这里也把jq注入到目标页面中"js/context.js"],//注入的页面"matches": ["https://*/*","http://*/*"],"run_at": "document_end"}],//普通页面能够直接访问的插件资源列表,如果不设置是无法直接访问的"web_accessible_resources": [ "imgs/*.png", "imgs/*.gif" ]
}

2.2 background.html

对应manifest.json background配置,是一个常驻的页面,它的生命周期是插件中所有类型页面中最长的,它随着浏览器的打开而打开,随着浏览器的关闭而关闭,所以通常把需要一直运行的、启动就运行的、全局的代码放在background里面。

<html><head></head><body>
<script src="js/lib/jquery-1.11.3.min.js"></script>
<script src="js/lib/md5.js"></script>
<script src="js/background.js"></script>
</body></html>

有于background.js需要用到jquery和md5所以把它们引入进来。background.js 代码如下

这个代码就是注册了一个chrome插件的一个onRequest监听器,当插件的background监听到请求时就会调用下面的代码,这里会发起一个ajax请求(请求的是百度翻译的api,可以去百度的翻译插件中找到_),获取到返回数据后,将data数据回调出去

chrome.extension.onRequest.addListener(function (request, sender, sendResponse) {console.log('request', request);console.log('sender', sender);if (request.action == 'trans') { //请求的action为trans时....$.ajax({url: 'http://api.fanyi.baidu.com/api/trans/vip/translate',method: 'GET',data: {...},asyne: true}).done(function (data) {//调用请求着的回调方法,将数据返回回去sendResponse({data: data});});}else {//todo}
});

2.3 popup.html

这页面就是我们在manifest.json配置的browser_action页面,点击browser_action或者page_action图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。

在这里插入图片描述

这个插件的这个页面很简单,一个按钮,点击后翻译。

<!DOCTYPE html>
...
<body style="width: 400px;"><h4>输入需要翻译的</h4><table><tr style="width: 300px;"><td> <textarea rows="7" id="query" class="form-control" placeholder="请输入需要翻译的" required></textarea></td><td><input id="btnTrans" type="button" value="翻译" /></td><td><td> <textarea rows="7" id="result" class="form-control" placeholder="" required></textarea></td></td></tr></table><script type="text/javascript" charset="utf-8" src="./js/popup.js"></script>

对应的事件逻辑在popup.js中,主要就是如下逻辑

//1.获取btnTrans按钮
var btnBuildTest = document.getElementById("btnTrans");
//2.绑定点击事件,发送请求
btnBuildTest.onclick = function () {var word = document.getElementById("query").valueif(word){//3.先插件后台 background 发起其一个请求,background接收到请求后会返回数据chrome.extension.sendRequest({action: "trans",word: word},function(f) {if(f.data&&f.data.trans_result){//4.将翻译结果显示在result中document.getElementById("result").value = f.data.trans_result[0].dst}});}
}

2.4 context.js

这个就是要注入到我们需要应用到页面上的js脚本,对应mainset.js 中的 content_scripts

所谓content-scripts,其实就是Chrome插件中向页面注入脚本的一种形式(虽然名为script,其实还可以包括css的),借助content-scripts我们可以实现通过配置的方式轻松向指定页面注入JS和CSS(如果需要动态注入,可以参考下文),最常见的比如:广告屏蔽、页面CSS定制,等等。

这个脚本在我们需要注入的目标页面打开时,会自动注入
在这里插入图片描述
context.js 它实现了划词翻译的功能,这里我就直接把百度翻译的轮子直接拿来用了,做了一些简化,加了一个朗读的功能,方便英语学习。

主要有如下功能

1.注册鼠标弹起事件,获取划词内容

2.动态创建翻译按钮,注册点击事件

3.点击发球翻译请求,动态创建翻译结果页面

在这里插入图片描述

具体效果如下
在这里插入图片描述
在这里插入图片描述

3.插件运行流程图

在这里插入图片描述

源码地址

码云

GitHub


http://chatgpt.dhexx.cn/article/pAy7m80V.shtml

相关文章

推荐!chrome翻译插件

极力推荐chrome翻译插件。沉浸式翻译。 chrome在线商店地址离线安装包地址 实用截图&#xff1a;

【实用工具】Chrome浏览器英文翻译插件推荐:Google翻译

最近浏览器崩溃不得不卸载重新安装&#xff0c;忘记备份插件数据&#xff0c;导致之前使用顺手的一款插件找不到了&#xff0c;今天又去寻了半天终于找到一款还算顺手的插件&#xff0c;只介绍一款&#xff0c;不介绍太多&#xff0c;重点是免费&#xff01;免费&#xff01;免…

Chrome网页翻译插件,实测超好用,万物皆可译

Chrome浏览器 话不多说&#xff0c;给大家推荐一个比较靠谱的网页翻译插件&#xff1a; 可可翻译 Windows 和 mac均可使用 &#xff0c;实测超好用&#xff01; 各位如果可以墙&#xff0c;还是建议使用Chrome 应用商店直接下载哈 安装 1. 下载插件 下载地址&#xff1a;…

chrome 浏览器在线翻译插件

介绍几款Chrome浏览器的在线鼠标取词和句子翻译的插件 一、bubble-translate &#xff08;支持单词、句子翻译&#xff09; 下载地址&#xff1a;http://code.google.com/p/bubble-translate/downloads/list 安装教程&#xff1a;http://www.freehao123.com/bubble-translat…

超级好用的谷歌浏览器页面翻译插件(Mac和Win系统通用)

下面是谷歌浏览器软件链接&#xff0c;也可以去谷歌应用商店去下载&#xff0c;按照下面的步骤进行操作即可~ 百度网盘链接&#xff1a;复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 链接&#xff1a;https://pan.baidu.com/s/1Mx0aZ-DwJveXXLMkT8eNWw 提取码…

【数据结构】之线性表(顺序存储结构)

博主声明&#xff1a; 转载请在开头附加本文链接及作者信息&#xff0c;并标记为转载。本文由博主 威威喵 原创&#xff0c;请多支持与指教。 本文首发于此 博主&#xff1a;威威喵 | 博客主页&#xff1a;https://blog.csdn.net/smile_running 线性表是《数据结构》课程最…

线性表顺序存储结构的基本实现

在上一篇博客中我们只是简单得了解了线性表的一些基本的概念。那么这一篇博客我们就来说说线性表的两种物理结构中的第一种—顺序存储结构。 一、顺序存储定义 线性表的顺序存储结构指的是用一段地址连续的存储单元依次线性表的数据元素。顺序存储的示意图如下&#xff1a; 二…

线性表之顺序存储结构与链式存储结构 及 应用

前言 我们常用的线性表是顺序存储结构和链式存储结构表示&#xff0c;是最基本、最简单、也是最常用的一种数据结构&#xff1b;一个线性表是由n个相同特性的数据的有限序列&#xff1b;比如java中的数组 &#xff0c;链表&#xff1b;所以学习这两种结构表示是非常必要的。 …

线性表的顺序存储结构及实现

线性表的顺序存储结构定义 一、线性表的介绍 线性表是最基本、最简单、也是最常用的一种数据结构。 线性表中数据元素之间的关系是一对一的关系&#xff0c;即除了第一个和最后一个数据元素之外&#xff0c;其它数据元素都是首尾相接的(注意&#xff0c;这句话只适用大部分线…

线性表顺序存储结构图书管理

线性表顺序存储结构图书管理 一开始看书里面的线性表的顺序存储结构&#xff0c;感觉简单&#xff0c;觉得动态链表才能做出一点东西&#xff0c;但是顺序存储不仅于此&#xff0c;也能做出来。顺序结构相比链式结构&#xff0c;内容上有较大差异&#xff0c;各有难点 文章目录…

C++实现线性表的顺序存储结构

C实现线性表的顺序存储结构 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表的特点 除第一个元素外&#xff0c;其他每一个元素有且仅有…

顺序表(详解)- C++(线性表顺序存储结构)

问题引入 在数据结构中&#xff0c;线性表是一种很重要的线性结构。线性表分为多种类型&#xff0c;常见的如顺序表、链表等&#xff0c;如果此时此刻你对“顺序表&#xff08;顺序存储&#xff09;”感到困惑&#xff0c;那就继续看下去&#xff0c;我们一步一步去剖析。 如果…

顺序存储结构的线性表

1.0. 什么是线性表&#xff1f; 所谓线性&#xff0c;即一条线&#xff0c;这条线可以是直线&#xff0c;也可以是曲线。 所谓表&#xff0c;肯定都不陌生&#xff0c;生活中有各种各样的表或者表格。我们在表格中填写各种各样的信息&#xff0c;通过表格&#xff0c;能够很好…

数据结构线性表顺序存储结构和主要算法实现

(1) 线性表的定义。 零个或多个数据元素的有限序列 序列线性表中有直接后继元素&#xff0c;有且仅有一个直接后继&#xff0c;有且仅有一个直接前驱&#xff0c;数据元素之间的关系是一对一的关系 常用的List操作&#xff1a; Operation InitList&#xff08;*L&#xf…

线性表顺序存储结构

1.什么是线性表? 线性表可以看作一条链子除了第一个元素和最后一个元素&#xff0c;其他每个元素都有一个前驱 元素和一个后继元素有且只有一个。 若一个元素都没有&#xff0c;则称为空表。 元素之间的关系是一一对应的关系。(就比如a2的前驱元素只有一个并且一定是a1&#…

线性表的顺序存储结构

线性表的基本概念 线性结构习惯称为线性表&#xff0c;线性表是n(n>0)个数据元素构成的有限序列&#xff0c;表中除第一个元素外的每一个元素&#xff0c;有且只有一个一个前件&#xff1b;除最后一个元素外&#xff0c;有且只有一个后件。 非空数据表具有&#xff1a; 只…

【数据结构】线性表的顺序存储结构及实现——C语言版

文章目录 顺序表1. 顺序表的存储结构定义2. 顺序表的实现2.1 初始化顺序表2.2 建立顺序表2.3 销毁顺序表2.4 判空操作2.5 求顺序表的长度2.6 遍历操作2.7 按值查找2.8 按位查找2.9 插入操作2.10 删除操作 3. 顺序表的使用4. 暖暖树洞 顺序表 线性表的顺序存储结构称为顺序表&a…

VUE activated,deactivated使用

项目中keepalive用得不多&#xff0c;记录一下以免遗忘。 页面第一次进入&#xff0c;钩子的触发顺序created-> mounted-> activated&#xff0c;退出时触发deactivated。当再次进入&#xff08;前进或者后退&#xff09;时&#xff0c;只触发activated。 事件挂载的方…

vue activated,deactivated生命周期的使用

1.当组件在 内被切换&#xff0c;它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。 2.activated()&#xff1a;在vue对象存活的情况下&#xff0c;进入当前存在activated()函数的页面时&#xff0c;一进入页面就触发&#xff1b;可用于初始化页面数据等…

vue 中 keep-alive,activated,deactivated

keep-alive 在组件反复切换时&#xff0c;会反复渲染&#xff0c;造成性能问题。用一个 <keep-alive></keep-alive> 标签将他包裹起来&#xff0c;组件会在第一次被创建的时候缓存下来。避免性能问题。 首先准备好组件&#xff0c;配置好路由。准备了Home,Keep,Abo…