LocalesConfigPlugin.kt 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import org.gradle.api.Project
  2. import org.gradle.api.Task
  3. import org.gradle.api.tasks.TaskProvider
  4. import org.gradle.kotlin.dsl.TaskContainerScope
  5. private val emptyResourcesElement = "<resources>\\s*</resources>|<resources/>".toRegex()
  6. private val valuesPrefix = "values(-(b\\+)?)?".toRegex()
  7. fun TaskContainerScope.registerLocalesConfigTask(project: Project): TaskProvider<Task> {
  8. return with(project) {
  9. register("generateLocalesConfig") {
  10. val languages = fileTree("$projectDir/src/main/res/")
  11. .matching { include("**/strings.xml") }
  12. .filterNot { it.readText().contains(emptyResourcesElement) }
  13. .map { it.parentFile.name }
  14. .sorted()
  15. .joinToString(separator = "\n") {
  16. val language = it
  17. .replace(valuesPrefix, "")
  18. .replace("-r", "-")
  19. .replace("+", "-")
  20. .takeIf(String::isNotBlank) ?: "en"
  21. " <locale android:name=\"$language\"/>"
  22. }
  23. val content = """
  24. <?xml version="1.0" encoding="utf-8"?>
  25. <locale-config xmlns:android="http://schemas.android.com/apk/res/android">
  26. $languages
  27. </locale-config>
  28. """.trimIndent()
  29. val localeFile = file("$projectDir/src/main/res/xml/locales_config.xml")
  30. localeFile.parentFile.mkdirs()
  31. localeFile.writeText(content)
  32. }
  33. }
  34. }