diff --git a/src/main/java/at/hannibal2/skyhanni/config/BritishSpellingWrapper.kt b/src/main/java/at/hannibal2/skyhanni/config/BritishSpellingWrapper.kt new file mode 100644 index 000000000000..8f7920de2eda --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/BritishSpellingWrapper.kt @@ -0,0 +1,103 @@ +package at.hannibal2.skyhanni.config + +import io.github.notenoughupdates.moulconfig.Config +import io.github.notenoughupdates.moulconfig.annotations.ConfigOption +import io.github.notenoughupdates.moulconfig.processor.ConfigProcessorDriver +import io.github.notenoughupdates.moulconfig.processor.ConfigStructureReader +import java.lang.reflect.Field +import java.lang.reflect.InvocationHandler +import java.lang.reflect.Method +import java.lang.reflect.Proxy + +abstract class RenamingWrapper(val wrappedProcessor: ConfigStructureReader) : ConfigStructureReader { + override fun pushPath(fieldPath: String?) { + wrappedProcessor.pushPath(fieldPath) + } + + override fun popPath() { + wrappedProcessor.popPath() + } + + override fun beginConfig( + configClass: Class?, + driver: ConfigProcessorDriver?, + configObject: Config? + ) { + wrappedProcessor.beginConfig(configClass, driver, configObject) + } + + override fun endConfig() { + wrappedProcessor.endConfig() + } + + override fun setCategoryParent(field: Field?) { + wrappedProcessor.setCategoryParent(field) + } + + fun wrapOption(option: ConfigOption): ConfigOption { + val originalHandler = Proxy.getInvocationHandler(option) + return Proxy.newProxyInstance( + option.javaClass.classLoader, + arrayOf>(ConfigOption::class.java), + object : InvocationHandler { + override fun invoke( + proxy: Any?, + method: Method, + args: Array? + ): Any? { + var proxyResult = originalHandler.invoke(proxy, method, args) + if (method.name == "name" || method.name == "desc") { + proxyResult = mapText(proxyResult as String) + } + return proxyResult + } + }) as ConfigOption + } + + abstract fun mapText(original: String): String + + override fun beginCategory( + baseObject: Any?, + field: Field?, + name: String, + description: String, + ) { + wrappedProcessor.beginCategory(baseObject, field, mapText(name), mapText(description)) + } + + override fun endCategory() { + wrappedProcessor.endCategory() + } + + override fun beginAccordion( + baseObject: Any?, + field: Field?, + option: ConfigOption, + id: Int, + ) { + wrappedProcessor.beginAccordion(baseObject, field, wrapOption(option), id) + } + + override fun endAccordion() { + wrappedProcessor.endAccordion() + } + + override fun emitOption( + baseObject: Any?, + field: Field?, + option: ConfigOption, + ) { + wrappedProcessor.emitOption(baseObject, field, wrapOption(option)) + } +} + +class BritishSpellingWrapper(wrappedProcessor: ConfigStructureReader) : RenamingWrapper(wrappedProcessor) { + override fun mapText(original: String): String { + return original.replace("(?i)(col)(o)(r)".toRegex()) { + it.groupValues[1] + + it.groupValues[2] + + (if (it.groupValues[2].single().isUpperCase()) "U" else "u") + + it.groupValues[3] + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigGuiManager.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigGuiManager.kt index c16f04843317..642c09a2f723 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigGuiManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigGuiManager.kt @@ -9,18 +9,38 @@ object ConfigGuiManager { var editor: MoulConfigEditor? = null + private val replacedSearchTerms = mapOf( "color" to "colour", + "colour" to "color", "armor" to "armour", + "armour" to "armor", "endermen" to "enderman", "enderman" to "endermen", "hotkey" to "keybind", - "gray" to "grey" + "keybind" to "hotkey", + "gray" to "grey", + "grey" to "gray", ) + private fun getPossibleAltWords(word: String): List { + return buildList { + replacedSearchTerms.forEach { first, second -> + if (first.startsWith(word, ignoreCase = true)) { + add(second) + } + + } + } + } + fun getEditorInstance() = editor ?: MoulConfigEditor(SkyHanniMod.configManager.processor).also { it.setSearchFunction { optionEditor, word -> - return@setSearchFunction optionEditor.fulfillsSearch(replacedSearchTerms[word] ?: word) + if (optionEditor.fulfillsSearch(word)) return@setSearchFunction true + getPossibleAltWords(word).forEach{ + if (optionEditor.fulfillsSearch(it)) return@setSearchFunction true + } + return@setSearchFunction false } editor = it } diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt index 24a3748c6340..b0a87f1224dd 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.config import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.core.config.Position import at.hannibal2.skyhanni.config.core.config.PositionList import at.hannibal2.skyhanni.data.jsonobjects.local.FriendsJson @@ -8,7 +9,9 @@ import at.hannibal2.skyhanni.data.jsonobjects.local.JacobContestsJson import at.hannibal2.skyhanni.data.jsonobjects.local.KnownFeaturesJson import at.hannibal2.skyhanni.data.jsonobjects.local.VisualWordsJson import at.hannibal2.skyhanni.events.LorenzEvent +import at.hannibal2.skyhanni.events.minecraft.LanguageChangeEvent import at.hannibal2.skyhanni.features.misc.update.UpdateManager +import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.DelayedRun @@ -26,6 +29,7 @@ import io.github.notenoughupdates.moulconfig.annotations.ConfigLink import io.github.notenoughupdates.moulconfig.processor.BuiltinMoulConfigGuis import io.github.notenoughupdates.moulconfig.processor.ConfigProcessorDriver import io.github.notenoughupdates.moulconfig.processor.MoulConfigProcessor +import net.minecraft.client.Minecraft import java.io.BufferedReader import java.io.BufferedWriter import java.io.File @@ -62,6 +66,7 @@ class ConfigManager { private val jsonHolder: Map = EnumMap(ConfigFileType::class.java) lateinit var processor: MoulConfigProcessor + private var hasBeenInited = false private var disableSaving = false private fun setConfigHolder(type: ConfigFileType, value: Any) { @@ -88,16 +93,35 @@ class ConfigManager { } val features = SkyHanniMod.feature - processor = MoulConfigProcessor(SkyHanniMod.feature) - BuiltinMoulConfigGuis.addProcessors(processor) - UpdateManager.injectConfigProcessor(processor) - ConfigProcessorDriver(processor).processConfig(features) + recreateProcessor() try { findPositionLinks(features, mutableSetOf()) } catch (e: Exception) { if (LorenzEvent.isInGuardedEventHandler) throw e } + hasBeenInited = true + } + + @SkyHanniModule + object LanguageManager { + @HandleEvent + fun onLanguageSwitch(event: LanguageChangeEvent) { + if (SkyHanniMod.configManager.hasBeenInited) { + SkyHanniMod.configManager.recreateProcessor() + ConfigGuiManager.editor = null + } + } + } + + fun recreateProcessor() { + processor = MoulConfigProcessor(SkyHanniMod.feature) + BuiltinMoulConfigGuis.addProcessors(processor) + UpdateManager.injectConfigProcessor(processor) + ConfigProcessorDriver( + if (Minecraft.getMinecraft().languageManager.currentLanguage.languageCode.contains("gb", ignoreCase = true)) + BritishSpellingWrapper(processor) else processor, + ).processConfig(SkyHanniMod.feature) } // Some position elements don't need config links as they don't have a config option. @@ -153,7 +177,7 @@ class ConfigManager { println("") println( "This crash is here to remind you to fix the missing " + - "@ConfigLink annotation over your new config position config element." + "@ConfigLink annotation over your new config position config element.", ) println("") println("Steps to fix:") diff --git a/src/main/java/at/hannibal2/skyhanni/events/minecraft/LanguageChangeEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/minecraft/LanguageChangeEvent.kt new file mode 100644 index 000000000000..89846b681da7 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/events/minecraft/LanguageChangeEvent.kt @@ -0,0 +1,6 @@ +package at.hannibal2.skyhanni.events.minecraft + +import at.hannibal2.skyhanni.api.event.SkyHanniEvent +import net.minecraft.client.resources.Language + +data class LanguageChangeEvent(val newLanguage: Language) : SkyHanniEvent() diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/LanguageChangeEventPatch.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/LanguageChangeEventPatch.java new file mode 100644 index 000000000000..c003bdad62d6 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/LanguageChangeEventPatch.java @@ -0,0 +1,17 @@ +package at.hannibal2.skyhanni.mixins.transformers; + +import at.hannibal2.skyhanni.events.minecraft.LanguageChangeEvent; +import net.minecraft.client.resources.Language; +import net.minecraft.client.resources.LanguageManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LanguageManager.class) +public class LanguageChangeEventPatch { + @Inject(method = "setCurrentLanguage", at = @At("TAIL")) + private void onLanguageSet(Language currentLanguageIn, CallbackInfo ci) { + new LanguageChangeEvent(currentLanguageIn).post(); + } +}