Gradle plugin for generating localization files for Android and small Kotlin Multiplatform projects
This gradle plugin provides gradle tasks to generate localization files either from local csv
files or from Google Sheets.
The plugin does nothing else than providing those tasks. Setting them up and triggering them is up to the project which includes this plugin.
Currently, only string resources are supported.
The plugins Multiplatform tasks are really only suited for small Kotlin Multiplatform projects as they generate a single global object
holding all translations. Which means upon first usage of a translation, all translations are kept in memory for the whole lifetime of the application.
The aim these tasks for Kotlin Multiplatform projects at the moment is just ease of use for translations used in common code. There are plans however to improve this so this plugin can also be used for big Kotlin Multiplatform projects where one want's to use translations in common code.
These limitations do not apply to the android specific tasks where normal xml string resources are generated instead.
-
Add the plugin to your
plugins
block insidebuild.gradle.kts
:plugins { id("ch.hippmann.localizer") version "1.0.1" }
-
Configure the tasks you want to use:
tasks { val generateTranslations by registering(GenerateAndroidStringLocalizationFromGoogleSheetsTask::class) { group = "myProject" // define a group so the task can be found more easily on the gradle tasks tab in the IDE sheetId.set("<sheet-id>") // provide the google sheets id (can be found in the url of the sheet) sheetIndex.set(0) srcRoot.set(projectDir.resolve("src")) throwIfDownloadFailed.set(true) baseLanguage.set("en") } build { // execute translations task on each build dependsOn(generateTranslations) } }
DownloadGoogleSheetsAsCsvTask
: Downloads a google sheet to a specified locationGenerateAndroidStringLocalizationFromCsvFileTask
: Generates xml string res files from a local csv fileGenerateAndroidStringLocalizationFromGoogleSheetsTask
: Generates xml string res files from google sheetsGenerateMultiplatformStringLocalizationFromCsvFileTask
: Generates a translation fileobject
from a local csv fileGenerateMultiplatformStringLocalizationFromGoogleSheetsTask
: Generates a translation fileobject
from google sheets
If you use a google sheets, it has to be shared to "Anyone with this link" with viewer permissions.
The following formatting rules must be met by the source csv
file or google sheets:
- The first row is considered to be the header row.
- There must be the following columns present:
key
platform
: valid values are:both
,android
,ios
- each language as separate column (ex.
en
,de
,de-ch
,fr
,fr-ch
) - the language columns must come after the
platform
column
Example of a valid format:
key | platform | en | de |
---|---|---|---|
app_name | both | My cool App | Meine coole App |
Note: Between the columns key
and platform
you are free to define any additional columns you want. For example a description
column. These additional columns will just be ignored.
To be able to test the plugin with a local build, one needs to execute publishToMavenLocal
and add the following to
the top of the app's settings.gradle.kts
file:
Gradle KTS:
// without this doing:
// plugin { id("ch.hippmann.localizer") version "1.0.1-SNAPSHOT" }
// won't work as gradle does not know how to map the plugin id to an actual artifact.
// this is only required when trying out local builds. Comment this out when trying out a plugin published
// in the gradle plugin portal.
pluginManagement {
repositories {
mavenLocal()
jcenter()
gradlePluginPortal()
}
resolutionStrategy.eachPlugin {
when (requested.id.id) {
"ch.hippmann.localizer" -> useModule("ch.hippmann:localizer:${requested.version}")
}
}
}
Gradle groovy:
// without this doing:
// plugin { id "ch.hippmann.localizer" version "1.0.1-SNAPSHOT" }
// won't work as gradle does not know how to map the plugin id to an actual artifact.
// this is only required when trying out local builds. Comment this out when trying out a plugin published
// in the gradle plugin portal.
pluginManagement {
repositories {
mavenLocal()
jcenter()
gradlePluginPortal()
}
resolutionStrategy.eachPlugin {
if (requested.id.id == "ch.hippmann.localizer") {
useModule("ch.hippmann:localizer:" + requested.version)
}
}
}