intellij idea实现代码实时翻译的插件开发

需求

因为有时候追源码需要看很多的注释,经常遇到生词也是不可避免的。所以一直希望能有一个像chrome中的翰林词典 那样的,双击即翻译的插件,后来寻寻觅觅没什么符合需求了,就考虑自己写了个。因为网上intellij插件开发相关的资料不是很多,基本都从jetbrain哪摘抄的那几个。自己基本上可以说是从0开始了,中间也遇到不少问题。但是官方社区是个好东西呀!解决了不少问题。下面也不瞎BB了,说下主要的过程。

项目地址

GitHub
JetBrain

触发方式

触发方式有两个,第一是全局的,与Application的生命周期绑定。主要是监听用户的双击事件,当选中单词后自动触发翻译。
1. 定义Component,初始化时注册需要的监听。这里主要监听用户鼠标动作和文本的选中。

public class DictionaryComponent implements ApplicationComponent {
    private QueryListener queryListener;

    public DictionaryComponent() {
    }

    @Override
    public void initComponent() {
        queryListener = new QueryListener();
        EditorEventMulticaster eventMulticaster = EditorFactory.getInstance().getEventMulticaster();
        eventMulticaster.addEditorMouseListener(queryListener);
    }

    @Override
    public void disposeComponent() {
    }

    @Override
    @NotNull
    public String getComponentName() {
        return "DictionaryComponent";
    }

}

2.定义手动触发Action,这也是最常用的插件开发功能,很多地方都有描述,这里不再详述了,具体可以参考。这里主要定义了一个action,实现句子的翻译和非第三方源码的翻译,因为考虑到非第三方库可能是不需要翻译的(因为都是自己或者自己人写的),所以并没在上面第一种的全局监听中处理这种事件,但是设置为可以手动触发。

public class TransSelectedAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent e) {
        Editor editor=e.getData(PlatformDataKeys.EDITOR);
        String selectedWord=editor.getSelectionModel().getSelectedText();
        if(TextUtils.isEmpty(selectedWord)) return;
        TransManager.getInstance().translate(selectedWord,editor);
    }
}

action的注册

<action id="TranslateSelectedAction" class="TransSelectedAction" text="translate selected"
            description="translate selected">
      <add-to-group group-id="ToolsMenu" anchor="first"/>
      <keyboard-shortcut keymap="$default" first-keystroke="alt shift Q"/>
    </action>

上述的非第三方源码,简单的说就是指自己可以编辑的代码。而像framework层的源码,引用的依赖库的源码等,虽然自己可以看都是不可以编辑的。在判断选中的文字是否直接翻译的时候,也是用的这种方法。下面的代码中会体现出来。

翻译

QueryListener这里只贴出来了用到的回调,其中是根据得到的document的是否可编辑来判断是否翻译。

public class QueryListener implements EditorMouseListener {

    @Override
    public void mouseClicked(EditorMouseEvent editorMouseEvent) {
        Editor editor = editorMouseEvent.getEditor();
        Document document = editor.getDocument();
        //如果是不可编辑的,不做处理,以此来区分是否为第三方源码
        if (document.isWritable()) {
            return;
        }
        String selectedText = editorMouseEvent.getEditor().getSelectionModel().getSelectedText();
        if(TextUtils.isEmpty(selectedText)) return;
        if(selectedText.contains(" ")) return;
        TransManager.getInstance().translate(selectedText,editor);
    }
}

具体翻译的实现

翻译是申请了百度,有道的api。在处理翻译字段时候,还针对下划线,驼峰式命名,做了一些处理,这里就不详述了。

public void translate(String text, Editor editor) {
        if (TextUtils.isEmpty(text)) return;
        //出去特殊符号
        text = text.replaceAll("[^a-z^A-Z^0-9^ ^_^(^)]", "");
        if (TextUtils.isBlank(text) || text.length() < 2) return;
        //如果包含空格直接按照句子翻译
        if (text.contains(" ")) {
            translateParagraph(text, editor);
            return;
        }
        //下划线式命名拆分
        if (text.contains("_")) {
            translateParagraph(text.replaceAll("_", " "), editor);
            return;
        }
        //如果不包含大写字母直接翻译
        if (!containsUpperCase(text)) {
            queryWord(text, editor);
            return;
        }
        //如果包含大写字母,判断如果是驼峰式命名,拆分单词
        text = parseWord(text);
        if (text.contains(" ")) {
            translateParagraph(text, editor);
            return;
        }
        queryWord(text, editor);

    }
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值