diff options
author | Harsh Shandilya <me@msfjarvis.dev> | 2020-12-30 15:36:51 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-30 11:06:51 +0100 |
commit | 1a774eae23e6965266baf0152fcfe5bbd7baf9f7 (patch) | |
tree | b7ed4681642a768f9f8b116e40de46cb6a845546 /buildSrc | |
parent | c15594b045ad035b2026a201acd2a89e3962de4d (diff) |
Automate Crowdin localisation sync (#1265)
* build: add a Gradle plugin for Crowdin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* build/crowdin: add skipCleanup extension property
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* build/crowdin: also handle nonFree source set
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* build/crowdin: fixup directory names for nonFree variant
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* app: sync translations from Crowdin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* github: add Crowdin sync workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
Diffstat (limited to 'buildSrc')
-rw-r--r-- | buildSrc/build.gradle.kts | 5 | ||||
-rw-r--r-- | buildSrc/buildDependencies.gradle | 2 | ||||
-rw-r--r-- | buildSrc/src/main/java/CrowdinDownloadPlugin.kt | 76 | ||||
-rw-r--r-- | buildSrc/src/main/java/CrowdinExtension.kt | 19 |
4 files changed, 102 insertions, 0 deletions
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 47f8aecf..3b719a63 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -21,6 +21,10 @@ gradlePlugin { id = "aps-plugin" implementationClass = "PasswordStorePlugin" } + register("crowdin") { + id = "crowdin-plugin" + implementationClass = "CrowdinDownloadPlugin" + } } } @@ -28,4 +32,5 @@ dependencies { implementation(build.getValue("kotlinGradlePlugin")) implementation(build.getValue("androidGradlePlugin")) implementation(build.getValue("binaryCompatibilityValidator")) + implementation(build.getValue("downloadTaskPlugin")) } diff --git a/buildSrc/buildDependencies.gradle b/buildSrc/buildDependencies.gradle index b7a2f758..dd246fbe 100644 --- a/buildSrc/buildDependencies.gradle +++ b/buildSrc/buildDependencies.gradle @@ -2,10 +2,12 @@ rootProject.ext.versions = [ agp : '4.1.0', kotlin : '1.4.21', binary_compatibility_validator : '0.2.4', + download_plugin : '4.1.1', ] rootProject.ext.build = [ androidGradlePlugin : "com.android.tools.build:gradle:${versions.agp}", kotlinGradlePlugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}", binaryCompatibilityValidator : "org.jetbrains.kotlinx:binary-compatibility-validator:${versions.binary_compatibility_validator}", + downloadTaskPlugin : "de.undercouch:gradle-download-task:${versions.download_plugin}", ] diff --git a/buildSrc/src/main/java/CrowdinDownloadPlugin.kt b/buildSrc/src/main/java/CrowdinDownloadPlugin.kt new file mode 100644 index 00000000..7261eec0 --- /dev/null +++ b/buildSrc/src/main/java/CrowdinDownloadPlugin.kt @@ -0,0 +1,76 @@ +/* + * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +import de.undercouch.gradle.tasks.download.Download +import java.io.File +import org.gradle.api.GradleException +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.Copy +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.register + +class CrowdinDownloadPlugin : Plugin<Project> { + + override fun apply(project: Project) { + with(project) { + val extension = extensions.create<CrowdinExtension>("crowdin") + afterEvaluate { + val projectName = extension.projectName + if (projectName.isEmpty()) { + throw GradleException( + """ + Applying `crowdin-plugin` requires a projectName to be configured via the "crowdin" extension. + """.trimIndent() + ) + } + tasks.register<Download>("downloadCrowdin") { + src("https://crowdin.com/backend/download/project/$projectName.zip") + dest("$buildDir/translations.zip") + overwrite(true) + } + tasks.register<Copy>("extractCrowdin") { + setDependsOn(setOf("downloadCrowdin")) + doFirst { + File(buildDir, "translations").deleteRecursively() + } + from(zipTree("$buildDir/translations.zip")) + into("$buildDir/translations") + } + tasks.register<Copy>("extractBaseStrings") { + setDependsOn(setOf("extractCrowdin")) + from("$buildDir/translations/${project.name}/src/main/res") + into("${projectDir}/src/main/res") + } + tasks.register<Copy>("extractNonFreeStrings") { + setDependsOn(setOf("extractCrowdin")) + from("$buildDir/translations/") { + exclude("app/") + } + into("$buildDir/nonFree-translations") + doLast { + File("$buildDir/nonFree-translations") + .listFiles { file: File -> file.isDirectory }?.forEach { file -> + val dest = File("${projectDir}/src/nonFree/values-${file.name}") + val src = File(file, "app/src/nonFree/res/values/strings.xml") + dest.mkdirs() + src.renameTo(File(dest, "strings.xml")) + } + } + } + tasks.register("crowdin") { + setDependsOn(setOf("extractBaseStrings", "extractNonFreeStrings")) + if (!extension.skipCleanup) { + doLast { + File("$buildDir/translations").deleteRecursively() + File("$buildDir/nonFree-translations").deleteRecursively() + File("$buildDir/translations.zip").delete() + } + } + } + } + } + } +} diff --git a/buildSrc/src/main/java/CrowdinExtension.kt b/buildSrc/src/main/java/CrowdinExtension.kt new file mode 100644 index 00000000..a95aede0 --- /dev/null +++ b/buildSrc/src/main/java/CrowdinExtension.kt @@ -0,0 +1,19 @@ +/* + * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +open class CrowdinExtension { + + /** + * Configure the project name on Crowdin + */ + open var projectName = "" + + /** + * Don't delete downloaded and extracted translation archives from build directory. + * + * Useful for debugging. + */ + open var skipCleanup = false +} |