初步編寫IDEA\AndroidStudio翻譯插件的方法
聲明:作者是根據(jù) Hongyang的博客自己實(shí)踐之后,根據(jù)自己的理解寫的,有什么不對(duì)的地方還望指正。
先放兩張效果圖

一、準(zhǔn)備
- 由于AndroidStudio不具備開發(fā)插件的功能,需要安裝IDEA
- 翻譯使用的是有道的翻譯接口,需要申請(qǐng),接口申請(qǐng)的網(wǎng)址點(diǎn)這里
- json解析使用的是GSON
二、創(chuàng)建工程
在此處創(chuàng)建的plugin工程,如下圖所示
填寫完工程名之后, 創(chuàng)建的工程結(jié)構(gòu)如下所示
其中plugin.xml就和j2ee中web.xml功能類似,是配置插件屬性的地方。
三、擼代碼
首先,new一個(gè)Action,在彈出界面簡(jiǎn)單填寫類的信息,如下圖
其中第一部分是類相關(guān)的信息,ActionID表示一個(gè)獨(dú)一無(wú)二的名字,就像Android清單文件中的包名一樣。
第二部分是將這個(gè)功能添加到哪個(gè)菜單中去,當(dāng)前選擇的是添加到Edit菜單中并且作為第一個(gè)子菜單。
第三部分是這個(gè)功能的快捷鍵,可將光標(biāo)置于輸入框內(nèi),點(diǎn)擊鍵盤進(jìn)行輸入
可以看到在生成的類中有public void actionPerformed(AnActionEvent e) 這個(gè)方法,關(guān)鍵的地方就在這個(gè)方法中,在IDE中幾乎所有操作都可以在此方法中捕捉到。如下圖
首先獲取選中的文字,調(diào)用以下api
final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
if (null == mEditor) {
return;
}
SelectionModel model = mEditor.getSelectionModel();
final String selectedText = model.getSelectedText();
if (TextUtils.isEmpty(selectedText)) {
return;
}
獲取到選中的文字之后,就可以調(diào)用申請(qǐng)到的有道翻譯接口進(jìn)行翻譯,要翻譯的文本,必須是UTF-8編碼,字符長(zhǎng)度不能超過200個(gè)字符,需要進(jìn)行urlencode編碼。翻譯完成之后就可以以一個(gè)類似popupWindow的窗口將接口展示出來(lái)了。
private void showPopupBalloon(final Editor editor, final String result) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
JBPopupFactory factory = JBPopupFactory.getInstance();
factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
.setFadeoutTime(5000)
.createBalloon()
.show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
}
});
}
點(diǎn)擊綠色運(yùn)行按鈕,測(cè)試成功后就可以生成安裝包了。在Build菜單中選擇 Prepare Plugin Module ‘your project name' For Deployment就可以生成安裝包了。
我只是為了自己用,所以沒有在plugin.xml文件中添加更多的詳細(xì)信息,至于怎么發(fā)布到插件庫(kù),還請(qǐng)大家自行google,下面是完整的代碼。點(diǎn)擊這里下載我編譯好的插件,zip格式的。
完整代碼如下:
action 類
import com.google.gson.Gson;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.ui.JBColor;
import org.apache.http.util.TextUtils;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
/**
* Created by huangyuan on 16-7-16.
*/
public class TranslateAction extends AnAction {
//有道翻譯接口
private String translateUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=AS-TranslatePlugin&key=your key&type=data&doctype=json&version=1.1&q=%s";
public void actionPerformed(AnActionEvent e) {
final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
if (null == mEditor) {
return;
}
SelectionModel model = mEditor.getSelectionModel();
//獲取選中的文字
final String selectedText = model.getSelectedText();
if (TextUtils.isEmpty(selectedText)) {
return;
}
// Messages.showMessageDialog(selectedText, "選中的文字", Messages.getInformationIcon());
TranslateBean translateBean = doTranslate(selectedText);
showPopupBalloon(mEditor,translateBean.toString());
}
/**
*
* @param translateText 需要翻譯的文本
* @return TranslateBean 翻譯完成后轉(zhuǎn)換為對(duì)象
* 調(diào)用翻譯接口,將返回的數(shù)據(jù)用Gson封裝為對(duì)象
*/
private TranslateBean doTranslate(String translateText) {
Gson gson = new Gson();
InputStream is = null;
StringBuffer resultData = new StringBuffer();
try {
URL url = new URL(String.format(translateUrl, URLEncoder.encode(translateText,"utf-8")));
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setDoInput(true); //允許輸入流,即允許下載
httpURLConnection.setDoOutput(true); //允許輸出流,即允許上傳
httpURLConnection.setUseCaches(false); //不使用緩沖
httpURLConnection.setRequestMethod("GET"); //使用get請(qǐng)求
is = httpURLConnection.getInputStream(); //獲取輸入流,此時(shí)才真正建立鏈接
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bufferReader = new BufferedReader(isr);
String inputLine = "";
while((inputLine = bufferReader.readLine()) != null){
resultData.append(inputLine);
}
System.out.println(resultData.toString());
TranslateBean translateBean = gson.fromJson(resultData.toString(), TranslateBean.class);
return translateBean;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
*
* @param editor Edit
* @param result 要展示的文字
* 以類似popupwindow的形式展示,別問我為什么這么寫,我也不知道,我是抄的api
*/
private void showPopupBalloon(final Editor editor, final String result) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
JBPopupFactory factory = JBPopupFactory.getInstance();
factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
.setFadeoutTime(5000)
.createBalloon()
.show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
}
});
}
}
TranslateBean
import java.util.List;
/**
* Created by huangyuan on 16-7-17.
*/
public class TranslateBean {
private BasicBean basic;
private String query;
private int errorCode;
private List<String> translation;
private List<WebBean> web;
public BasicBean getBasic() {
return basic;
}
public void setBasic(BasicBean basic) {
this.basic = basic;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public List<String> getTranslation() {
return translation;
}
public void setTranslation(List<String> translation) {
this.translation = translation;
}
public List<WebBean> getWeb() {
return web;
}
public void setWeb(List<WebBean> web) {
this.web = web;
}
public static class BasicBean {
private List<String> explains;
private String phonetic;
public String getPhonetic() {
return phonetic;
}
public void setPhonetic(String phonetic) {
this.phonetic = phonetic;
}
public List<String> getExplains() {
return explains;
}
public void setExplains(List<String> explains) {
this.explains = explains;
}
}
public static class WebBean {
private String key;
private List<String> value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public List<String> getValue() {
return value;
}
public void setValue(List<String> value) {
this.value = value;
}
}
@Override
public String toString() {
StringBuffer webStringBuffer = new StringBuffer();
for(int i =0;i<web.size();i++)
{
webStringBuffer.append(web.get(i).getKey() +":\t");
for(int j =0 ;j<web.get(i).getValue().size();j++)
{
webStringBuffer.append(web.get(i).getValue().get(j));
}
webStringBuffer.append("\n");
}
StringBuffer translateBuffer = new StringBuffer();
for(int i = 0;i<basic.getExplains().size();i++)
{
translateBuffer.append(basic.getExplains().get(i) +"\n");
}
return query +"\n" + basic.getPhonetic() +"\n" + translateBuffer.toString() +"\n網(wǎng)絡(luò)釋義+\n" + webStringBuffer.toString();
}
}
到此這篇關(guān)于初步編寫IDEA\AndroidStudio翻譯插件的文章就介紹到這了,更多相關(guān)IDEA AndroidStudio翻譯插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-08-08
Android編程實(shí)現(xiàn)開始及停止service的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)開始及停止service的方法,涉及Android針對(duì)service的開始、停止、綁定等操作相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2016-01-01
Android 中 Fragment 嵌套 Fragment使用存在的bug附完美解決方案
本文從兩個(gè)方面淺析Android 中 Fragment 嵌套 Fragment使用存在的bug問題,原因找到就可以完美的解決了,對(duì)fragment嵌套fragment使用相關(guān)知識(shí)感興趣的朋友一起看看吧2016-08-08
Android Studio不能獲取遠(yuǎn)程依賴包的完美解決方法
這篇文章主要介紹了Android Studio不能獲取遠(yuǎn)程依賴包的解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11
Android將Xamarin For VS升級(jí)為4.1.0.530版教程
這篇文章主要介紹了Android將Xamarin For VS升級(jí)為4.1.0.530版的圖文教程,感興趣的小伙伴們可以參考一下2016-06-06
Kotlin中ListView與RecyclerView的應(yīng)用講解
這篇文章主要介紹了Kotlin中ListView與RecyclerView的應(yīng)用講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Android Map新用法:MapFragment應(yīng)用介紹
MapView ,MapActivity 這種的局限在于,必須要繼承MapActivity,否則無(wú)法使用MapView,但是,MapFragment 這種的局限在于,必須要安裝Google Play Service ,也就是說必須是原生rom。而且sdk要在12以上2013-01-01
Android 文件夾顯示紅色嘆號(hào)的解決方法(必看)
下面小編就為大家?guī)?lái)一篇Android 文件夾顯示紅色嘆號(hào)的解決方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-04-04

