profiles: language

This commit is contained in:
Bixilon 2021-12-04 17:19:39 +01:00
parent c50db6eb56
commit d71efa9fb1
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
13 changed files with 39 additions and 24 deletions

View File

@ -15,7 +15,9 @@ package de.bixilon.minosoft
import de.bixilon.minosoft.config.Configuration import de.bixilon.minosoft.config.Configuration
import de.bixilon.minosoft.config.profile.GlobalProfileManager 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.account.AccountProfileManager
import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager
import de.bixilon.minosoft.data.accounts.Account import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.data.assets.JarAssetsManager import de.bixilon.minosoft.data.assets.JarAssetsManager
import de.bixilon.minosoft.data.assets.Resources import de.bixilon.minosoft.data.assets.Resources
@ -106,9 +108,12 @@ object Minosoft {
Log.log(LogMessageType.PROFILES, LogLevels.INFO) { "Profiles loaded!" } Log.log(LogMessageType.PROFILES, LogLevels.INFO) { "Profiles loaded!" }
}) })
taskWorker += Task(identifier = StartupTasks.LOAD_LANGUAGE_FILES, dependencies = arrayOf(StartupTasks.LOAD_CONFIG), executor = { taskWorker += Task(identifier = StartupTasks.LOAD_LANGUAGE_FILES, dependencies = arrayOf(StartupTasks.LOAD_PROFILES), executor = {
Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading language files (${config.config.general.language})" } val language = ErosProfileManager.selected.general.language
LANGUAGE_MANAGER.translators[ProtocolDefinition.MINOSOFT_NAMESPACE] = load(config.config.general.language, null, ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "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!" } Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Language files loaded!" }
}) })

View File

@ -22,6 +22,5 @@ data class GeneralConfig(
var version: Int = Configuration.LATEST_CONFIG_VERSION, var version: Int = Configuration.LATEST_CONFIG_VERSION,
@Json(name = "log") var log: MutableMap<LogMessageType, LogLevels> = LogMessageType.DEFAULT_LOG_MAP.toMutableMap(), @Json(name = "log") var log: MutableMap<LogMessageType, LogLevels> = LogMessageType.DEFAULT_LOG_MAP.toMutableMap(),
@Json(name = "reduce_protocol_log") var reduceProtocolLog: Boolean = true, @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, @Json(name = "ignore_x_start_on_first_thread_warning") var ignoreXStartOnFirstThreadWarning: Boolean = false,
) )

View File

@ -22,7 +22,7 @@ object ComponentParser : CommandParser() {
override fun parse(connection: PlayConnection, properties: ParserProperties?, stringReader: CommandStringReader): Any { override fun parse(connection: PlayConnection, properties: ParserProperties?, stringReader: CommandStringReader): Any {
try { try {
return ChatComponent.of(stringReader.readJson().asJsonObject, connection.version.language, null) return ChatComponent.of(stringReader.readJson().asJsonObject, connection.language, null)
} catch (exception: Exception) { } catch (exception: Exception) {
stringReader.skip(-1) stringReader.skip(-1)
throw InvalidComponentCommandParseException(stringReader, stringReader.read().toString(), exception) throw InvalidComponentCommandParseException(stringReader, stringReader.read().toString(), exception)

View File

@ -27,7 +27,7 @@ class SignBlockEntity(connection: PlayConnection) : BlockEntity(connection) {
for (i in 0 until ProtocolDefinition.SIGN_LINES) { for (i in 0 until ProtocolDefinition.SIGN_LINES) {
val tag = nbt["Text$i"].nullCast<String>() ?: continue val tag = nbt["Text$i"].nullCast<String>() ?: continue
lines[i] = ChatComponent.of(tag, translator = connection.version.language) lines[i] = ChatComponent.of(tag, translator = connection.language)
} }
} }

View File

@ -180,7 +180,7 @@ class EntityMetaData(
} }
fun getChatComponent(field: EntityMetaDataFields): ChatComponent? { fun getChatComponent(field: EntityMetaDataFields): ChatComponent? {
return get<Any?>(field)?.let { ChatComponent.of(it, connection.version.language) } return get<Any?>(field)?.let { ChatComponent.of(it, connection.language) }
} }
fun getString(field: EntityMetaDataFields): String? { fun getString(field: EntityMetaDataFields): String? {

View File

@ -138,7 +138,7 @@ class ItemStack(
customDisplayName: ChatComponent? = this.customDisplayName, customDisplayName: ChatComponent? = this.customDisplayName,
unbreakable: Boolean = this.unbreakable, unbreakable: Boolean = this.unbreakable,
durability: Int = this.durability, durability: Int = this.durability,
nbt: MutableMap<String, Any> = this.nbt.synchronizedDeepCopy()!!, nbt: MutableMap<String, Any> = this.nbt.synchronizedDeepCopy(),
container: Container? = this.container, container: Container? = this.container,
hideFlags: Int = this.hideFlags, hideFlags: Int = this.hideFlags,
dyedColor: RGBColor? = this.dyedColor, dyedColor: RGBColor? = this.dyedColor,
@ -184,12 +184,12 @@ class ItemStack(
nbt.getAndRemove(DISPLAY_TAG)?.compoundCast()?.let { nbt.getAndRemove(DISPLAY_TAG)?.compoundCast()?.let {
it.getAndRemove(DISPLAY_MAME_TAG).nullCast<String>()?.let { nameTag -> it.getAndRemove(DISPLAY_MAME_TAG).nullCast<String>()?.let { nameTag ->
customDisplayName = ChatComponent.of(nameTag, translator = connection?.version?.language) customDisplayName = ChatComponent.of(nameTag, translator = connection?.language)
} }
it.getAndRemove(DISPLAY_LORE_TAG)?.listCast<String>()?.let { loreTag -> it.getAndRemove(DISPLAY_LORE_TAG)?.listCast<String>()?.let { loreTag ->
for (lore in 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 } it.getAndRemove(DISPLAY_COLOR_TAG)?.toInt()?.asRGBColor().let { color -> this.dyedColor = color }
@ -280,7 +280,7 @@ class ItemStack(
get() { get() {
customDisplayName?.let { return it } customDisplayName?.let { return it }
item.translationKey?.let { item.translationKey?.let {
connection?.version?.language?.translate(it)?.let { translatedName -> connection?.language?.translate(it)?.let { translatedName ->
translatedName.applyDefaultColor(rarity.color) translatedName.applyDefaultColor(rarity.color)
return translatedName return translatedName
} }

View File

@ -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.ChatComponent
import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions 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.synchronizedListOf
import de.bixilon.minosoft.util.KUtil.tryCatch import de.bixilon.minosoft.util.KUtil.tryCatch
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.util.*
class LanguageManager( class LanguageManager(
private val languages: MutableList<Language> = synchronizedListOf(), private val languages: MutableList<Language> = synchronizedListOf(),
@ -50,7 +52,7 @@ class LanguageManager(
companion object { 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 val assetsManager = version?.assetsManager ?: Minosoft.MINOSOFT_ASSETS_MANAGER
fun loadMinecraftLanguage(language: String): Language { fun loadMinecraftLanguage(language: String): Language {
@ -77,8 +79,8 @@ class LanguageManager(
val languages: MutableList<Language> = mutableListOf() val languages: MutableList<Language> = mutableListOf()
if (language != "en_US") { if (language != Locale.US) {
tryCatch(FileNotFoundException::class.java, executor = { languages += loadMinecraftLanguage(language) }) tryCatch(FileNotFoundException::class.java, executor = { languages += loadMinecraftLanguage(language.fullName) })
} }
languages += loadMinecraftLanguage("en_US") languages += loadMinecraftLanguage("en_US")

View File

@ -16,6 +16,7 @@ package de.bixilon.minosoft.data.language
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.data.text.TextComponent
import java.util.*
class MultiLanguageManager( class MultiLanguageManager(
val translators: MutableMap<String, Translator> = mutableMapOf(), val translators: MutableMap<String, Translator> = mutableMapOf(),
@ -27,8 +28,12 @@ class MultiLanguageManager(
} }
override fun translate(key: ResourceLocation?, parent: TextComponent?, vararg data: Any?): ChatComponent { 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()}") return translators[key.namespace]?.translate(key, parent, *data) ?: ChatComponent.of("$key: ${data.contentToString()}")
} }
fun loadLanguage(language: Locale) {
}
} }

View File

@ -14,10 +14,8 @@ package de.bixilon.minosoft.data.registries.versions
import com.google.common.collect.HashBiMap import com.google.common.collect.HashBiMap
import de.bixilon.mbf.MBFBinaryReader import de.bixilon.mbf.MBFBinaryReader
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.data.assets.MinecraftAssetsManager import de.bixilon.minosoft.data.assets.MinecraftAssetsManager
import de.bixilon.minosoft.data.assets.Resources 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.data.registries.registries.Registries
import de.bixilon.minosoft.protocol.protocol.PacketTypes.C2S import de.bixilon.minosoft.protocol.protocol.PacketTypes.C2S
import de.bixilon.minosoft.protocol.protocol.PacketTypes.S2C import de.bixilon.minosoft.protocol.protocol.PacketTypes.S2C
@ -45,7 +43,6 @@ data class Version(
var isLoaded = false var isLoaded = false
val registries: Registries = Registries() val registries: Registries = Registries()
lateinit var assetsManager: MinecraftAssetsManager lateinit var assetsManager: MinecraftAssetsManager
lateinit var language: LanguageManager
fun getPacketById(state: ProtocolStates, command: Int): S2C? { fun getPacketById(state: ProtocolStates, command: Int): S2C? {
return s2CPacketMapping[state]?.inverse()?.get(command) return s2CPacketMapping[state]?.inverse()?.get(command)
@ -65,12 +62,10 @@ data class Version(
} }
if (!isFlattened() && versionId != ProtocolDefinition.PRE_FLATTENING_VERSION_ID) { if (!isFlattened() && versionId != ProtocolDefinition.PRE_FLATTENING_VERSION_ID) {
assetsManager = Versions.PRE_FLATTENING_VERSION.assetsManager assetsManager = Versions.PRE_FLATTENING_VERSION.assetsManager
language = Versions.PRE_FLATTENING_VERSION.language
return return
} }
assetsManager = MinecraftAssetsManager(Resources.getAssetVersionByVersion(this), Resources.getPixLyzerDataHashByVersion(this)) assetsManager = MinecraftAssetsManager(Resources.getAssetVersionByVersion(this), Resources.getPixLyzerDataHashByVersion(this))
assetsManager.downloadAllAssets(latch) assetsManager.downloadAllAssets(latch)
language = LanguageManager.load(Minosoft.config.config.general.language, this)
} }
@Synchronized @Synchronized
@ -141,13 +136,13 @@ data class Version(
if (super.equals(other)) { if (super.equals(other)) {
return true return true
} }
if (other == null) { if (other !is Version) {
return false return false
} }
return if (hashCode() != other.hashCode()) { return if (hashCode() != other.hashCode()) {
false false
} else { } else {
name == name this.name == other.name
} }
} }

View File

@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.data.assets.MultiAssetsManager import de.bixilon.minosoft.data.assets.MultiAssetsManager
import de.bixilon.minosoft.data.bossbar.BossbarManager import de.bixilon.minosoft.data.bossbar.BossbarManager
import de.bixilon.minosoft.data.commands.CommandRootNode 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.physics.CollisionDetector
import de.bixilon.minosoft.data.player.LocalPlayerEntity import de.bixilon.minosoft.data.player.LocalPlayerEntity
import de.bixilon.minosoft.data.player.tab.TabList import de.bixilon.minosoft.data.player.tab.TabList
@ -84,6 +85,7 @@ class PlayConnection(
lateinit var assetsManager: MultiAssetsManager lateinit var assetsManager: MultiAssetsManager
private set private set
val tags: MutableMap<ResourceLocation, Map<ResourceLocation, Tag<Any>>> = synchronizedMapOf() val tags: MutableMap<ResourceLocation, Map<ResourceLocation, Tag<Any>>> = synchronizedMapOf()
lateinit var language: LanguageManager
var commandRootNode: CommandRootNode? = null var commandRootNode: CommandRootNode? = null
@ -215,6 +217,7 @@ class PlayConnection(
fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.PRE)) fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.PRE))
version.load(latch) // ToDo: show gui loader version.load(latch) // ToDo: show gui loader
assetsManager = MultiAssetsManager(version.assetsManager, Minosoft.MINOSOFT_ASSETS_MANAGER) assetsManager = MultiAssetsManager(version.assetsManager, Minosoft.MINOSOFT_ASSETS_MANAGER)
language = LanguageManager.load(profiles.connection.language ?: profiles.eros.general.language, version)
registries.parentRegistries = version.registries registries.parentRegistries = version.registries
fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.POST)) fireEvent(RegistriesLoadEvent(this, registries, RegistriesLoadEvent.States.POST))
player = LocalPlayerEntity(account, this) player = LocalPlayerEntity(account, this)

View File

@ -14,8 +14,10 @@
package de.bixilon.minosoft.protocol.network.connection.play.clientsettings package de.bixilon.minosoft.protocol.network.connection.play.clientsettings
import de.bixilon.minosoft.config.profile.change.listener.SimpleChangeListener.Companion.listen 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.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.c2s.play.ClientSettingsC2SP import de.bixilon.minosoft.protocol.packets.c2s.play.ClientSettingsC2SP
import de.bixilon.minosoft.util.KUtil.fullName
class ClientSettingsManager( class ClientSettingsManager(
private val connection: PlayConnection, private val connection: PlayConnection,
@ -64,12 +66,13 @@ class ClientSettingsManager(
return return
} }
this.language = language this.language = language
connection.language = LanguageManager.load(language, connection.version)
sendClientSettings() sendClientSettings()
} }
fun sendClientSettings() { fun sendClientSettings() {
connection.sendPacket(ClientSettingsC2SP( connection.sendPacket(ClientSettingsC2SP(
locale = language.toString(), locale = language.fullName,
chatColors = connection.profiles.hud.chat.chatColors, chatColors = connection.profiles.hud.chat.chatColors,
viewDistance = connection.profiles.block.viewDistance, viewDistance = connection.profiles.block.viewDistance,
chatMode = connection.profiles.hud.chat.chatMode, chatMode = connection.profiles.hud.chat.chatMode,

View File

@ -69,7 +69,7 @@ class PlayInByteBuffer : InByteBuffer {
} }
override fun readChatComponent(): ChatComponent { override fun readChatComponent(): ChatComponent {
return ChatComponent.of(readString(), connection.version.language, null) return ChatComponent.of(readString(), connection.language, null)
} }
fun readParticle(): ParticleData { fun readParticle(): ParticleData {

View File

@ -555,4 +555,7 @@ object KUtil {
throw IOException("Could not move $tempFile to $destination!") throw IOException("Could not move $tempFile to $destination!")
} }
} }
val Locale.fullName: String
get() = language + "_" + country.ifEmpty { language.uppercase() }
} }