Enhance string formatter, add tests to validate translations

This commit is contained in:
Syer10
2021-06-23 14:08:44 -04:00
parent db85974f26
commit c5aaa5e6fa
15 changed files with 163 additions and 72 deletions

42
.github/workflows/Check.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Validate
on:
push:
branches:
- master
pull_request:
jobs:
check_wrapper:
name: Validate Gradle Wrapper
runs-on: ubuntu-latest
steps:
- name: Clone repo
uses: actions/checkout@v2
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
run_tests:
name: Run Tests
runs-on: ubuntu-latest
steps:
- name: Clone repo
uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '15'
architecture: x64
- name: Setup Cl
run: ./scripts/SetupClUnix.sh
- name: Run Tests
uses: eskatos/gradle-command-action@v1
with:
arguments: check
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true

View File

@@ -20,7 +20,7 @@ version = "1.1.1"
repositories { repositories {
mavenCentral() mavenCentral()
google()
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") } maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
} }
@@ -81,7 +81,8 @@ dependencies {
implementation("io.github.kerubistan.kroki:kroki-coroutines:1.21") implementation("io.github.kerubistan.kroki:kroki-coroutines:1.21")
// Testing // Testing
testImplementation(kotlin("test-junit5")) testImplementation(kotlin("test-junit"))
testImplementation(compose("org.jetbrains.compose.ui:ui-test-junit4"))
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion") testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion")
} }

View File

@@ -46,18 +46,50 @@ class XmlResourceBundle internal constructor(internal val lookup: Map<String, An
} }
fun getStringA(key: String): String { fun getStringA(key: String): String {
return getString(key).replace("\\n", "\n") return getString(key)
.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\?", "?")
.replace("\\@", "@")
} }
fun getString(key: String, vararg replacements: String): String { fun getString(key: String, vararg replacements: Any): String {
val stringBuilder = StringBuilder()
var string = getStringA(key) var string = getStringA(key)
replacements.forEachIndexed { index, s -> while (true) {
string = string.replace( val index = string.indexOf('%')
"%" + (index + 1).toString() + '$' + "s", if (index < 0) {
s stringBuilder.append(string)
) break
} else {
stringBuilder.append(string.substring(0, index))
val stringConfig = string.substring(index, index + 4)
val item = replacements[stringConfig[1].digitToInt() - 1]
when (stringConfig[3]) {
's' -> {
require(item is String) { "Expected String, got ${item::class.java.simpleName}" }
stringBuilder.append(item)
} }
return string 'd' -> {
when (item) {
is Int -> stringBuilder.append(item)
is Long -> stringBuilder.append(item)
else -> throw IllegalArgumentException("Expected Int or Long, got ${item::class.java.simpleName}")
}
}
'f' -> {
when (item) {
is Float -> stringBuilder.append(item)
is Double -> stringBuilder.append(item)
else -> throw IllegalArgumentException("Expected Float or Double, got ${item::class.java.simpleName}")
}
}
}
stringBuilder.append(item)
string = string.substring((index + 4).coerceAtMost(string.length), string.length)
}
}
return stringBuilder.toString()
} }
companion object { companion object {
@@ -68,29 +100,6 @@ class XmlResourceBundle internal constructor(internal val lookup: Map<String, An
} }
} }
fun forTag(tag: String): XmlResourceBundle {
val classLoader = this::class.java.classLoader
val rootBundle = classLoader.getResourceAsStream("values/values/strings.xml")!!
.use { XmlResourceBundle(it) }
val languageBundle = classLoader.getResourceAsStream("values/values-${tag.substringBefore('-')}/strings.xml")
?.use { XmlResourceBundle(it) }
val languageTagBundle = if (tag.contains('-')) {
classLoader.getResourceAsStream("values/values-$tag/strings.xml")
?.use { XmlResourceBundle(it) }
} else null
var resultBundle = rootBundle
if (languageBundle != null) {
resultBundle += languageBundle
}
if (languageTagBundle != null) {
resultBundle += languageTagBundle
}
return resultBundle
}
fun forLocale(locale: Locale): XmlResourceBundle { fun forLocale(locale: Locale): XmlResourceBundle {
val classLoader = this::class.java.classLoader val classLoader = this::class.java.classLoader
val rootBundle = classLoader.getResourceAsStream("values/values/strings.xml")!! val rootBundle = classLoader.getResourceAsStream("values/values/strings.xml")!!

View File

@@ -22,7 +22,7 @@ fun stringResource(key: String): String {
} }
@Composable @Composable
fun stringResource(key: String, vararg replacements: String): String { fun stringResource(key: String, vararg replacements: Any): String {
val resources = LocalResources.current val resources = LocalResources.current
return remember(key, replacements) { resources.getString(key, *replacements) } return remember(key, replacements) { resources.getString(key, *replacements) }
} }

View File

@@ -234,7 +234,7 @@ fun DownloadsExtraInfo() {
val list by vm.downloadQueue.collectAsState() val list by vm.downloadQueue.collectAsState()
if (list.isNotEmpty()) { if (list.isNotEmpty()) {
Text( Text(
stringResource("downloads_remaining", list.size.toString()), stringResource("downloads_remaining", list.size),
style = MaterialTheme.typography.body2, style = MaterialTheme.typography.body2,
color = LocalContentColor.current.copy(alpha = ContentAlpha.disabled) color = LocalContentColor.current.copy(alpha = ContentAlpha.disabled)
) )

View File

@@ -109,7 +109,7 @@ fun ChapterItem(
if (length > 0) append("") if (length > 0) append("")
append( append(
AnnotatedString( AnnotatedString(
stringResource("page_progress", (chapter.lastPageRead + 1).toString()), stringResource("page_progress", (chapter.lastPageRead + 1)),
SpanStyle(color = LocalContentColor.current.copy(alpha = ContentAlpha.disabled)) SpanStyle(color = LocalContentColor.current.copy(alpha = ContentAlpha.disabled))
) )
) )

View File

@@ -168,9 +168,9 @@ fun SettingsReaderScreen(navController: BackStack<Route>) {
) )
val maxSize by it.maxSize.collectAsState() val maxSize by it.maxSize.collectAsState()
val (maxSizeTitle, maxSizeSubtitle) = if (direction == Direction.Up || direction == Direction.Down) { val (maxSizeTitle, maxSizeSubtitle) = if (direction == Direction.Up || direction == Direction.Down) {
stringResource("max_width") to stringResource("max_width_sub", maxSize.toString()) stringResource("max_width") to stringResource("max_width_sub", maxSize)
} else { } else {
stringResource("max_height") to stringResource("max_height_sub", maxSize.toString()) stringResource("max_height") to stringResource("max_height_sub", maxSize)
} }
ChoicePreference( ChoicePreference(
it.maxSize, it.maxSize,

View File

@@ -48,7 +48,7 @@
<string name="categories_delete_confirm">آیا می‌خواهید رده %1$s را پاک کنید؟</string> <string name="categories_delete_confirm">آیا می‌خواهید رده %1$s را پاک کنید؟</string>
<!-- Downloads Menu --> <!-- Downloads Menu -->
<string name="downloads_remaining">%1$s تغییر نام</string> <string name="downloads_remaining">%1$d تغییر نام</string>
<!-- Extensions Menu --> <!-- Extensions Menu -->
<string name="enabled_languages">زبان‌های‌ فعال</string> <string name="enabled_languages">زبان‌های‌ فعال</string>
@@ -57,7 +57,7 @@
<string name="default_category">پیشفرض</string> <string name="default_category">پیشفرض</string>
<!-- Manga Menu --> <!-- Manga Menu -->
<string name="page_progress">صفحه %1$s</string> <string name="page_progress">صفحه %1$d</string>
<!-- Sources Menu --> <!-- Sources Menu -->
<string name="sources_home">خانه</string> <string name="sources_home">خانه</string>
@@ -145,9 +145,9 @@
<string name="force_fit_height">هم اندازه کردن طول</string> <string name="force_fit_height">هم اندازه کردن طول</string>
<string name="force_fit_height_sub">اگر طول پنجره از عکس بزرگ تر است، عکس هم اندازه می‌شود</string> <string name="force_fit_height_sub">اگر طول پنجره از عکس بزرگ تر است، عکس هم اندازه می‌شود</string>
<string name="max_width">حداکثر عرض</string> <string name="max_width">حداکثر عرض</string>
<string name="max_width_sub">طولی که عکس باید از آن کوچک‌تر باشد که مقدار فعلی آن %1$sdp است. می‌شود برای بزرگ تر کردن عکس‌ها استفاده شود</string> <string name="max_width_sub">طولی که عکس باید از آن کوچک‌تر باشد که مقدار فعلی آن %1$ddp است. می‌شود برای بزرگ تر کردن عکس‌ها استفاده شود</string>
<string name="max_height">حداکثر طول</string> <string name="max_height">حداکثر طول</string>
<string name="max_height_sub">طولی که عکس باید از آن کوچک‌تر باشد که مقدار فعلی آن %1$sdp است. می‌شود برای بزرگ تر کردن عکس‌ها استفاده شود.</string> <string name="max_height_sub">طولی که عکس باید از آن کوچک‌تر باشد که مقدار فعلی آن %1$ddp است. می‌شود برای بزرگ تر کردن عکس‌ها استفاده شود.</string>
<string name="max_size_unrestricted">آزاد</string> <string name="max_size_unrestricted">آزاد</string>
<string name="image_scale">مقیاس عکس</string> <string name="image_scale">مقیاس عکس</string>
<string name="scale_fit_screen">هم اندازه صفحه</string> <string name="scale_fit_screen">هم اندازه صفحه</string>

View File

@@ -47,7 +47,7 @@
<string name="categories_delete_confirm">Do you wish to delete the category %1$s?</string> <string name="categories_delete_confirm">Do you wish to delete the category %1$s?</string>
<!-- Downloads Menu --> <!-- Downloads Menu -->
<string name="downloads_remaining">%1$s remaining</string> <string name="downloads_remaining">%1$d remaining</string>
<!-- Extensions Menu --> <!-- Extensions Menu -->
<string name="enabled_languages">Enabled languages</string> <string name="enabled_languages">Enabled languages</string>
@@ -56,7 +56,7 @@
<string name="default_category">Default</string> <string name="default_category">Default</string>
<!-- Manga Menu --> <!-- Manga Menu -->
<string name="page_progress">Page %1$s</string> <string name="page_progress">Page %1$d</string>
<!-- Sources Menu --> <!-- Sources Menu -->
<string name="sources_home">Home</string> <string name="sources_home">Home</string>
@@ -144,9 +144,9 @@
<string name="force_fit_height">Force fit height</string> <string name="force_fit_height">Force fit height</string>
<string name="force_fit_height_sub">When the window's height is over the images height, scale the image to the window</string> <string name="force_fit_height_sub">When the window's height is over the images height, scale the image to the window</string>
<string name="max_width">Max width</string> <string name="max_width">Max width</string>
<string name="max_width_sub">Width to restrict a image from going over, currently %1$sdp. Works with the above setting to scale images up but restrict them to a certain amount</string> <string name="max_width_sub">Width to restrict a image from going over, currently %1$ddp. Works with the above setting to scale images up but restrict them to a certain amount</string>
<string name="max_height">Max height</string> <string name="max_height">Max height</string>
<string name="max_height_sub">Height to restrict a image from going over, currently %1$sdp. Works with the above setting to scale images up but restrict them to a certain amount</string> <string name="max_height_sub">Height to restrict a image from going over, currently %1$ddp. Works with the above setting to scale images up but restrict them to a certain amount</string>
<string name="max_size_unrestricted">Unrestricted</string> <string name="max_size_unrestricted">Unrestricted</string>
<string name="image_scale">Image Scale</string> <string name="image_scale">Image Scale</string>
<string name="scale_fit_screen">Fit Screen</string> <string name="scale_fit_screen">Fit Screen</string>

View File

@@ -48,7 +48,7 @@
<string name="categories_delete_confirm">Você deseja deletar a categoria %1$s?</string> <string name="categories_delete_confirm">Você deseja deletar a categoria %1$s?</string>
<!-- Downloads Menu --> <!-- Downloads Menu -->
<string name="downloads_remaining">%1$s Remanescente</string> <string name="downloads_remaining">%1$d Remanescente</string>
<!-- Extensions Menu --> <!-- Extensions Menu -->
<string name="enabled_languages">Idiomas habilitados</string> <string name="enabled_languages">Idiomas habilitados</string>
@@ -57,7 +57,7 @@
<string name="default_category">Padrão</string> <string name="default_category">Padrão</string>
<!-- Manga Menu --> <!-- Manga Menu -->
<string name="page_progress">Página %1$s</string> <string name="page_progress">Página %1$d</string>
<!-- Sources Menu --> <!-- Sources Menu -->
<string name="sources_home">Iníco</string> <string name="sources_home">Iníco</string>
@@ -145,9 +145,9 @@
<string name="force_fit_height">Forçar o ajuste de altura</string> <string name="force_fit_height">Forçar o ajuste de altura</string>
<string name="force_fit_height_sub">Quando a altura da janela estiver acima da altura da imagem, dimensione a imagem para a janela</string> <string name="force_fit_height_sub">Quando a altura da janela estiver acima da altura da imagem, dimensione a imagem para a janela</string>
<string name="max_width">Largura máxima</string> <string name="max_width">Largura máxima</string>
<string name="max_width_sub">Largura para impedir que uma imagem ultrapasse, atualmente %1$sdp. Funciona com a configuração acima para dimensionar as imagens, mas restringindo-as a uma certa quantidade</string> <string name="max_width_sub">Largura para impedir que uma imagem ultrapasse, atualmente %1$ddp. Funciona com a configuração acima para dimensionar as imagens, mas restringindo-as a uma certa quantidade</string>
<string name="max_height">Altura máxima</string> <string name="max_height">Altura máxima</string>
<string name="max_height_sub">Altura para impedir que uma imagem ultrapasse, atualmente %1$sdp. Funciona com a configuração acima para dimensionar as imagens, mas restringindo-as a uma certa quantidade</string> <string name="max_height_sub">Altura para impedir que uma imagem ultrapasse, atualmente %1$ddp. Funciona com a configuração acima para dimensionar as imagens, mas restringindo-as a uma certa quantidade</string>
<string name="max_size_unrestricted">Irrestrito</string> <string name="max_size_unrestricted">Irrestrito</string>
<string name="image_scale">Ecala da imagem</string> <string name="image_scale">Ecala da imagem</string>
<string name="scale_fit_screen">Tela de ajuste</string> <string name="scale_fit_screen">Tela de ajuste</string>

View File

@@ -47,7 +47,7 @@
<string name="categories_delete_confirm">Vill du radera kategorin? %1$s?</string> <string name="categories_delete_confirm">Vill du radera kategorin? %1$s?</string>
<!-- Downloads Menu --> <!-- Downloads Menu -->
<string name="downloads_remaining">%1$s kvar</string> <string name="downloads_remaining">%1$d kvar</string>
<!-- Extensions Menu --> <!-- Extensions Menu -->
<string name="enabled_languages">Aktiverade språk</string> <string name="enabled_languages">Aktiverade språk</string>
@@ -56,7 +56,7 @@
<string name="default_category">Standard</string> <string name="default_category">Standard</string>
<!-- Manga Menu --> <!-- Manga Menu -->
<string name="page_progress">Sida %1$s</string> <string name="page_progress">Sida %1$d</string>
<!-- Sources Menu --> <!-- Sources Menu -->
<string name="sources_home">Hem</string> <string name="sources_home">Hem</string>
@@ -144,9 +144,9 @@
<string name="force_fit_height">Tvinga höjdpassning</string> <string name="force_fit_height">Tvinga höjdpassning</string>
<string name="force_fit_height_sub">När fönstrets höjd är större än bildens höjd, skala bilden till fönstret</string> <string name="force_fit_height_sub">När fönstrets höjd är större än bildens höjd, skala bilden till fönstret</string>
<string name="max_width">Max bredd</string> <string name="max_width">Max bredd</string>
<string name="max_width_sub">Bredd för att begränsa en bild från att gå över, för närvarande% %1$sdp. Fungerar med ovanstående inställning för att skala upp bilder men begränsa dem till en viss mängd</string> <string name="max_width_sub">Bredd för att begränsa en bild från att gå över, för närvarande %1$ddp. Fungerar med ovanstående inställning för att skala upp bilder men begränsa dem till en viss mängd</string>
<string name="max_height">Max höjd</string> <string name="max_height">Max höjd</string>
<string name="max_height_sub">Höjd för att begränsa en bild från att gå över, för närvarande% %1$sdp. Fungerar med ovanstående inställning för att skala upp bilder men begränsa dem till en viss mängd</string> <string name="max_height_sub">Höjd för att begränsa en bild från att gå över, för närvarande %1$ddp. Fungerar med ovanstående inställning för att skala upp bilder men begränsa dem till en viss mängd</string>
<string name="max_size_unrestricted">Obegränsad</string> <string name="max_size_unrestricted">Obegränsad</string>
<string name="image_scale">Bildskala</string> <string name="image_scale">Bildskala</string>
<string name="scale_fit_screen">Passa skärmen</string> <string name="scale_fit_screen">Passa skärmen</string>

View File

@@ -47,7 +47,7 @@
<string name="categories_delete_confirm">%1$s-ஐ அழிக்க வரும்புகிறீர்களா?</string> <string name="categories_delete_confirm">%1$s-ஐ அழிக்க வரும்புகிறீர்களா?</string>
<!-- Downloads Menu --> <!-- Downloads Menu -->
<string name="downloads_remaining">%1$s மீதி</string> <!--Translation;%1$s remaining; or "பதிவிறக்கம் மீதி"-download remaining, if needed to be specific--> <string name="downloads_remaining">%1$d மீதி</string> <!--Translation;%1$s remaining; or "பதிவிறக்கம் மீதி"-download remaining, if needed to be specific-->
<!-- Extensions Menu --> <!-- Extensions Menu -->
<string name="enabled_languages">இயக்கப்பட்ட மொழிகள்</string> <string name="enabled_languages">இயக்கப்பட்ட மொழிகள்</string>
@@ -56,7 +56,7 @@
<string name="default_category">இயல்புநிலை</string> <!--This means default--> <string name="default_category">இயல்புநிலை</string> <!--This means default-->
<!-- Manga Menu --> <!-- Manga Menu -->
<string name="page_progress">பக்கம் %1$s</string> <string name="page_progress">பக்கம் %1$d</string>
<!-- Sources Menu --> <!-- Sources Menu -->
<string name="sources_home">முகப்பு</string> <string name="sources_home">முகப்பு</string>
@@ -144,9 +144,9 @@
<string name="force_fit_height">பொருத்தமான உயரம் கட்டாயபடுத்தல்</string> <string name="force_fit_height">பொருத்தமான உயரம் கட்டாயபடுத்தல்</string>
<string name="force_fit_height_sub">சாளரத்தின் உயரம் படங்களின் உயரத்திற்கு மேல் இருக்கும்போது, ​​படத்தை சாளரத்திற்கு அளவிடவும்</string> <string name="force_fit_height_sub">சாளரத்தின் உயரம் படங்களின் உயரத்திற்கு மேல் இருக்கும்போது, ​​படத்தை சாளரத்திற்கு அளவிடவும்</string>
<string name="max_width">அதிகபட்ச அகலம்</string> <string name="max_width">அதிகபட்ச அகலம்</string>
<string name="max_width_sub">படத்து அளவு மேலே செல்வதைத் தடுக்கும் அகலம், இப்பொழுது %1$sdp. இது மேல் அமைவுடன் வேலைசையும் ஆனால் ஒரு அளவுக்கு தான் கட்டுப்படுத்தும்</string> <string name="max_width_sub">படத்து அளவு மேலே செல்வதைத் தடுக்கும் அகலம், இப்பொழுது %1$ddp. இது மேல் அமைவுடன் வேலைசையும் ஆனால் ஒரு அளவுக்கு தான் கட்டுப்படுத்தும்</string>
<string name="max_height">அதிகபட்ச உயரம்</string> <string name="max_height">அதிகபட்ச உயரம்</string>
<string name="max_height_sub">படத்து அளவு மேலே செல்வதைத் தடுக்கும் உயரம், இப்பொழுது %1$sdp. இது மேல் அமைவுடன் வேலைசையும் ஆனால் ஒரு அளவுக்கு தான் கட்டுப்படுத்தும்</string> <string name="max_height_sub">படத்து அளவு மேலே செல்வதைத் தடுக்கும் உயரம், இப்பொழுது %1$ddp. இது மேல் அமைவுடன் வேலைசையும் ஆனால் ஒரு அளவுக்கு தான் கட்டுப்படுத்தும்</string>
<string name="max_size_unrestricted">கட்டுப்பாடற்ற</string> <string name="max_size_unrestricted">கட்டுப்பாடற்ற</string>
<string name="image_scale">பட அளவு</string> <string name="image_scale">பட அளவு</string>
<string name="scale_fit_screen">திரைக்கு பொருது</string> <string name="scale_fit_screen">திரைக்கு பொருது</string>

View File

@@ -48,7 +48,7 @@
<string name="categories_delete_confirm">Do you wish to delete the category %1$s?</string> <string name="categories_delete_confirm">Do you wish to delete the category %1$s?</string>
<!-- Downloads Menu --> <!-- Downloads Menu -->
<string name="downloads_remaining">%1$s remaining</string> <string name="downloads_remaining">%1$d remaining</string>
<!-- Extensions Menu --> <!-- Extensions Menu -->
<string name="enabled_languages">Enabled languages</string> <string name="enabled_languages">Enabled languages</string>
@@ -57,7 +57,7 @@
<string name="default_category">Default</string> <string name="default_category">Default</string>
<!-- Manga Menu --> <!-- Manga Menu -->
<string name="page_progress">Page %1$s</string> <string name="page_progress">Page %1$d</string>
<!-- Sources Menu --> <!-- Sources Menu -->
<string name="sources_home">Home</string> <string name="sources_home">Home</string>
@@ -145,9 +145,9 @@
<string name="force_fit_height">Force fit height</string> <string name="force_fit_height">Force fit height</string>
<string name="force_fit_height_sub">When the window's height is over the images height, scale the image to the window</string> <string name="force_fit_height_sub">When the window's height is over the images height, scale the image to the window</string>
<string name="max_width">Max width</string> <string name="max_width">Max width</string>
<string name="max_width_sub">Width to restrict a image from going over, currently %1$sdp. Works with the above setting to scale images up but restrict them to a certain amount</string> <string name="max_width_sub">Width to restrict a image from going over, currently %1$ddp. Works with the above setting to scale images up but restrict them to a certain amount</string>
<string name="max_height">Max height</string> <string name="max_height">Max height</string>
<string name="max_height_sub">Height to restrict a image from going over, currently %1$sdp. Works with the above setting to scale images up but restrict them to a certain amount</string> <string name="max_height_sub">Height to restrict a image from going over, currently %1$ddp. Works with the above setting to scale images up but restrict them to a certain amount</string>
<string name="max_size_unrestricted">Unrestricted</string> <string name="max_size_unrestricted">Unrestricted</string>
<string name="image_scale">Image Scale</string> <string name="image_scale">Image Scale</string>
<string name="scale_fit_screen">Fit Screen</string> <string name="scale_fit_screen">Fit Screen</string>

View File

@@ -1,10 +0,0 @@
package ca.gosyer.data.server
import kotlin.test.Test
class ExtensionInteractionTest {
@Test
fun `Install a extension`() {
}
}

View File

@@ -0,0 +1,49 @@
package ca.gosyer.data.translation
import org.junit.Before
import java.io.File
import java.util.Locale
import kotlin.test.Test
class XmlResourceBundleTest {
lateinit var rootBundle: XmlResourceBundle
lateinit var bundles: List<Pair<String, XmlResourceBundle>>
@Before
fun `load root bundle`() {
rootBundle = XmlResourceBundle.forLocale(Locale.ENGLISH)
val url = XmlResourceBundleTest::class.java.getResource("/values/")
requireNotNull(url)
bundles = requireNotNull(
File(url.toURI()).listFiles()?.mapNotNull {
if (it.name == "values") return@mapNotNull null
it.name.substringAfter("values-") to XmlResourceBundle.forLocale(Locale.forLanguageTag(it.name.substringAfter("values-")))
}
)
}
@Test
fun `test each language parameters`() {
rootBundle.lookup.entries.forEach { (key, value) ->
if (value !is String || !value.contains('%')) return@forEach
val testValues: Array<Any> = value.split('%').drop(1).map {
when (val char = it[2]) {
's' -> "Test string"
'd' -> 69
'f' -> 6.9
else -> {
throw IllegalArgumentException("Unknown value key $char in $key")
}
}
}.toTypedArray()
bundles.forEach { (lang, bundle) ->
try {
bundle.getString(key, *testValues)
} catch (e: Exception) {
throw Exception("Broken translation in $lang with $key", e)
}
}
}
}
}