Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 初步編寫IDEA\AndroidStudio翻譯插件

初步編寫IDEA\AndroidStudio翻譯插件

編輯:關於Android編程

先放兩張效果圖
en2cn cn2en

一、准備

由於AndroidStudio不具備開發插件的功能,需要安裝IDEA 翻譯使用的是有道的翻譯接口,需要申請,接口申請的網址點這裡 json解析使用的是GSON

二、創建工程

在此處創建的plugin工程,如下圖所示
左側選擇Itellij Platform Plugin
填寫完工程名之後, 創建的工程結構如下所示
這裡寫圖片描述
其中plugin.xml就和j2ee中web.xml功能類似,是配置插件屬性的地方。

三、撸代碼

首先,new一個Action,在彈出界面簡單填寫類的信息,如下圖
這裡寫圖片描述
其中第一部分是類相關的信息,ActionID表示一個獨一無二的名字,就像Android清單文件中的包名一樣。
第二部分是將這個功能添加到哪個菜單中去,當前選擇的是添加到Edit菜單中並且作為第一個子菜單。
第三部分是這個功能的快捷鍵,可將光標置於輸入框內,點擊鍵盤進行輸入
可以看到在生成的類中有public void actionPerformed(AnActionEvent e) 這個方法,關鍵的地方就在這個方法中,在IDE中幾乎所有操作都可以在此方法中捕捉到。如下圖
actionPerformed(AnActionEvent e)
首先獲取選中的文字,調用以下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;
        }

獲取到選中的文字之後,就可以調用申請到的有道翻譯接口進行翻譯,要翻譯的文本,必須是UTF-8編碼,字符長度不能超過200個字符,需要進行urlencode編碼。翻譯完成之後就可以以一個類似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);
            }
        });
    }

點擊綠色運行按鈕,測試成功後就可以生成安裝包了。在Build菜單中選擇 Prepare Plugin Module ‘your project name’ For Deployment就可以生成安裝包了。
我只是為了自己用,所以沒有在plugin.xml文件中添加更多的詳細信息,至於怎麼發布到插件庫,還請大家自行google,下面是完整的代碼。點擊這裡下載我編譯好的插件,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 翻譯完成後轉換為對象
     * 調用翻譯接口,將返回的數據用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();   //獲取輸入流,此時才真正建立鏈接
            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 translation;
    private List 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 getTranslation() {
        return translation;
    }

    public void setTranslation(List translation) {
        this.translation = translation;
    }

    public List getWeb() {
        return web;
    }

    public void setWeb(List web) {
        this.web = web;
    }

    public static class BasicBean {
        private List explains;
        private String phonetic;

        public String getPhonetic() {
            return phonetic;
        }

        public void setPhonetic(String phonetic) {
            this.phonetic = phonetic;
        }

        public List getExplains() {
            return explains;
        }

        public void setExplains(List explains) {
            this.explains = explains;
        }
    }

    public static class WebBean {
        private String key;
        private List value;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public List getValue() {
            return value;
        }

        public void setValue(List value) {
            this.value = value;
        }

    }

    @Override
    public String toString() {

        StringBuffer webStringBuffer = new StringBuffer();

        for(int i =0;i
        
   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved