ulaucher的翻译插件

需求

  • 在使用ubuntu系统的时候,迫切想要一款替代windows下wox的启动器应用。最终选择了ulaucher,在使用ulaucher过程中,由于本人英语水平不高时长有翻译英语单词的需求,在官方的插件库里有找不到合适的。所以自己打算写一款插件

实现

工作原理

  • ulaucher 的基本工作原理事件订阅。keyword+空格会产生相应的KeywordQueryEvent事件,事件对应的订阅者就会处理事件,处理结果会被封装在RenderResultListAction中交由ulaucher app 渲染。
  • App 与扩展的工作关系是事件处理机制,扩展向APP注册事件和事件处理程序,APP发起对应事件,事件处理器处理事件,事件结果封装为动作,APP相应动作
  • 基本原理涉及:事件抽象,事件处理抽象,动作抽象。

设计思路

  • 利用百度翻译提供的免费通用翻译api来实现翻译的操作
  • 获取事件中的参数(作为待翻译文本)、封装api请求、处理结果
    1. api请求的相关平台配置通过app提供的preferences注入
    2. 提取结果中的翻译结果

代码实现

  • version.json

    ulaucher 安装依赖的github,插件以一个git仓库的形式存在。不同版本的ulaucher使用的api版本不同,为了支持统一仓库支持不同版本的ulauncher,可以维护不同的分支支持不同版本的ulaucher api 版本,version.json 文件就是用来描述api版本对应的仓库分支。

    我这里只是定义了一个版本和分支的关系,这是个数组,可以定义多个分支关联关系

[
    { "required_api_version": "^2.0.0", "commit": "main" }
]
  • manifest.json

    定义扩展使用的api版本,扩展的相关属性:名称、选项、偏好。这里面重要的有options 和preferences

    options可以设置 query_debounce设置时间间隔,避免冗余的事件被处理。当事件触发的时候,如果两个事件间隔小于阈值,则时间会被忽略。

        "options": {
            "query_debounce": 1 //秒
        }
    

    preferences可以自定义关键字和属性,通过ui界面设置属性值,属性值会通过事件传递到扩展中

            arg = event.get_argument();# 获取事件的参数
            logger.info('arg:%s' % arg)
            logger.info('preferences %s' % json.dumps(extension.preferences))# preferences 是个json结构
    
        "preferences": [{
                "id": "transbaidu",
                "type": "keyword",
                "name": "关键字",
                "default_value": "trans"
            },
            {
                "id": "app_id",
                "type": "input",
                "name": "appid",
                "description": "百度翻译服务的appid",
                "default_value": ""
            },
            {
                "id": "key",
                "type": "input",
                "name": "key",
                "description": "百度翻译服务的key",
                "default_value": ""
            }
        ]
    

    json的name对应manifest.json中的id

            self.APPID=perferences.get('app_id')
            self.KEY=perferences.get('key')
    
  • 编写入口文件

    1.定义类实现Extension

    class TransExtension(Extension):
    

    2.注册扩展和绑定事件和事件处理器

        def __init__(self):
            super(TransExtension, self).__init__()	#注册扩展
            self.subscribe(KeywordQueryEvent, KeywordQueryEventListener()) #绑定事件和事件处理器
    

    3.事件监听器(事件处理器)

    • 获取翻译结果

              trans = TransBaidu(extension.preferences)       # 初始化自定义翻译类(封装翻译逻辑)
              results = trans.trans(arg)						# 执行翻译操作
      
      
    • 渲染结果

      • 构建ExtensionResultItem 数组

        baidu_url = 'https://fanyi.baidu.com/?aldtype=16047#en/zh/' #定义基础的百度翻译url
        for i in results:
                    items.append(ExtensionResultItem(icon='images/icon.png',
                                                     name='%s %s' % (i.get('src'), i.get('dst')),
                                                     description='',
                                                     on_enter=OpenUrlAction(baidu_url+i.get('src'))))
        
      • on_enter

        定义结果列表选中后执行的操作,这里定义的是打开链接(直接打开百度翻译的网页地址)

      • 渲染结果

        RenderResultListAction(items)
        

    4.TransBaidu类定义

    ​ 根据百度开放平台封装请求即可http://fanyi-api.baidu.com/api/trans/product/apidoc

源码

https://github.com/xinxinmei/transbaidu

参考

http://docs.ulauncher.io/en/latest/extensions/intro.html

http://fanyi-api.baidu.com/api/trans/product/apidoc

你可能感兴趣的:(我的ubuntu,git,插件,ulaucher,ubuntu)