Android-实现一个简单的自动翻译插件

目录

  • 实现一个简单的自动翻译插件
    • 实现思路
    • 几个重要的实现方法
      • 1、解析xml
      • 2、写文件
      • 3、 翻译
    • 使用

实现一个简单的自动翻译插件

最近在开发项目是要将Android相关的资源进行国际化,需要将values目录中所有相关的字符串资源(中文),生成匹配的一套英文且保存在values-en目录;当然国际化不仅仅是要英文还要提供台湾等其他语言,这里为了演示方便,只说下如何实现一个简单的翻译成英文的gradle插件;如果对自定义gradle插件不了解可以参考Android-如何自定义gradle插件这篇文章

实现思路

因为我们要读取values下所有需要翻译等字符串(中文)资源;为了方便处理我们将字符串资源统一保存到strings_xxx.xml文件中,这样便于后期模块处理。
我们看下处理前values目录结构
Android-实现一个简单的自动翻译插件_第1张图片
其中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("${it.@name}".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  ")
                map.each { entry ->

                    if (!existMap.containsKey("$entry.key".toString())) {
                        string(name: "$entry.key", "$entry.value")
                    }
                }
                writer.write("\n  \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、 翻译

翻译操作调用有道api,现在貌似收费了,我是借鉴别人的代码(https://github.com/zyj1609wz/AndroidPluginTranslate/blob/master/src/util/HttpManager.java)实现的

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)

Android-实现一个简单的自动翻译插件_第2张图片

你可能感兴趣的:(android开发,随笔)