需求
- 在使用ubuntu系统的时候,迫切想要一款替代windows下wox的启动器应用。最终选择了ulaucher,在使用ulaucher过程中,由于本人英语水平不高时长有翻译英语单词的需求,在官方的插件库里有找不到合适的。所以自己打算写一款插件
实现
工作原理
- ulaucher 的基本工作原理事件订阅。keyword+空格会产生相应的KeywordQueryEvent事件,事件对应的订阅者就会处理事件,处理结果会被封装在RenderResultListAction中交由ulaucher app 渲染。
- App 与扩展的工作关系是事件处理机制,扩展向APP注册事件和事件处理程序,APP发起对应事件,事件处理器处理事件,事件结果封装为动作,APP相应动作
- 基本原理涉及:事件抽象,事件处理抽象,动作抽象。
设计思路
- 利用百度翻译提供的免费通用翻译api来实现翻译的操作
- 获取事件中的参数(作为待翻译文本)、封装api请求、处理结果
- api请求的相关平台配置通过app提供的preferences注入
- 提取结果中的翻译结果
代码实现
-
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