手把手从0教你开发一个vscode变量翻译插件

本篇文章带大家从0开发一个vscode变量翻译插件,本文会从四个方面来完整的展示整个插件从功能设计到发布的完整历程,希望对大家有所帮助!

手把手从0教你开发一个vscode变量翻译插件

需求的起因是英语渣在开发的过程中经常遇到一个变量知道中文叫啥,但是英文单词可能就忘了,或者不知道,这个时候,我之前做法是打开浏览器,打开谷歌翻译,输入中文,复制英文,然后切回vscode,粘贴结果。

实在是太麻烦了,年轻的时候还好,记性好,英文单词大部分都能记住,但随着年纪越来越大,头发越来越少,记性也是越来越差,上面的步骤重复的次数也越来越多,所以痛定思痛,就开发了这款插件。

因为自己也是这几天从零开始学习的插件开发,所以本文完全的记录了一个小白开发的插件开发之路,内容主要是实战类的介绍,主要从四个方面介绍来完整的展示整个插件从功能设计到发布的完整历程。

功能设计

环境搭建

插件功能开发

插件打包发布

1-1.gif

【推荐学习:《vscode入门教程》】

功能设计

功能主要是两个功能,中译英,其他语言翻译成中文

将中文变量替换为翻译后的英文变量,多个单词需要自动驼峰,解决的场景就是日常开发经常碰到的“英语卡壳”

划词翻译,自动将各种语言翻译成中文,这解决的场景是有时候看国外项目源代码的注释碰到不会的单词不知道啥意思影响效率

环境搭建

上手的第一步,环境搭建

安装脚手架, yogenerator-code,这两个工具可以帮助我们快速构建项目,详情可见(https://github.com/Microsoft/vscode-generator-code)

//安装yarn global add yo generator-code

安装vsce,vsce可用来将开发的代码打包成.vsix后缀的文件,方便上传至微软插件商店或者本地安装

yarn global add vsce

生成并初始化项目,初始化信息根据自己情况填写

//初始化生成项目yo code

到这一步后,选择直接打开,Open with code

2.png

打开后会自动建立一个工作区,并生成这些文件,可根据自己需要对文件进行删减,完成这步后,我们可以直接进行开发与调试了

3.png

如何进行调试?

运行与调试面板点击Run Extention,或者快捷键F5,mac可以直接点击触控栏的调试按钮

4.png

打开后会弹出一个新的vscode窗口,这个新的窗口就是你的测试环境(扩展开发宿主),你做的插件功能就是在这个新的窗口测试,打印的消息在前一个窗口的调试控制台中,比如自带的例子,在我们新窗口 cmd/ctrl+shift+p后输入Hello world后会在前一个窗口的控制台打印一些信息

5.png

到这里,开发准备环境就准备好了,下一步就是开始正式的插件功能开发

插件功能开发

插件开发中,有两个重要的文件,一个是 package.json,一个是 extention.js

重要文件说明

package.json

6.png

activationEvents用来注册激活事件,用来表明什么情况下会激活extention.js中的active函数。常见的有onLanguage,onCommand…更多信息可查看vscode文档activationEvents(https://code.visualstudio.com/api/references/activation-events)

main表示插件的主入口

contributes用来注册命令(commands),绑定快捷键(keybindings),**配置设置项(configuration)**等等,更多可配置项可看文档(https://code.visualstudio.com/api/references/contribution-points)

extention.js

extention.js主要作用是作为插件功能的实现点,通过active,deactive函数,以及vscode提供的api以及一些事件钩子来完成插件功能的开发

实现翻译功能

翻译这里主要是使用了两个服务,谷歌和百度翻译。

谷歌翻译参考了别人的做法,使用google-translate-token获取到token,然后构造请求url,再处理返回的body,拿到返回结果。这里还有一个没搞懂的地方就是请求url的生成很迷,不知道这一块是啥意思。

const qs = require('querystring');const got = require('got');const safeEval = require('safe-eval');const googleToken = require('google-translate-token');const languages = require('../utils/languages.js');const config = require('../config/index.js');// 获取请求urlasync function getRequestUrl(text, opts) {    let token = await googleToken.get(text);    const data = {        client: 'gtx',        sl: opts.from,        tl: opts.to,        hl: opts.to,        dt: ['at', 'bd', 'ex', 'ld', 'md', 'qca', 'rw', 'rm', 'ss', 't'],        ie: 'UTF-8',        oe: 'UTF-8',        otf: 1,        ssel: 0,        tsel: 0,        kc: 7,        q: text    };    data[token.name] = token.value;    const requestUrl = `${config.googleBaseUrl}${qs.stringify(data)}`;    return requestUrl;}//处理返回的bodyasync function handleBody(url, opts) {    const result = await got(url);    let resultObj = {        text: '',        from: {            language: {                didYouMean: false,                iso: ''            },            text: {                autoCorrected: false,                value: '',                didYouMean: false            }        },        raw: ''    };    if (opts.raw) {        resultObj.raw = result.body;    }    const body = safeEval(result.body);    // console.log('body', body);    body[0].forEach(function(obj) {        if (obj[0]) {            resultObj.text += obj[0];        }    });    if (body[2] === body[8][0][0]) {        resultObj.from.language.iso = body[2];    } else {        resultObj.from.language.didYouMean = true;        resultObj.from.language.iso = body[8][0][0];    }    if (body[7] && body[7][0]) {        let str = body[7][0];        str = str.replace(//g, '[');        str = str.replace(//g, ']');        resultObj.from.text.value = str;        if (body[7][5] === true) {            resultObj.from.text.autoCorrected = true;        } else {            resultObj.from.text.didYouMean = true;        }    }    return resultObj;}//翻译async function translate(text, opts) {    opts = opts || {};    opts.from = opts.from || 'auto';    opts.to = opts.to || 'en';    opts.from = languages.getCode(opts.from);    opts.to = languages.getCode(opts.to);    try {        const requestUrl = await getRequestUrl(text, opts);        const result = await handleBody(requestUrl, opts);        return result;    } catch (error) {        console.log(error);    }}// 获取翻译结果const getGoogleTransResult = async(originText, ops = {}) => {    const { from, to } = ops;    try {        const result = await translate(originText, { from: from || config.defaultFrom, to: to || defaultTo });        console.log('谷歌翻译结果', result.text);        return result;    } catch (error) {        console.log(error);        console.log('翻译失败');    }}module.exports = getGoogleTransResult;

百度翻译,百度翻译的比较简单,申请服务,获得appid和key,然后构造请求url直接请求就行

不知道如何申请的,可查看我之前的一篇文章 Electron+Vue从零开始打造一个本地文件翻译器 进行申请https://juejin.cn/post/6899581622471884813

const md5 = require("md5");const axios = require("axios");const config = require('../config/index.js');axios.defaults.withCredentials = true;axios.defaults.crossDomain = true;axios.defaults.headers.post["Content-Type"] =    "application/x-www-form-urlencoded";// 百度翻译async function getBaiduTransResult(text = "", opt = {}) {    const { from, to, appid, key } = opt;    try {        const q = text;        const salt = parseInt(Math.random() * 1000000000);        let str = `${appid}${q}${salt}${key}`;        const sign = md5(str);        const query = encodeURI(q);        const params = `q=${query}&from=${from}&to=${to}&appid=${appid}&salt=${salt}&sign=${sign}`;        const url = `${config.baiduBaseUrl}${params}`;        console.log(url);        const res = await axios.get(url);        console.log('百度翻译结果', res.data.trans_result[0]);        return res.data.trans_result[0];    } catch (error) {        console.log({ error });    }}module.exports = getBaiduTransResult;

获取选中的文本

使用事件钩子onDidChangeTextEditorSelection,获取选中的文本

    onDidChangeTextEditorSelection(({ textEditor, selections }) => {        text = textEditor.document.getText(selections[0]);    })

配置项的获取更新

通过vscode.workspace.getConfiguration获取到工作区的配置项,然后通过事件钩子onDidChangeConfiguration监听配置项的变动。

获取更新配置项

const { getConfiguration } = vscode.workspace;const config = getConfiguration();//注意get里面的参数其实就是package.json配置项里面的contributes.configuration.properties.xxxconst isCopy = config.get(IS_COPY);const isReplace = config.get(IS_REPLACE);const isHump = config.get(IS_HUMP);const service = config.get(SERVICE);const baiduAppid = config.get(BAIDU_APPID);const baiduKey = config.get(BAIDU_KEY);//更新使用update方法,第三个参数为true代表应用到全局config.update(SERVICE, selectedItem, true);

监听配置项的变动

const { getConfiguration, onDidChangeConfiguration } = vscode.workspace;const config = getConfiguration();//监听变动const disposeConfig = onDidChangeConfiguration(() => {  config = getConfiguration();})

监听个别配置项的变动

const disposeConfig = onDidChangeConfiguration((e) => {    if (e && e.affectsConfiguration(BAIDU_KEY)) {        //干些什么    }})

获取当前打开的编辑器对象

vscode.window.activeTextEditor代表当前打开的编辑器,如果切换标签页,而没有设置监听,那么这个这个对象不会自动更新,所以需要使用onDidChangeActiveTextEditor来监听,并替换之前的编辑器对象

const { activeTextEditor, onDidChangeActiveTextEditor } = vscode.window;let active = activeTextEditor;const edit = onDidChangeActiveTextEditor((textEditor) => {  console.log('activeEditor改变了');  //更换打开的编辑器对象  if (textEditor) {      active = textEditor;  }})

划词翻译悬浮提示

通过vscode.languages.registerHoverProvider注册一个Hover,然后通过activeTextEditor拿到选中的词语进行翻译,然后再通过new vscode.Hover将翻译结果悬浮提示

// 划词翻译检测const disposeHover = vscode.languages.registerHoverProvider("*", {    async provideHover(document, position, token) {        const service = config.get(SERVICE);        const baiduAppid = config.get(BAIDU_APPID);        const baiduKey = config.get(BAIDU_KEY);        let response, responseText;        const selected = document.getText(active.selection);        // 谷歌翻译        if (service === 'google') {            response = await getGoogleTransResult(selected, { from: 'auto', to: 'zh-cn' });            responseText = response.text;        }        // 百度翻译        if (service === 'baidu') {            response = await getBaiduTransResult(selected, { from: "auto", to: "zh", appid: baiduAppid, key: baiduKey });            responseText = response.dst;        }        // 悬浮提示        return new vscode.Hover(`${responseText}`);    }})

替换选中的文本

获取到activeTextEditor,调用他的edit方法,然后使用回调中的replace

//是否替换原文if (isReplace) {  let selectedItem = active.selection;  active.edit(editBuilder => {    editBuilder.replace(selectedItem, result)  })}

复制到剪贴板

使用vscode.env.clipboard.writeText;

// 是否复制翻译结果if (isCopy) {  vscode.env.clipboard.writeText(result);}

驼峰处理

function toHump(str) {    if (!str) {        return    }    const strArray = str.split(' ');    const firstLetter = [strArray.shift()];    const newArray = strArray.map(item => {        return `${item.substring(0,1).toUpperCase()}${item.substring(1)}`;    })    const result = firstLetter.concat(newArray).join('');    return result;}module.exports = toHump;

快捷键绑定

通过vscode.commands.registerCommand注册绑定之前package.json中设置的keybindings,需要注意的是registerCommand的第一个参数需要与keybindings的command保持一致才能绑定

registerCommand('translateVariable.toEN', async() => {  //do something})//package.json"keybindings": [{  "key": "ctrl+t",  "mac": "cmd+t",  "when": "editorTextFocus",  "command": "translateVariable.toEN"}],

插件打包发布

打包

vsce package

打包后会在目录下生成.vsix后缀的插件

发布

插件发布主要是把打包的vsix后缀插件,传入微软vscode插件商店,当然也能本地安装使用。

传入商店

发布到线上需要到 微软插件商店管理页面(https://marketplace.visualstudio.com/manage/createpublisher),创建发布者信息,如果没有微软账号,需要去申请。

7.png

创建完成后,选择发布到vscode商店

8.png

本地安装

本地是可以直接安装.vsix后缀插件的,找到插件菜单

9.png

选择从VSIX安装,安装上面打包的插件就好了

10.png

最后

vscode的中文资料有点少,这次开发大多数时间都在看英文文档,以及上外网寻找资料,真的英语太重要了,后面得多学点英语了,希望后面我使用自己做的这个插件的次数会越来越少,项目已开源,使用说明与源码传送门(https://github.com/Kerinlin/translate-variable)

更多关于VSCode的相关知识,请访问:vscode教程!!

以上就是手把手从0教你开发一个vscode变量翻译插件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/58552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
内存时序对游戏帧数的影响:CL30 vs. CL40深度测试
上一篇 2025年11月10日 09:49:32
悟空浏览器登录账号提示异常怎么办 悟空浏览器账号登录异常的解决方法
下一篇 2025年11月10日 09:52:35

相关推荐

  • vscode上怎么运行html_vscode上运行html步骤【指南】

    首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…

    2026年5月10日
    100
  • vscode怎么运行html选择浏览器_vscode选浏览器运html法【教程】

    使用Live Server插件可在VS Code中运行HTML文件并指定浏览器。1. 安装Live Server插件后右键HTML文件选择Open with Live Server即可在默认浏览器中预览。2. 通过设置Live Server的Browser选项为chrome、firefox或edge…

    2026年5月10日
    100
  • vscose html怎么运行_vscode运行html方法(拼写修正)【教程】

    一、安装Live Server扩展可实现自动刷新预览;二、直接右键HTML文件用浏览器打开;三、通过配置tasks.json任务运行文件。 如果您编写了 HTML 文件并希望在浏览器中查看其效果,但不知道如何在 Visual Studio Code 中运行,可以通过以下几种方式快速预览页面内容: 一…

    2026年5月10日
    000
  • VSCode内置了哪些编程语言插件?

    vscode 内置语言插件一览 VSCode 已内置多款语言插件,免除安装市场插件的步骤。以下是如何查看内建语言插件: 快捷键 Ctrl+Shift+P 唤出命令窗口输入并选择 “Show Built-in Extensions”左侧出现的 “Programmin…

    2026年5月10日
    000
  • 深入探索Go语言交互式调试:从GDB到Delve

    Go语言的交互式调试功能至关重要,开发者可通过多种工具实现断点设置、单步执行等操作。本文将首先介绍传统的GDB调试方式及其在IDE中的集成,随后重点阐述Go语言原生调试器Delve的优势与使用,并结合主流IDE提供详细的调试实践指南,助您高效定位和解决Go程序中的问题。 Go语言调试基础:GDB 在…

    2026年5月10日
    000
  • 在vscode中怎么运行html_vscode运行html文件方法【教程】

    1、使用Live Server扩展可实现自动刷新预览,安装后右键选择Open with Live Server即可在浏览器中实时查看HTML页面效果。 如果您在使用VSCode编写HTML文件,但不知道如何快速预览页面效果,可以通过多种方式在浏览器中运行HTML文件。以下是几种常用的实现方法: 一、…

    2026年5月10日
    000
  • C++如何为项目配置调试环境

    配置C++调试环境需生成调试符号并正确设置IDE或调试器。首先编译时添加-g(GCC/Clang)或/Zi(MSVC)以生成调试信息,使用CMake时设CMAKE_BUILD_TYPE为Debug;其次在IDE中配置可执行文件路径、工作目录、命令行参数、环境变量及调试器类型(如GDB、LLDB),V…

    2026年5月10日
    000
  • 格式化和 Linting 以保持一致性

    此活动涉及在我的开源项目 genereadme 中实施统计分析工具,以提高代码质量和一致性。 克莱布恩特拉 / 基因自述文件 genereadme 是一个命令行工具,它接收源代码文件并生成 readme.md 文件,该文件利用 llm 解释文件中的代码。 贡献 欢迎为 genereadme 做出贡献…

    2026年5月10日
    000
  • Visual Studio Code 中 Python 绘图遇到问题怎么办?

    Visual Studio Code 中的 Python 绘图问题 作为一名 Python 初学者,在 Visual Studio Code 中绘图时遇到了问题?请看这里: 问题一:无法绘制图形 您提供的代码中没有明确的错误,但它可能无法正常工作,因为您没有使用适当的库进行绘图。建议使用 Matpl…

    2026年5月10日
    000
  • Golang配置远程调试环境及注意事项

    远程调试Golang应用需在远程服务器运行delve调试服务器,本地IDE通过网络连接实现断点、变量查看等功能。首先在远程安装Go和delve,使用go build -gcflags=”all=-N -l”编译禁用优化,上传二进制并启动delve监听端口(推荐通过SSH隧道监…

    2026年5月10日
    100
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    800
  • 为什么在 React 组件中无法获得 Tailwind CSS 语法提示?

    为什么在 React 组件中无法获得 Tailwind CSS 语法提示? 你在 VSCode 中编写 HTML 文件时,可以正常获取 Tailwind CSS 语法提示。但当你尝试在 React 组件中编写 Tailwind CSS 时,这些提示却消失不见了。这是什么原因造成的? 解决方案 要解决…

    2025年12月24日
    700
  • 如何在 VSCode 中为 React 组件启用 Tailwind CSS 提示?

    在 vscode 中为 react 组件启用 tailwind css 提示 如果你在使用 vscode 编写 react 组件时,发现 tailwind css 提示无法正常显示,这里有一个解决方法: 安装 tailwind css intellisense 插件 这是实现代码提示的关键,确保你已…

    2025年12月24日
    200
  • Vue3 中如何将页面上的 PX 单位转换为 REM?

    vue3 下如何实现某个页面 px 自适应到 rem? 在 vue3 中,您可以在某个页面中使用 px 转 rem 的自适应功能,以免影响其他项目 ui 框架。以下是实现方法: 使用 jquery 获取页面宽度,并将其作为基准值。例如,使用 375 作为基准,您可以在页面 mounted 生命周期函…

    2025年12月24日
    700
  • 如何实现 Vue 3 项目中特定页面自适应,避免影响全局 UI 框架?

    自适应页面 px 到 rem 插件探索 在 vue 3 项目中,开发者有时需要让某个特定页面具有自适应大小,即根据不同分辨率自动调整 px 到 rem 的转换。然而,传统的 px-to-rem 插件可能会影响整个项目的 ui 框架。 为了解决这个问题,这里提供了一种利用 javascript 和 v…

    2025年12月24日
    600
  • Vue 3 页面如何实现 px to rem 自适应?

    如何在 vue 3 页面中实现 px to rem 自适应? 在 vue 项目中,有时需要让特定的页面进行 px to rem 自适应,以实现自动缩放。以下是一个可用的解决方案: 使用 javascript 获取页面宽度,并以 375px 作为基准值。例如: let appwidth = $(‘#a…

    2025年12月24日
    700
  • CSS 砌体 Catness

    css 就像技术中的其他东西一样 – 它总是在变化和发展。该领域正在进行的开发是 css 网格布局模块级别 3,也称为 css masonry 布局。 theo 制作了一段视频,介绍了它的开发方式以及苹果和谷歌就如何实施它进行的辩论。 所有这些让我很高兴尝试 css 砌体! webkit…

    用户投稿 2025年12月24日
    000
  • 如何解决VSCode中折叠部分的代码复制问题?

    Vscode中折叠代码的复制方法 当Vscode中的代码过多时,可以将其折叠起来以方便查看和编辑。不过,有时用户可能会发现折叠后复制代码时只复制了显示的部分,而折叠部分没有被复制。以下是如何解决此问题的方法: 使用快捷键Ctrl+C直接复制 当代码折叠时,直接使用Ctrl+C快捷键复制即可复制所有代…

    2025年12月24日
    500
  • 如何复制折叠的代码?

    Visual Studio Code 中如何复制折叠的代码? Visual Studio Code (vscode) 中,当遇到过长的代码时,为了提高可读性和简洁性,开发人员会经常使用折叠功能将代码折叠起来。然而,在折叠代码后,直接按住 Ctrl + C 复制代码时,只会复制展开的部分,而折叠的部分…

    2025年12月24日
    000
  • 如何在 VSCode 复制折叠的代码?

    如何复制折叠的 VSCode 代码 使用 VSCode 时,代码过长可能会造成不便。在折叠代码后,发现无法正常复制折叠的部分,令人感到烦恼。本文将介绍一种解决方案,帮助你轻松复制折叠的 VSCode 代码。 问题:如何复制折叠起来的 VSCode 代码? 当你折叠代码后,直接选中复制只会复制未折叠的…

    2025年12月24日
    400

发表回复

登录后才能评论
关注微信