热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SublimeText3插件开发记录---划词翻译

最近正研究怎么使用SublimeText3开发Python,然而对Python英文文档的阅读是一个比较头疼的问题,在AndroidStudio中有自动翻译插件ECTranslation

最近正研究怎么使用SublimeText3开发Python,然而对Python英文文档的阅读是一个比较头疼的问题,在AndroidStudio中有自动翻译插件ECTranslation,能方便的翻译单词和句子。因此想仿照ECTranslation,自己写一个翻译插件,正好也能加深对Python的印象。(在SublimeText3中,似乎没有特别好用的划词翻译插件)

开发ST3的插件,大致上是以下几个步骤:

1. 搭框架

SublimeText的Tool菜单下选New Plugin ,将会新建一份.py模版文件,将其保存到Package目录下,插件主体就弄好了。如果需要添加到右键菜单、窗口菜单、快捷键,只需要定义相应的文件即可。这里,划词翻译需要快捷键支持,所以还需在当前目录下新建sublime-keymap 文件(注意这个文件的文件名,支持什么系统就在括号中书写,而且Default 和系统名之间的空格不能省略)。目录结构如下:
这里写图片描述

2. 编写代码

SublimeText3 API中写明了ST3公开的接口,其实ST3的插件就是一个Command,其中分为 ApplicationCommand、TextCommand、WindowCommand。可以根据需要继承不同的Command类实现不同的功能,这里需要获取选中的文本然后翻译,所以插件继承TexCommand。而后在run方法中书写插件要完成的动作即可。划词插件的动作很简单:
1. 得到鼠标选择的文本。
2. 发送到百度翻译API(不够准确,以后可以用有道API替换)。
3. 解析翻译结果,弹窗显示。
具体的代码如下:

import threading
import random
import hashlib
import json
from urllib import request, parse

import sublime
import sublime_plugin

appid = '20170101000035055'
secretKey = '42I1a2L4KencJQ6vraSD'
targetUrl = 'https://fanyi-api.baidu.com/api/trans/vip/translate'

'''
根据百度翻译API文档书写的方法,因为ST3插件似乎并不支持第三方框架,所以网络请求使用urllib
'''

def getTranslationFromBaidu(src):
q = src
salt = random.randint(32768, 65536)
sign = appid + q + str(salt) + secretKey
md5Value = hashlib.md5()
md5Value.update(sign.encode('utf-8'))
sign = md5Value.hexdigest()

postData = {
'appid': appid,
'q': q,
'sign': sign,
'salt': salt,
'from': 'auto',
'to': 'zh'
}

postDataEncode = parse.urlencode(postData)
f = request.urlopen(targetUrl, data=postDataEncode.encode())
data = f.read()
jsOnResultString= data.decode('utf-8')
jsOnResult= json.loads(jsonResultString)

trans_result = jsonResult['trans_result']
# 得到翻译文本
dst = trans_result[0]['dst']
return dst

#插件主类
class translateCommand(sublime_plugin.TextCommand):
def run(self, edit):
for s in self.view.sel():
if s.empty() or s.size() <= 1:
break
# 只处理第一个Region,其它忽略
str = self.view.substr(s)
print(str)
# 查询单词
t = NewThread(
getTranslationFromBaidu, (str,))
t.start()
t.join()

# 得到翻译结果 弹窗显示
resultString = t.getResult()
self.view.show_popup(
resultString, sublime.HIDE_ON_MOUSE_MOVE_AWAY, -1, 600, 500)
break

#辅助线程
class NewThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args

def getResult(self):
return self.res

def run(self):
self.res = self.func(*self.args)

这里的Region就是指一个文本段,而根据API文档,self.view.sel()可以返回所有鼠标选择的文本段。而对于按住ctrl键选择了多个文本,这里只翻译选择的第一个文本。

3. 快捷键绑定

若还需绑定快捷键、菜单等,只需要建立相应文件。本插件的快捷键映射文件只有一行代码:
[ { “keys”: [“ctrl+t”],”command”: “translate”}]


推荐阅读
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 本文介绍了如何在React Native应用中获取组件的实际宽度和高度,并详细说明了屏幕单位(如dp)与像素(px)之间的转换方法。 ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 字符、字符串和文本的处理之Char类型
    .NetFramework中处理字符和字符串的主要有以下这么几个类:(1)、System.Char类一基础字符串处理类(2)、System.String类一处理不可变的字符串(一经 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • 基于Flutter实现风车加载组件的制作_Android
    Flutter官方提供了诸如 CircularProgressIndicator和 LinearProgressIndicator两种常见的加载指示组件,但是说实话,实在太普通,所 ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 转自:http:blog.sina.com.cnsblog_67419c420100vmkt.html 1.为什么要使用blocks将一个blocks作为函数或者方法的参数传递,可 ... [详细]
  • 本文介绍如何使用Python编程语言合并字典中具有相同集合值的键,并提供两种实现方法。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 转载自:https:blog.csdn.netu013948858articledetails77800663【python】pip安装报错UnicodeDecode ... [详细]
  • 本文档详细介绍了Excel VBA编程中的基本语法,包括循环结构、条件判断、数据处理以及用户界面设计等内容,旨在帮助初学者快速掌握VBA编程技巧。 ... [详细]
  • 本文详细介绍了Spring AOP注解的基本概念及其实现方式,并通过实例演示了如何在项目中使用这些注解进行面向切面的编程。旨在帮助开发者更好地理解和运用Spring AOP功能。 ... [详细]
author-avatar
LST---诗ting
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有