Skip to content

Instantly share code, notes, and snippets.

@fourlastor
Last active October 15, 2025 08:08
Show Gist options
  • Select an option

  • Save fourlastor/247f2cea46ca6aee37d4375e9049f796 to your computer and use it in GitHub Desktop.

Select an option

Save fourlastor/247f2cea46ca6aee37d4375e9049f796 to your computer and use it in GitHub Desktop.
Create constants for translation files
abstract class GenerateStrings : DefaultTask() {
@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()) {
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("com.pkmngen.game", stringsSpec).build()
.writeTo(it)
}
}
}
// build gradle for the module where the task is used
var generateStrings = tasks.register("generateStrings", GenerateStrings.class) {
propertiesDir.set(rootProject.file("assets/i18n"))
}
compileJava.dependsOn(generateStrings)
sourceSets {
main {
java {
srcDir(generateStrings)
}
}
}
// build gradle for the task sources
buildscript {
repositories {
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.9.10'
}
repositories {
mavenCentral()
}
dependencies {
implementation('com.squareup:javapoet:1.13.0')
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment