1. 程式人生 > >Android-實現一個簡單的自動翻譯外掛

Android-實現一個簡單的自動翻譯外掛

實現一個簡單的自動翻譯外掛

最近在開發專案是要將Android相關的資源進行國際化,需要將values目錄中所有相關的字串資源(中文),生成匹配的一套英文且儲存在values-en目錄;當然國際化不僅僅是要英文還要提供臺灣等其他語言,這裡為了演示方便,只說下如何實現一個簡單的翻譯成英文的gradle外掛;如果對自定義gradle外掛不瞭解可以參考Android-如何自定義gradle外掛這篇文章

實現思路

因為我們要讀取values下所有需要翻譯等字串(中文)資源;為了方便處理我們將字串資源統一儲存到strings_xxx.xml檔案中,這樣便於後期模組處理。
我們看下處理前values目錄結構
在這裡插入圖片描述


其中strings開頭的xml檔案就是我們要翻譯的資原始檔

我們先簡單看單個檔案如何操作

  1. 讀取xml檔案內容
  2. 將讀取的內容存到一個Map中
  3. 呼叫第三方翻譯API獲取英文
  4. 將英文存入一個新Map中
  5. 如果英文目錄沒有對應到資原始檔直接建立,並將新Map寫入即可
  6. 如果英文目錄有對應的資原始檔,則將英文資源沒有的字串資源追加其中即可

幾個重要的實現方法

1、解析xml

private Map<String, String> parseStringXml(def file) {

        Map<String, String> map = new HashMap<
>() def xmlString = new XmlSlurper().parse(file) xmlString.string.each { map.put("${[email protected]}".toString(), "${it}".toString()) } return map }

2、寫檔案

private void writeFile(File saveFile, Map<String, String> map) {
        /**
         * 如果對應檔案存在,則追加相關資料
         * 否則建立檔案即可
         */
if (saveFile.exists()) { Map<String, String> existMap = parseStringXml(saveFile) def writer = new StringWriter() def xml = new MarkupBuilder(writer) xml.resources() { existMap.each { entry -> string(name: "$entry.key", "$entry.value") } writer.write("\n\n <!--ADD STRING START-->") map.each { entry -> if (!existMap.containsKey("$entry.key".toString())) { string(name: "$entry.key", "$entry.value") } } writer.write("\n <!--ADD STRING END-->\n") } FileWriter fw = new FileWriter(saveFile, false) fw.write(writer.toString()) fw.close() } else { //create file def writer = new StringWriter() def xml = new MarkupBuilder(writer) xml.resources() { map.each { entry -> string(name: "$entry.key", "$entry.value") } } FileWriter fw = new FileWriter(saveFile) fw.write(writer.toString()) fw.close() } }

3、 翻譯

private String translate(String query) {

        String response = com.github.kevinsawicki.http.HttpRequest.post("https://openapi.youdao.com/api",
                http.TranslateHttp.buildRequest(query),
                true).body()

        //Json 解析
        def responseBean = mJsonSlurper.parseText(response)

        String result = ''
        if (responseBean
                && responseBean.web
                && responseBean.web.get(0).value) {
            result = responseBean.web.get(0).value.get(0)
        }

        return result
    }

使用

關於外掛的具體實現以及如何使用可以檢視原始碼自動翻譯外掛

注意:因為不能保證中文都能準確翻譯成英文,所以生成的字串有的為空(此處只是一個參考Demo)

在這裡插入圖片描述