Skip to content

Instantly share code, notes, and snippets.

@fourlastor
Created October 5, 2023 08:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fourlastor/79e9c4b8bc31af6264b04b96a107bd9b to your computer and use it in GitHub Desktop.
Save fourlastor/79e9c4b8bc31af6264b04b96a107bd9b to your computer and use it in GitHub Desktop.
Generate strings from translation files
package io.github.fourlastor
import com.squareup.javapoet.AnnotationSpec
import com.squareup.javapoet.FieldSpec
import com.squareup.javapoet.JavaFile
import com.squareup.javapoet.MethodSpec
import com.squareup.javapoet.TypeSpec
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import java.util.Properties
import javax.lang.model.element.Modifier
abstract class GenerateStrings : DefaultTask() {
companion object {
private val PROBLEMATIC_NAMES = setOf(
"return",
"default",
"hakamo-o",
"jangmo-o",
"ho-oh",
"porygon-z",
"kommo-o",
"switch",
"10_000_000_volt_thunderbolt"
)
}
@get:InputDirectory
abstract val propertiesDir: DirectoryProperty
@get:OutputDirectory
abstract val destination: DirectoryProperty
init {
destination.convention(project.layout.buildDirectory.dir("generated/sources/strings"))
}
@TaskAction
fun run() {
val propertiesDir = propertiesDir.asFile.get()
val propertiesFiles = propertiesDir.walkTopDown()
.filter { it.isFile && it.extension == "properties" && !it.name.contains("_", ignoreCase = true) }
val stringsSpec = TypeSpec.classBuilder("R")
.addAnnotation(AnnotationSpec.builder(SuppressWarnings::class.java).addMember("value", "\$S", "unused").build())
.addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build())
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.apply {
for (propertiesFile in propertiesFiles) {
addType(
TypeSpec.classBuilder( propertiesFile.getName().replace(".properties", ""))
.addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build())
.addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC)
.apply {
val properties = Properties().apply { load(propertiesFile.reader()) }
for (propertyName in properties.propertyNames()) {
if (propertyName in PROBLEMATIC_NAMES) {
continue
}
addField(FieldSpec.builder(
String::class.java, propertyName.toString(), Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL
).initializer("\$S", propertyName.toString())
.build())
}
}
.build()
)
}
}
.build()
val outputFile = destination.asFile.get().resolve("com/pkmngen/game/R.java")
if (!outputFile.exists()) {
outputFile.getParentFile().mkdirs()
}
outputFile.writer().use {
JavaFile.builder("io.github.fourlastor", stringsSpec).build()
.writeTo(it)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment