SublimeText3 插件开发记录 --- 划词翻译
2017-01-02 21:48
232 查看
最近正研究怎么使用SublimeText3开发Python,然而对Python英文文档的阅读是一个比较头疼的问题,在AndroidStudio中有自动翻译插件ECTranslation,能方便的翻译单词和句子。因此想仿照ECTranslation,自己写一个翻译插件,正好也能加深对Python的印象。(在SublimeText3中,似乎没有特别好用的划词翻译插件)
开发ST3的插件,大致上是以下几个步骤:
1. 得到鼠标选择的文本。
2. 发送到百度翻译API(不够准确,以后可以用有道API替换)。
3. 解析翻译结果,弹窗显示。
具体的代码如下:
这里的Region就是指一个文本段,而根据API文档,self.view.sel()可以返回所有鼠标选择的文本段。而对于按住ctrl键选择了多个文本,这里只翻译选择的第一个文本。
[ { “keys”: [“ctrl+t”],”command”: “translate”}]
项目地址 (https://github.com/HYY-yu/SublimeText3Plugin-TranslateAuto)
开发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”}]
项目地址 (https://github.com/HYY-yu/SublimeText3Plugin-TranslateAuto)
相关文章推荐
- 插件开发积累记录
- firefox 插件扩展开发 入门记录
- NPAPI插件开发详细记录:安装包的制作
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
- 一步一步开发自己的Openfire插件(聊天记录插件)
- DTS开发记录(2)-- 数据管道及插件
- NPAPI插件开发详细记录:插件的调试
- NPAPI插件开发详细记录:用VS2010开发NPAPI插件步骤
- NPAPI插件开发详细记录:实用功能——添加、识别私有属性
- Signs of a poorly written jQuery plugin 翻译 (Jquery插件开发注意事项,Jquey官方推荐)
- 一种jQuery插件开发模式(翻译分享)
- NPAPI插件开发详细记录:插件开发入门
- NPAPI插件开发详细记录:用VS2010开发NPAPI插件步骤
- 基于开源 Openfire 聊天服务器 - 开发Openfire 聊天记录插件
- NPAPI插件开发详细记录:再谈多线程
- 关于windows mobile 今日插件开发的记录
- android eclipse开发插件ADT 14.0.0 更新记录
- NPAPI插件开发详细记录:实用功能(库的使用及多线程)
- 基于开源 Openfire 聊天服务器 - 开发Openfire 聊天记录插件
- 在开发IE插件时,遇到的各种问题记录