chat: allow nested translations

This should fix some bugs in 1.19 where chat messages appear missing.
Yes, it will crash with a StackOverflow when using it arbitrary :)
This commit is contained in:
Bixilon 2023-05-07 10:17:10 +02:00
parent ceebf63c3c
commit 030ea52a6c
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 14 additions and 1 deletions

View File

@ -93,7 +93,8 @@ class BaseComponent : ChatComponent {
val with: MutableList<Any> = mutableListOf()
json["with"].toJsonList()?.let { withArray ->
for (part in withArray) {
with.add(part ?: continue)
if (part == null) continue
with += ChatComponent.of(raw = part, translator, component, restricted = restrictedMode)
}
}
val fallback = json["fallback"]?.toString()

View File

@ -14,6 +14,7 @@
package de.bixilon.minosoft.data.text
import de.bixilon.kutil.url.URLUtil.toURL
import de.bixilon.minosoft.data.language.lang.Language
import de.bixilon.minosoft.data.text.ChatComponent.Companion.chat
import de.bixilon.minosoft.data.text.events.click.OpenFileClickEvent
import de.bixilon.minosoft.data.text.events.click.OpenURLClickEvent
@ -234,6 +235,17 @@ internal class ChatComponentTest {
assertEquals(text, expected)
}
@Test
fun `Nested translations`() {
val language = Language("en_US", mutableMapOf(
"gameMode.changed" to "Dein Spielmodus wurde zu %s geändert",
"gameMode.creative" to "Kreativmodus",
))
val text = ChatComponent.of("""{"translate":"gameMode.changed","with":[{"translate":"gameMode.creative"}]}""", translator = language)
val expected = BaseComponent(TextComponent("Dein Spielmodus wurde zu "), TextComponent("Kreativmodus"), TextComponent(" geändert"))
assertEquals(text, expected)
}
private fun assertEquals(expected: ChatComponent, actual: ChatComponent) {
when (expected) {
is BaseComponent -> {