手把手从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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 09:47:10
下一篇 2025年11月10日 09:59:42

相关推荐

  • 使用 Mask 导入本地图片时,如何解决跨域问题?

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

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

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

    2025年12月24日
    000
  • 如何在 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日
    000
  • 如何实现 Vue 3 项目中特定页面自适应,避免影响全局 UI 框架?

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

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

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

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

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

    好文分享 2025年12月24日
    000
  • 如何解决VSCode中折叠部分的代码复制问题?

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

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

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

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

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

    2025年12月24日
    000
  • CSS 太棒了!

    我正在学习什么 css 赋予了页面活力。多年来,css 变得越来越强大,并且已经开始用于制作以前需要 javascript 的动画。本周我一直在研究它的一些更高级的属性。 媒体查询 媒体查询几乎已经成为新时代设备的必需品。随着智能手机的出现,通过手机消费媒体的人比任何其他设备都多。因此,网站必须在移…

    2025年12月24日
    000
  • 试验 Tailwind CSS:快速指南

    tailwind css 是一个实用性优先的 css 框架,因其灵活性和易用性而在 web 开发人员中广受欢迎。 tailwind css 在 npm 上的每周下载量超过 950 万次(2024 年 8 月 5 日),显然它是 web 开发社区的最爱。在这篇博文中,我们将探讨如何在不设置本地开发环境…

    2025年12月24日
    000
  • VSCode如何使用HTML插件_高效开发环境配置【技巧】

    VSCode中HTML开发需配置五项功能:一、启用内置HTML语言支持;二、配置Emmet实现快捷展开;三、安装Live Server插件实现自动刷新预览;四、启用Auto Rename Tag同步修改成对标签;五、配置Prettier实现HTML格式自动化。 如果您在VSCode中编写HTML文件…

    2025年12月23日
    000
  • 怎么在vscode中运行html_vscode运行html文件步骤【教程】

    使用Live Server插件可实现实时预览,安装后右键HTML文件选择Open with Live Server即可在浏览器中自动打开并实时刷新页面。 如果您在使用 VSCode 编辑 HTML 文件,但无法直接查看页面效果,可以通过多种方式快速预览和运行 HTML 文件。以下是具体的操作步骤: …

    2025年12月23日
    000
  • 怎么进入html5编辑_用VSCode/记事本打开.html文件即可进入HTML5编辑【进入】

    最直接编辑HTML5文件的方式是用文本编辑器打开.html文件:一、VSCode右键打开或拖拽加载;二、记事本右键打开并设UTF-8编码;三、VSCode命令面板快速搜索打开。 如果您希望对HTML5文件进行编辑,最直接的方式是使用文本编辑器打开已有的.html文件。以下是具体操作步骤: 一、使用V…

    2025年12月23日
    000
  • vscode设置html5环境_插件配置与代码片段设置【教程】

    若VS Code中HTML文件缺乏语法高亮、智能补全及HTML5结构快速生成,需安装Auto Close Tag、Auto Rename Tag、CSS class IntelliSense和HTML Boilerplate插件,启用Emmet并配置html关联与格式化设置。 如果您在 Visual…

    2025年12月23日
    000
  • 怎么在vscode运行html_vscode运行html步骤【指南】

    答案:在VSCode中运行HTML需安装Live Server扩展。1. 创建并保存HTML文件;2. 安装Ritwick Dey开发的Live Server插件;3. 右键选择“Open with Live Server”即可在浏览器中实时预览,修改后自动刷新。 在 VSCode 中运行 HTML…

    2025年12月23日
    000
  • vscode怎么编译运行html_vscode编译运行html步骤【指南】

    使用Live Server插件可实时预览HTML页面,安装后右键选择Open with Live Server即可在浏览器中查看并支持热重载。 如果您在使用 Visual Studio Code 编辑 HTML 文件,但无法查看页面效果,可能是因为缺少正确的运行环境或配置。以下是几种在 VSCode…

    2025年12月23日
    000
  • vscode怎么运行html代码框架_vscode运行html框架方法【教程】

    使用Live Server插件可快速预览HTML,安装后右键选择“Open with Live Server”即可在浏览器中实时查看页面效果。 如果您在使用 Visual Studio Code 编辑 HTML 文件,但无法直接查看页面效果,可以通过多种方式快速运行并预览 HTML 代码。以下是几种…

    2025年12月23日
    000
  • vscode运行html慢怎么办_解vscode运行html慢问题【技巧】

    使用Live Server插件启动本地服务器预览HTML,禁用非必要扩展以释放资源,优化大体积静态文件引入方式,清除浏览器缓存并切换至高性能浏览器,调整VSCode自动保存与文件监听设置,可显著提升加载速度。 如果您在使用VSCode运行HTML文件时发现加载或预览速度较慢,可能是由于插件配置、浏览…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信