From d71efa9fb189942cbb8b1f12012a6d6b69d88663 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 4 Dec 2021 17:19:39 +0100 Subject: [PATCH] profiles: language --- src/main/java/de/bixilon/minosoft/Minosoft.kt | 11 ++++++++--- .../minosoft/config/config/general/GeneralConfig.kt | 1 - .../minosoft/data/commands/parser/ComponentParser.kt | 2 +- .../minosoft/data/entities/block/SignBlockEntity.kt | 2 +- .../minosoft/data/entities/meta/EntityMetaData.kt | 2 +- .../de/bixilon/minosoft/data/inventory/ItemStack.kt | 8 ++++---- .../bixilon/minosoft/data/language/LanguageManager.kt | 8 +++++--- .../minosoft/data/language/MultiLanguageManager.kt | 7 ++++++- .../minosoft/data/registries/versions/Version.kt | 9 ++------- .../network/connection/play/PlayConnection.kt | 3 +++ .../play/clientsettings/ClientSettingsManager.kt | 5 ++++- .../minosoft/protocol/protocol/PlayInByteBuffer.kt | 2 +- src/main/java/de/bixilon/minosoft/util/KUtil.kt | 3 +++ 13 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.kt b/src/main/java/de/bixilon/minosoft/Minosoft.kt index 007715c28..1b5a887bd 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.kt +++ b/src/main/java/de/bixilon/minosoft/Minosoft.kt @@ -15,7 +15,9 @@ package de.bixilon.minosoft import de.bixilon.minosoft.config.Configuration import de.bixilon.minosoft.config.profile.GlobalProfileManager +import de.bixilon.minosoft.config.profile.change.listener.SimpleChangeListener.Companion.listen import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager import de.bixilon.minosoft.data.accounts.Account import de.bixilon.minosoft.data.assets.JarAssetsManager import de.bixilon.minosoft.data.assets.Resources @@ -106,9 +108,12 @@ object Minosoft { Log.log(LogMessageType.PROFILES, LogLevels.INFO) { "Profiles loaded!" } }) - taskWorker += Task(identifier = StartupTasks.LOAD_LANGUAGE_FILES, dependencies = arrayOf(StartupTasks.LOAD_CONFIG), executor = { - Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading language files (${config.config.general.language})" } - LANGUAGE_MANAGER.translators[ProtocolDefinition.MINOSOFT_NAMESPACE] = load(config.config.general.language, null, ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "language/")) + taskWorker += Task(identifier = StartupTasks.LOAD_LANGUAGE_FILES, dependencies = arrayOf(StartupTasks.LOAD_PROFILES), executor = { + val language = ErosProfileManager.selected.general.language + Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading language files (${language})" } + ErosProfileManager.selected.general::language.listen(this, true) { + LANGUAGE_MANAGER.translators[ProtocolDefinition.MINOSOFT_NAMESPACE] = load(it, null, ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "language/")) + } Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Language files loaded!" } }) diff --git a/src/main/java/de/bixilon/minosoft/config/config/general/GeneralConfig.kt b/src/main/java/de/bixilon/minosoft/config/config/general/GeneralConfig.kt index 79a2f46d4..7f2019140 100644 --- a/src/main/java/de/bixilon/minosoft/config/config/general/GeneralConfig.kt +++ b/src/main/java/de/bixilon/minosoft/config/config/general/GeneralConfig.kt @@ -22,6 +22,5 @@ data class GeneralConfig( var version: Int = Configuration.LATEST_CONFIG_VERSION, @Json(name = "log") var log: MutableMap = LogMessageType.DEFAULT_LOG_MAP.toMutableMap(), @Json(name = "reduce_protocol_log") var reduceProtocolLog: Boolean = true, - var language: String = "en_US", @Json(name = "ignore_x_start_on_first_thread_warning") var ignoreXStartOnFirstThreadWarning: Boolean = false, ) diff --git a/src/main/java/de/bixilon/minosoft/data/commands/parser/ComponentParser.kt b/src/main/java/de/bixilon/minosoft/data/commands/parser/ComponentParser.kt index a20523112..b05844bbb 100644 --- a/src/main/java/de/bixilon/minosoft/data/commands/parser/ComponentParser.kt +++ b/src/main/java/de/bixilon/minosoft/data/commands/parser/ComponentParser.kt @@ -22,7 +22,7 @@ object ComponentParser : CommandParser() { override fun parse(connection: PlayConnection, properties: ParserProperties?, stringReader: CommandStringReader): Any { try { - return ChatComponent.of(stringReader.readJson().asJsonObject, connection.version.language, null) + return ChatComponent.of(stringReader.readJson().asJsonObject, connection.language, null) } catch (exception: Exception) { stringReader.skip(-1) throw InvalidComponentCommandParseException(stringReader, stringReader.read().toString(), exception) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/SignBlockEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/SignBlockEntity.kt index 1d6a9e8e7..6080d8fcf 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/SignBlockEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/SignBlockEntity.kt @@ -27,7 +27,7 @@ class SignBlockEntity(connection: PlayConnection) : BlockEntity(connection) { for (i in 0 until ProtocolDefinition.SIGN_LINES) { val tag = nbt["Text$i"].nullCast() ?: continue - lines[i] = ChatComponent.of(tag, translator = connection.version.language) + lines[i] = ChatComponent.of(tag, translator = connection.language) } } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityMetaData.kt b/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityMetaData.kt index fe1b30255..daedaa1b0 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityMetaData.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityMetaData.kt @@ -180,7 +180,7 @@ class EntityMetaData( } fun getChatComponent(field: EntityMetaDataFields): ChatComponent? { - return get(field)?.let { ChatComponent.of(it, connection.version.language) } + return get(field)?.let { ChatComponent.of(it, connection.language) } } fun getString(field: EntityMetaDataFields): String? { diff --git a/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt b/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt index e46938382..f0426cb9e 100644 --- a/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt +++ b/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt @@ -138,7 +138,7 @@ class ItemStack( customDisplayName: ChatComponent? = this.customDisplayName, unbreakable: Boolean = this.unbreakable, durability: Int = this.durability, - nbt: MutableMap = this.nbt.synchronizedDeepCopy()!!, + nbt: MutableMap = this.nbt.synchronizedDeepCopy(), container: Container? = this.container, hideFlags: Int = this.hideFlags, dyedColor: RGBColor? = this.dyedColor, @@ -184,12 +184,12 @@ class ItemStack( nbt.getAndRemove(DISPLAY_TAG)?.compoundCast()?.let { it.getAndRemove(DISPLAY_MAME_TAG).nullCast()?.let { nameTag -> - customDisplayName = ChatComponent.of(nameTag, translator = connection?.version?.language) + customDisplayName = ChatComponent.of(nameTag, translator = connection?.language) } it.getAndRemove(DISPLAY_LORE_TAG)?.listCast()?.let { loreTag -> for (lore in loreTag) { - this.lore.add(ChatComponent.of(lore, translator = connection?.version?.language)) + this.lore.add(ChatComponent.of(lore, translator = connection?.language)) } } it.getAndRemove(DISPLAY_COLOR_TAG)?.toInt()?.asRGBColor().let { color -> this.dyedColor = color } @@ -280,7 +280,7 @@ class ItemStack( get() { customDisplayName?.let { return it } item.translationKey?.let { - connection?.version?.language?.translate(it)?.let { translatedName -> + connection?.language?.translate(it)?.let { translatedName -> translatedName.applyDefaultColor(rarity.color) return translatedName } diff --git a/src/main/java/de/bixilon/minosoft/data/language/LanguageManager.kt b/src/main/java/de/bixilon/minosoft/data/language/LanguageManager.kt index 6435a6d0f..2fced27ba 100644 --- a/src/main/java/de/bixilon/minosoft/data/language/LanguageManager.kt +++ b/src/main/java/de/bixilon/minosoft/data/language/LanguageManager.kt @@ -19,10 +19,12 @@ import de.bixilon.minosoft.data.registries.versions.Version import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.protocol.protocol.ProtocolVersions +import de.bixilon.minosoft.util.KUtil.fullName import de.bixilon.minosoft.util.KUtil.synchronizedListOf import de.bixilon.minosoft.util.KUtil.tryCatch import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound import java.io.FileNotFoundException +import java.util.* class LanguageManager( private val languages: MutableList = synchronizedListOf(), @@ -50,7 +52,7 @@ class LanguageManager( companion object { - fun load(language: String, version: Version?, path: ResourceLocation = ResourceLocation("lang/")): LanguageManager { + fun load(language: Locale, version: Version?, path: ResourceLocation = ResourceLocation("lang/")): LanguageManager { val assetsManager = version?.assetsManager ?: Minosoft.MINOSOFT_ASSETS_MANAGER fun loadMinecraftLanguage(language: String): Language { @@ -77,8 +79,8 @@ class LanguageManager( val languages: MutableList = mutableListOf() - if (language != "en_US") { - tryCatch(FileNotFoundException::class.java, executor = { languages += loadMinecraftLanguage(language) }) + if (language != Locale.US) { + tryCatch(FileNotFoundException::class.java, executor = { languages += loadMinecraftLanguage(language.fullName) }) } languages += loadMinecraftLanguage("en_US") diff --git a/src/main/java/de/bixilon/minosoft/data/language/MultiLanguageManager.kt b/src/main/java/de/bixilon/minosoft/data/language/MultiLanguageManager.kt index 95c1779bf..8d21bc308 100644 --- a/src/main/java/de/bixilon/minosoft/data/language/MultiLanguageManager.kt +++ b/src/main/java/de/bixilon/minosoft/data/language/MultiLanguageManager.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.data.language import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.TextComponent +import java.util.* class MultiLanguageManager( val translators: MutableMap = mutableMapOf(), @@ -27,8 +28,12 @@ class MultiLanguageManager( } override fun translate(key: ResourceLocation?, parent: TextComponent?, vararg data: Any?): ChatComponent { - key ?: return ChatComponent.of("$key: ${data.contentToString()}") + key ?: return ChatComponent.of("null: ${data.contentToString()}") return translators[key.namespace]?.translate(key, parent, *data) ?: ChatComponent.of("$key: ${data.contentToString()}") } + + fun loadLanguage(language: Locale) { + + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt b/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt index 970b4ab85..05881eb9b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/versions/Version.kt @@ -14,10 +14,8 @@ package de.bixilon.minosoft.data.registries.versions import com.google.common.collect.HashBiMap import de.bixilon.mbf.MBFBinaryReader -import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.assets.MinecraftAssetsManager import de.bixilon.minosoft.data.assets.Resources -import de.bixilon.minosoft.data.language.LanguageManager import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.protocol.protocol.PacketTypes.C2S import de.bixilon.minosoft.protocol.protocol.PacketTypes.S2C @@ -45,7 +43,6 @@ data class Version( var isLoaded = false val registries: Registries = Registries() lateinit var assetsManager: MinecraftAssetsManager - lateinit var language: LanguageManager fun getPacketById(state: ProtocolStates, command: Int): S2C? { return s2CPacketMapping[state]?.inverse()?.get(command) @@ -65,12 +62,10 @@ data class Version( } if (!isFlattened() && versionId != ProtocolDefinition.PRE_FLATTENING_VERSION_ID) { assetsManager = Versions.PRE_FLATTENING_VERSION.assetsManager - language = Versions.PRE_FLATTENING_VERSION.language return } assetsManager = MinecraftAssetsManager(Resources.getAssetVersionByVersion(this), Resources.getPixLyzerDataHashByVersion(this)) assetsManager.downloadAllAssets(latch) - language = LanguageManager.load(Minosoft.config.config.general.language, this) } @Synchronized @@ -141,13 +136,13 @@ data class Version( if (super.equals(other)) { return true } - if (other == null) { + if (other !is Version) { return false } return if (hashCode() != other.hashCode()) { false } else { - name == name + this.name == other.name } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt index 86d327e5e..448c215c8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.accounts.Account import de.bixilon.minosoft.data.assets.MultiAssetsManager import de.bixilon.minosoft.data.bossbar.BossbarManager import de.bixilon.minosoft.data.commands.CommandRootNode +import de.bixilon.minosoft.data.language.LanguageManager import de.bixilon.minosoft.data.physics.CollisionDetector import de.bixilon.minosoft.data.player.LocalPlayerEntity import de.bixilon.minosoft.data.player.tab.TabList @@ -84,6 +85,7 @@ class PlayConnection( lateinit var assetsManager: MultiAssetsManager private set val tags: MutableMap>> = synchronizedMapOf() + lateinit var language: LanguageManager var commandRootNode: CommandRootNode? = null @@ -215,6 +217,7 @@ class PlayConnection( fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.PRE)) version.load(latch) // ToDo: show gui loader assetsManager = MultiAssetsManager(version.assetsManager, Minosoft.MINOSOFT_ASSETS_MANAGER) + language = LanguageManager.load(profiles.connection.language ?: profiles.eros.general.language, version) registries.parentRegistries = version.registries fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.POST)) player = LocalPlayerEntity(account, this) diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/clientsettings/ClientSettingsManager.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/clientsettings/ClientSettingsManager.kt index 97cff02e2..04d8801dd 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/clientsettings/ClientSettingsManager.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/clientsettings/ClientSettingsManager.kt @@ -14,8 +14,10 @@ package de.bixilon.minosoft.protocol.network.connection.play.clientsettings import de.bixilon.minosoft.config.profile.change.listener.SimpleChangeListener.Companion.listen +import de.bixilon.minosoft.data.language.LanguageManager import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.c2s.play.ClientSettingsC2SP +import de.bixilon.minosoft.util.KUtil.fullName class ClientSettingsManager( private val connection: PlayConnection, @@ -64,12 +66,13 @@ class ClientSettingsManager( return } this.language = language + connection.language = LanguageManager.load(language, connection.version) sendClientSettings() } fun sendClientSettings() { connection.sendPacket(ClientSettingsC2SP( - locale = language.toString(), + locale = language.fullName, chatColors = connection.profiles.hud.chat.chatColors, viewDistance = connection.profiles.block.viewDistance, chatMode = connection.profiles.hud.chat.chatMode, diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt index faa1c3a91..f74bed84a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt @@ -69,7 +69,7 @@ class PlayInByteBuffer : InByteBuffer { } override fun readChatComponent(): ChatComponent { - return ChatComponent.of(readString(), connection.version.language, null) + return ChatComponent.of(readString(), connection.language, null) } fun readParticle(): ParticleData { diff --git a/src/main/java/de/bixilon/minosoft/util/KUtil.kt b/src/main/java/de/bixilon/minosoft/util/KUtil.kt index 1ad334495..b280dda98 100644 --- a/src/main/java/de/bixilon/minosoft/util/KUtil.kt +++ b/src/main/java/de/bixilon/minosoft/util/KUtil.kt @@ -555,4 +555,7 @@ object KUtil { throw IOException("Could not move $tempFile to $destination!") } } + + val Locale.fullName: String + get() = language + "_" + country.ifEmpty { language.uppercase() } }