【安卓脚本】Android工程中文硬编码抽取

99 阅读2分钟

Android 原生工程 中文硬编码抽取

安卓在进行国际化多语言功能时经常会遇到一个头疼的问题,就是在以往的项目中往往存在大量的中文硬编码,这块人工处理非常耗工作量,因此分享一个通用脚本用于模块级别的硬编码抽取,考虑到可能存在很多抽取不准确的情况,因此建议分模块进行抽取,工程级别的可以自行修改脚本实现。

功能支持

  • 支持多个、多种预设映射表,支持拓展
  • java/kotlin代码
  • xml 布局文件
  • kotlin模版字符串
  • 自动生成xmlkey值、防重复策略
  • 自动替换引用
  • 自动导包
  • 生成新增的strings文件内容 拷贝到粘贴板

流程示意

process.jpg

项目地址

项目地址与使用

  1. 初始化配置,配置路径、是否仅扫描等
val modulePath = "E:\\AndroidProject\\LWanAndroid\\commonlib"
// 预设的 中文 - key 映射表
val keyMap = LinkedHashMap<String, String>()
val presetKeyMap = LinkedHashMap<String, String>()

val config = TranslateConfig(presetKeyMap, keyMap, modulePath, false, false)
  1. 配置处理流程 包括 初始化、设置预置key、处理java、kt、XML文件以及结果输出
        val processors = arrayListOf(
        InitProcessor(), // todo:   必须 初始化配置 ,在里面设置翻译实例实现
        PresetKeyProcessor(arrayOf(XMLKeyParser("$modulePath/src/main/res/values/strings.xml"))), // 可选 预设的key值
        XMLFileProcessor(), // 可选 转换 xml 代码
        CodeFileProcessor(filterFileName), // 可选 转换 kotlin、java代码
        ResultOutputProcessor(), // 必须 结果输出,可自行修改为json等格式
//                GenerateEnglishProcessor() // 可选,输出英文
)
  1. 配置预设的key值,默认为模块的strings文件
  (arrayOf(XMLKeyParser("$modulePath/src/main/res/values/strings.xml"))), // 可选 预设的key值
  1. 替换百度翻译api的appid和key,或者自行实现翻译功能,默认提供百度、随机key生成,参考ITranslateAPI和子类
   InitProcessor() // todo:   必须 初始化配置 ,在里面设置翻译实例实现
  1. 配置自动导包的内容,根据项目自行实现
// todo: 根据项目 返回对应的生成的字符串模版
// todo: 根据项目 返回对应自动导入的包
val config = TranslateConfig(presetKeyMap, keyMap, modulePath, { xmlKey: String? ->
    return@TranslateConfig "BaseApplication.getApplication().getString(R.string.$xmlKey)"
},
        importArray = arrayOf("import com.hjl.commonlib.base.BaseApplication", "import com.hjl.commonlib.R")
)

5. 配置需要过滤的代码文件,默认自带log等,具体参考```ICodeStringFilter```和子类实现

```kotlin
// TransCodeUtils.kt
// 代码匹配过滤器
val codeFilter = listOf(NoteCodeFilter(), LogCodeFilter())

  1. 运行Main.kt文件,并可以根据项目需要自行新增processor,例如英文的文件输出
  GenerateEnglishProcessor() // 可选,输出英文XML