Last active
September 26, 2019 03:40
-
-
Save ginyolith/a604e49e53f9ec1daa1ac832e5dfa6d0 to your computer and use it in GitHub Desktop.
A parser to converte Android String.xml to CSV file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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