初步編寫IDEA\AndroidStudio翻譯插件的方法
聲明:作者是根據(jù) Hongyang的博客自己實(shí)踐之后,根據(jù)自己的理解寫的,有什么不對的地方還望指正。
先放兩張效果圖
一、準(zhǔn)備
- 由于AndroidStudio不具備開發(fā)插件的功能,需要安裝IDEA
- 翻譯使用的是有道的翻譯接口,需要申請,接口申請的網(wǎng)址點(diǎn)這里
- json解析使用的是GSON
二、創(chuàng)建工程
在此處創(chuàng)建的plugin工程,如下圖所示
填寫完工程名之后, 創(chuàng)建的工程結(jié)構(gòu)如下所示
其中plugin.xml就和j2ee中web.xml功能類似,是配置插件屬性的地方。
三、擼代碼
首先,new一個(gè)Action,在彈出界面簡單填寫類的信息,如下圖
其中第一部分是類相關(guān)的信息,ActionID表示一個(gè)獨(dú)一無二的名字,就像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)用申請到的有道翻譯接口進(jìn)行翻譯,要翻譯的文本,必須是UTF-8編碼,字符長度不能超過200個(gè)字符,需要進(jìn)行urlencode編碼。翻譯完成之后就可以以一個(gè)類似popupWindow的窗口將接口展示出來了。
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)行按鈕,測試成功后就可以生成安裝包了。在Build菜單中選擇 Prepare Plugin Module ‘your project name' For Deployment就可以生成安裝包了。
我只是為了自己用,所以沒有在plugin.xml文件中添加更多的詳細(xì)信息,至于怎么發(fā)布到插件庫,還請大家自行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)換為對象 * 調(diào)用翻譯接口,將返回的數(shù)據(jù)用Gson封裝為對象 */ 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請求 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android神兵利器之Image Asset Studio的實(shí)現(xiàn)
這篇文章主要介紹了Android神兵利器之Image Asset Studio的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Android通知欄微技巧一些需要注意的小細(xì)節(jié)
這篇文章主要介紹了Android通知欄微技巧,那些你所沒關(guān)注過的小細(xì)節(jié),小編把此文分享到腳本之家平臺(tái),需要的朋友可以參考下2018-04-04Android scheme 跳轉(zhuǎn)的設(shè)計(jì)與實(shí)現(xiàn)詳解
這篇文章主要介紹了Android scheme 跳轉(zhuǎn)的設(shè)計(jì)與實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android權(quán)限操作之uses-permission詳解
這篇文章主要介紹了Android權(quán)限操作之uses-permission,較為詳細(xì)的分析了uses-permission常見權(quán)限操作類型與功能,需要的朋友可以參考下2016-10-10Android中監(jiān)聽軟鍵盤顯示狀態(tài)實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中監(jiān)聽軟鍵盤顯示狀態(tài)實(shí)現(xiàn)代碼,本文直接給出核心實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04Android的HTTP類庫Volley入門學(xué)習(xí)教程
這篇文章主要介紹了Android應(yīng)用開發(fā)框架Volley的入門學(xué)習(xí)教程,Volley適合于輕量級(jí)的通信功能開發(fā),善于處理JSON對象,需要的朋友可以參考下2016-02-02Android中DrawerLayout+ViewPager滑動(dòng)沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中DrawerLayout+ViewPager滑動(dòng)沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06