动手开发sublime text3插件

开发sublime text翻译插件

我平时开发都是用sublime text写脚本,或者阅读别人的代码,英语太菜,没办法有些单词确实不懂,每次都要复制->百度翻译or谷歌翻译,或者遇到变量,方法命名也是需要复制到网页进行翻译再搬回来,于是一直想要开发一个插件可以利用百度翻译API进行翻译,于是有了这篇文章,插件名称是HBH-Translator. 昨天刚提交到package control不知道会不会通过,在此把此插件开发过程记录一下.

百度翻译API申请

申请百度开发者平台的通用翻译API,通用翻译API
在这里插入图片描述
此api每月翻译字符数小于200万是免费的,所以基本上我们个人是够用了.

创建插件脚本

  1. 进入插件目录,创建插件目录HBH-Translator
    在这里插入图片描述
    在这里插入图片描述
  2. 创建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更加方便 ?
  1. 主程序脚本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))

主要功能

Created with Raphaël 2.2.0 开始 读取配置文件,实例化bd_api 读取选中字符串 字符串为空? 翻译 返回翻译结果显示在状态栏 yes no

效果如图:
在这里插入图片描述

sublime 接口api: http://www.sublimetext.com/docs/3/api_reference.html#sublime.Settings

  1. 定义指令
    在这里插入图片描述
  2. 定义快捷键
    在这里插入图片描述
  3. 设置配置文件
    在这里插入图片描述
  4. 设置菜单
    在这里插入图片描述
[
   {
       "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

  1. 创建仓库
    在这里插入图片描述
  2. 同步本地到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

  1. fork package control官方github 仓库
    在这里插入图片描述
  2. 修改repository/h.json,在合适的位置加入我们插件包信息
    在这里插入图片描述
  • sublime_text >= 3000 表示sublime text3以上的版本
  • tags: true 表示最新版本
  • 其他不相关的不要改
  • 同步到我们fork后的仓库
  1. pull request
    在这里插入图片描述
  • 此处遇到一个浏览器的坑,我默认用360极速浏览器,发现create new pull request按钮点击一直没动静,后来用谷歌浏览器成功提交
  • 提交后有机器人审查一下,遇到错误提示请修改后继续提交.
    在这里插入图片描述
  • 一直修改到机器人审核通过,等待人工审核,希望能过到时大家也可以用到我的插件 ?
    在这里插入图片描述

结语

请原谅我的垃圾英文水平,反正中国人是看到懂啦,估计老外看的蛋疼就是了 ?
有兴趣的朋友可以一起来开发,希望sublime text越来越厉害!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值