1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > intellij idea实现代码实时翻译的插件开发

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

时间:2020-03-07 13:26:23

相关推荐

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

需求

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

项目地址

GitHub

JetBrain

触发方式

触发方式有两个,第一是全局的,与Application的生命周期绑定。主要是监听用户的双击事件,当选中单词后自动触发翻译。

1. 定义Component,初始化时注册需要的监听。这里主要监听用户鼠标动作和文本的选中。

public class DictionaryComponent implements ApplicationComponent {private QueryListener queryListener;public DictionaryComponent() {}@Overridepublic void initComponent() {queryListener = new QueryListener();EditorEventMulticaster eventMulticaster = EditorFactory.getInstance().getEventMulticaster();eventMulticaster.addEditorMouseListener(queryListener);}@Overridepublic void disposeComponent() {}@Override@NotNullpublic String getComponentName() {return "DictionaryComponent";}}

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

public class TransSelectedAction extends AnAction {@Overridepublic 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 {@Overridepublic 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);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。