Skip to content

Instantly share code, notes, and snippets.

@ginyolith
Last active September 26, 2019 03:40
Show Gist options
  • Select an option

  • Save ginyolith/a604e49e53f9ec1daa1ac832e5dfa6d0 to your computer and use it in GitHub Desktop.

Select an option

Save ginyolith/a604e49e53f9ec1daa1ac832e5dfa6d0 to your computer and use it in GitHub Desktop.
A parser to converte Android String.xml to CSV file
import java.io.File
data class StringResourceId(private val value: String) {
override fun toString(): String {
return value
}
}
data class StringResource(
val id: StringResourceId,
var jp: String = "",
var en: String = "",
var zhrcn: String = "",
var translatable: Boolean = true
)
val resourcesMap = LinkedHashMap<StringResourceId, StringResource>()
fun File.forEachBindResource(howToBind: (StringResource, String) -> Unit) {
readLines().forEach {
if (!it.contains("<string name=\"")) {
return@forEach
}
val id = StringResourceId("(?<=name\\=\").*?(?=\\\")".toRegex().find(it)!!.value)
val translatable = "(?<=translatable\\=\").*?(?=\\\")".toRegex().find(it)?.value?.toBoolean()
val value = "(?<=\\>).*?(?=\\</string\\>)".toRegex().find(it)!!.value
val res = resourcesMap[id] ?: StringResource(id)
res.translatable = translatable ?: true
howToBind(res, value)
resourcesMap.put(id, res)
}
}
// import Japanese String.xml
File("src/main/res/values-ja/strings.xml").forEachBindResource { stringResource, s ->
stringResource.jp = s
}
// import English String.xml
File("src/main/res/values/strings.xml").forEachBindResource { stringResource, s ->
stringResource.en = s
}
// import chinese hanzi String.xml
File("src/main/res/values-zh-rCN/strings.xml").forEachBindResource { stringResource, s ->
stringResource.zhrcn = s
}
// deserialize
resourcesMap.values.forEach { res ->
res.jp.let { jpRes ->
if ("@string\\/.*".toRegex().matches(jpRes)) {
val referenced = resourcesMap[StringResourceId(jpRes.split("/")[1])]
res.jp = referenced!!.jp
}
}
res.en.let { enRes ->
if ("@string\\/.*".toRegex().matches(enRes)) {
val referenced = resourcesMap[StringResourceId(enRes.split("/")[1])]
res.en = referenced!!.en
}
}
res.zhrcn.let { zhRes ->
if ("@string\\/.*".toRegex().matches(zhRes)) {
val referenced = resourcesMap[StringResourceId(zhRes.split("/")[1])]
res.zhrcn = referenced!!.zhrcn
}
}
}
resourcesMap.values.forEach {
println("${it.id}|${it.jp}|${it.en}|${it.zhrcn}")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment