动手开发sublime text3插件
开发sublime text翻译插件
我平时开发都是用sublime text写脚本,或者阅读别人的代码,英语太菜,没办法有些单词确实不懂,每次都要复制->百度翻译or谷歌翻译,或者遇到变量,方法命名也是需要复制到网页进行翻译再搬回来,于是一直想要开发一个插件可以利用百度翻译API进行翻译,于是有了这篇文章,插件名称是HBH-Translator. 昨天刚提交到package control不知道会不会通过,在此把此插件开发过程记录一下.
百度翻译API申请
申请百度开发者平台的通用翻译API,通用翻译API
此api每月翻译字符数小于200万是免费的,所以基本上我们个人是够用了.
创建插件脚本
- 进入插件目录,创建插件目录
HBH-Translator
- 创建baidu翻译驱动脚本
driver/baidu_translate.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
__author__ = 'huangbinghe@gmail.com'
from urllib import parse, request
import re
import hashlib
import random
import json
class BaiduTranslate():
def __init__(self, appid, secret_key):
self.appid = appid
self.secret_key = secret_key
self.api = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
self.__from_lang = 'auto'
self.__to_lang = 'zh'
self.q = ''
@property
def from_lang(self):
'''get from language'''
return self.__from_lang
@from_lang.setter
def from_lang(self, lang='auto'):
'''set from language'''
self.__from_lang = lang
@property
def to_lang(self):
'''get to language'''
return self.__to_lang
@to_lang.setter
def to_lang(self, lang='zh'):
'''set to language'''
self.__to_lang = lang
def __make_sign(self):
'''create sign, return salt,sign'''
salt = str(random.randint(32768, 65536))
print('salt:', salt)
sign = self.appid+self.q+salt+self.secret_key
print('before sign:', sign)
m1 = hashlib.md5()
m1.update(bytes(sign, encoding='utf8'))
sign = m1.hexdigest()
print('sign:', sign)
return salt, sign
def __make_params(self):
'''create params'''
salt, sign = self.__make_sign()
params = {
'appid': self.appid,
'q': self.q,
'from': self.__from_lang,
'to': self.__to_lang,
'salt': salt,
'sign': sign
}
print('params:', params)
params = parse.urlencode(params).encode('utf-8')
print('params urlencode:', params)
return params
def query(self, q):
'''wait translate string:q'''
self.q = q
params = self.__make_params()
try:
req = request.Request(self.api, data=params)
r = request.urlopen(req).read().decode('utf-8')
print('baidu api response:', r)
r = json.loads(r)
error_code = r.get('error_code', '52000')
if error_code != '52000':
return self.error(error_code)
result = r.get('trans_result', [])
if len(result) < 1:
raise Exception('tanslate fail')
dst = []
for x in result:
dst.append(x.get('dst', ''))
print('dst:', dst)
dst_str = ' '.join(dst)
return dst_str
except Exception as e:
print('error:', str(e))
finally:
pass
def error(self, code=''):
'''get error message'''
error_msg = {
'52000': 'success',
'52001': 'request timeout,try again',
'52002': 'system error,try again',
'52003': 'unauth user,please check your appid or secret_key',
'54000': 'params empty',
'54001': 'sign error',
'54003': 'Access frequency constraints',
'54004': 'balance is not enough',
'54005': 'Frequent long query,wait 3 second then try again',
'58000': 'client IP error',
'58001': 'language not support',
'58002': 'service close'
}
return error_msg.get(code, '未知错误')
def to_cn(self, q):
self.__to_lang = 'zh'
return self.query(q)
def to_en(self, q):
self.__to_lang = 'en'
return self.query(q)
if __name__ == '__main__':
appid = '你申请的appid'
secret_key = '你申请的密钥'
t = BaiduTranslate(appid, secret_key)
res = t.query('apple is a good phone')
print(res)
- 相关脚本编写可以参考baidu翻译api文档及示例,API技术文档
- 原来url请求模块用的是requests模块,后来调试的时候发现sublime不支持requests模块,后来用python自带的urllib模块
- 以driver驱动模式来做是为了以后增加其他翻译api更加方便 ?
- 主程序脚本
translate.py
import sublime
import sublime_plugin
from .driver.baidu_translate import BaiduTranslate
s = sublime.load_settings("HBH-Translator.sublime-settings")
appid = s.get('appid')
secret_key = s.get('secret_key')
print(appid, secret_key)
bd_api = BaiduTranslate(appid, secret_key)
class TranslateCommand(sublime_plugin.TextCommand):
def run(self, edit, to_lang=''):
sublime.status_message('Translate...')
sels = self.view.sel()
sels_str = []
for sel in sels:
sel_str = self.view.substr(sel).strip()
if sel_str:
sels_str.append(sel_str)
print('sels_str:', sels_str)
if not sels_str:
sublime.status_message('please select some string to translate!')
return
sels_str = '\n'.join(sels_str)
if to_lang:
bd_api.to_lang = to_lang
else:
bd_api.to_lang = s.get('default_to_lang', 'zh')
dst = bd_api.query(sels_str)
sublime.set_clipboard(dst)
sublime.status_message('Translate result:{}'.format(dst))
主要功能
效果如图:
sublime 接口api: http://www.sublimetext.com/docs/3/api_reference.html#sublime.Settings
- 定义指令
- 定义快捷键
- 设置配置文件
- 设置菜单
[
{
"mnemonic": "n",
"caption": "Preferences",
"id": "preferences",
"children": [
{
"mnemonic": "P",
"caption": "Package Settings",
"id": "package-settings",
"children": [
{
"caption": "HBH-Translator",
"children": [
{
"caption": "Settings – Default",
"args": {
"file": "${packages}/HBH-Translator/HBH-Translator.sublime-settings"
},
"command": "open_file"
},
{
"caption": "Settings – User",
"args": {
"file": "${packages}/User/HBH-Translator.sublime-settings"
},
"command": "open_file"
},
{
"caption": "-"
},
{
"caption": "Key Bindings – Default",
"args": {
"file": "${packages}/HBH-Translator/Default.sublime-keymap"
},
"command": "open_file"
},
{
"caption": "Key Bindings – User",
"args": {
"file": "${packages}/User/Default.sublime-keymap"
},
"command": "open_file"
},
{
"caption": "-"
},
{
"caption": "translate->cn",
"args": {
"to_lang": "zh"
},
"command": "translate"
},
{
"caption": "translate->en",
"args": {
"to_lang": "en"
},
"command": "translate"
}
]
}
]
}
]
}
]
效果如图:
8. 右键菜单设置
效果如图:
9. 设置LICENCE
10. 生成README.md
同步到github
- 创建仓库
- 同步本地到github
git init
git commit -am "first commit"
git remote add origin git@github.com:hbh112233abc/HBH-Translator.git
git push
3. 发布版本
git tag -a v1.0.0
git push origin v1.0.0
加入package control
- fork package control官方github 仓库
- 修改
repository/h.json
,在合适的位置加入我们插件包信息
- sublime_text >= 3000 表示sublime text3以上的版本
- tags: true 表示最新版本
- 其他不相关的不要改
- 同步到我们fork后的仓库
- pull request
- 此处遇到一个浏览器的坑,我默认用360极速浏览器,发现
create new pull request
按钮点击一直没动静,后来用谷歌浏览器成功提交 - 提交后有机器人审查一下,遇到错误提示请修改后继续提交.
- 一直修改到机器人审核通过,等待人工审核,希望能过到时大家也可以用到我的插件 ?
结语
请原谅我的垃圾英文水平,反正中国人是看到懂啦,估计老外看的蛋疼就是了 ?
有兴趣的朋友可以一起来开发,希望sublime text越来越厉害!